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
1.5.0