PoolImpl.h

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00012 #ifndef ZYPP_POOL_POOLIMPL_H
00013 #define ZYPP_POOL_POOLIMPL_H
00014 
00015 #include <iosfwd>
00016 #include <map>
00017 
00018 #include "zypp/pool/PoolTraits.h"
00019 #include "zypp/ResPoolProxy.h"
00020 #include "zypp/ZYppFactory.h"
00021 
00023 namespace zypp
00024 { 
00025 
00026   namespace pool
00027   { 
00028 
00029 
00031     //
00032     //  CLASS NAME : NameHash
00033     //
00035     class NameHash
00036     {
00037     public:
00039       NameHash();
00041       ~NameHash();
00042 
00043       public:
00044 
00045       typedef PoolTraits::ItemContainerT         ItemContainerT;
00046       typedef PoolTraits::NameItemContainerT     ContainerT;
00047       typedef PoolTraits::size_type              size_type;
00048       typedef PoolTraits::iterator               iterator;
00049       typedef PoolTraits::const_iterator         const_iterator;
00050 
00051       private:
00052         ItemContainerT & getItemContainer( const std::string & tag_r );
00053         const ItemContainerT & getConstItemContainer( const std::string & tag_r ) const;
00054 
00055       public:
00057       ContainerT & store()
00058       { return _store; }
00060       const ContainerT & store() const
00061       { return _store; }
00062 
00064       bool empty() const
00065       { return _store.empty(); }
00067       size_type size() const
00068       { return _store.size(); }
00069 
00071       iterator begin( const std::string & tag_r )
00072       { return getItemContainer( tag_r ).begin(); }
00074       const_iterator begin( const std::string & tag_r ) const
00075       { return getConstItemContainer( tag_r ).begin(); }
00076 
00078       iterator end( const std::string & tag_r )
00079       { return getItemContainer( tag_r ).end(); }
00081       const_iterator end( const std::string & tag_r ) const
00082       { return getConstItemContainer( tag_r ).end(); }
00083 
00085       void clear()
00086       { _store.clear(); }
00087 
00089       void insert( const PoolItem & item_r );
00091       void erase( const PoolItem & item_r );
00092 
00093       private:
00094         ContainerT _store;
00095         ItemContainerT _empty;  // for begin(), end() if tag_r can't be found
00096     };
00097 
00099     //
00100     //  CLASS NAME : CapHash
00101     //
00103     class CapHash
00104     {
00105     public:
00107       CapHash();
00109       ~CapHash();
00110 
00111       public:
00112 
00113       typedef PoolTraits::DepCapItemContainerT  ContainerT;
00114       typedef PoolTraits::capitemsize_type      size_type;
00115       typedef PoolTraits::capitemiterator       iterator;
00116       typedef PoolTraits::const_capitemiterator const_iterator;
00117 
00118       private:
00119 
00120       typedef PoolTraits::CapItemStoreT         CapItemStoreT;
00121       typedef PoolTraits::CapItemContainerT     CapItemContainerT;
00122 
00123       // Dep -> CapItemStoreT
00124       const CapItemStoreT & capItemStore ( Dep cap_r ) const;
00125 
00126       // CapItemStoreT, index -> CapItemContainerT
00127       const CapItemContainerT & capItemContainer( const CapItemStoreT & cis, const std::string & tag_r ) const;
00128 
00129       public:
00130 
00132       ContainerT & store()
00133       { return _store; }
00135       const ContainerT & store() const
00136       { return _store; }
00137 
00139       bool empty() const
00140       { return _store.empty(); }
00142       size_type size() const
00143       { return _store.size(); }
00144 
00146       iterator begin( const std::string & tag_r, Dep cap_r )
00147       { return _store[cap_r][tag_r].begin(); }
00149       const_iterator begin( const std::string & tag_r, Dep cap_r ) const
00150       { const CapItemStoreT & capitemstore = capItemStore( cap_r );
00151         const CapItemContainerT & capcontainer = capItemContainer ( capitemstore, tag_r );
00152         return capcontainer.begin(); }
00153 
00155       iterator end( const std::string & tag_r, Dep cap_r )
00156       { return _store[cap_r][tag_r].begin(); }
00158       const_iterator end( const std::string & tag_r, Dep cap_r ) const
00159       { const CapItemStoreT & capitemstore = capItemStore( cap_r );
00160         const CapItemContainerT & capcontainer = capItemContainer ( capitemstore, tag_r );
00161         return capcontainer.end(); }
00162 
00164       void clear()
00165       { _store.clear(); }
00166 
00168       void insert( const PoolItem & item_r );
00170       void erase( const PoolItem & item_r );
00171 
00172       private:
00173         PoolTraits::DepCapItemContainerT _store;
00174     };
00175 
00177     //
00178     //  CLASS NAME : PoolImpl
00179     //
00181     class PoolImpl
00182     {
00183       friend std::ostream & operator<<( std::ostream & str, const PoolImpl & obj );
00184 
00185     public:
00187     typedef PoolTraits::Item                    Item;
00188     typedef PoolTraits::ItemContainerT          ContainerT;
00189     typedef PoolTraits::iterator                iterator;
00190     typedef PoolTraits::const_iterator          const_iterator;
00191     typedef PoolTraits::size_type               size_type;
00192     typedef PoolTraits::Inserter                Inserter;
00193     typedef PoolTraits::Deleter                 Deleter;
00194     typedef PoolTraits::AdditionalCapSet        AdditionalCapSet;       
00195 
00196     public:
00198       PoolImpl();
00200       ~PoolImpl();
00201 
00203       Arch targetArch() const
00204       { return getZYpp()->architecture(); }
00205 
00206     public:
00208       ContainerT & store()
00209       { return _store; }
00211       const ContainerT & store() const
00212       { return _store; }
00213 
00215       bool empty() const
00216       { return _store.empty(); }
00218       size_type size() const
00219       { return _store.size(); }
00220 
00222       iterator begin()
00223       { return _store.begin(); }
00225       const_iterator begin() const
00226       { return _store.begin(); }
00227 
00229       iterator end()
00230       { return _store.end(); }
00232       const_iterator end() const
00233       { return _store.end(); }
00234 
00245         void setAdditionalRequire( const AdditionalCapSet & capset ) const
00246             { _additionalRequire = capset; }
00247         AdditionalCapSet & additionalRequire() const
00248             { return _additionalRequire; }
00249 
00258         void setAdditionalConflict( const AdditionalCapSet & capset ) const
00259             { _additionaConflict = capset; } 
00260         AdditionalCapSet & additionaConflict() const
00261             { return _additionaConflict; }
00262       
00272         void setAdditionalProvide( const AdditionalCapSet & capset ) const
00273             { _additionaProvide = capset; }
00274         AdditionalCapSet & additionaProvide() const
00275             { return _additionaProvide; }
00276 
00278       void clear()
00279       { _store.clear();
00280         _caphash.clear();
00281         _namehash.clear();
00282         _additionalRequire.clear();
00283         _additionaConflict.clear();
00284         _additionaProvide.clear();
00285 
00286         return;
00287       }
00288 
00290       void eraseInstalled() const;
00291 
00292     public:
00295       void SaveState( const ResObject::Kind & kind_r );
00296 
00297       void RestoreState( const ResObject::Kind & kind_r );
00299 
00300     public:
00302       ContainerT _store;
00303       NameHash _namehash;
00304       CapHash _caphash;
00305       mutable AdditionalCapSet _additionalRequire;
00306       mutable AdditionalCapSet _additionaConflict;
00307       mutable AdditionalCapSet _additionaProvide;
00308 
00309     public:
00310       ResPoolProxy proxy( ResPool self ) const
00311       {
00312         if ( !_poolProxy )
00313           _poolProxy.reset( new ResPoolProxy( self ) );
00314         return *_poolProxy;
00315       }
00316       void invalidateProxy()
00317       { _poolProxy.reset(); }
00318 
00319       mutable shared_ptr<ResPoolProxy> _poolProxy;
00320     };
00322 
00324     std::ostream & operator<<( std::ostream & str, const PoolImpl & obj );
00325 
00327   } // namespace pool
00330 } // namespace zypp
00332 #endif // ZYPP_POOL_POOLIMPL_H

Generated on Tue Nov 28 16:49:30 2006 for zypp by  doxygen 1.5.0