1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/pool/PoolImpl.h
12 #ifndef ZYPP_POOL_POOLIMPL_H
13 #define ZYPP_POOL_POOLIMPL_H
18 #include "zypp/pool/PoolTraits.h"
19 #include "zypp/ResPoolProxy.h"
20 #include "zypp/ZYppFactory.h"
22 ///////////////////////////////////////////////////////////////////
24 { /////////////////////////////////////////////////////////////////
25 ///////////////////////////////////////////////////////////////////
27 { /////////////////////////////////////////////////////////////////
30 ///////////////////////////////////////////////////////////////////
32 // CLASS NAME : NameHash
45 typedef PoolTraits::ItemContainerT ItemContainerT;
46 typedef PoolTraits::NameItemContainerT ContainerT;
47 typedef PoolTraits::size_type size_type;
48 typedef PoolTraits::iterator iterator;
49 typedef PoolTraits::const_iterator const_iterator;
52 ItemContainerT & getItemContainer( const std::string & tag_r );
53 const ItemContainerT & getConstItemContainer( const std::string & tag_r ) const;
60 const ContainerT & store() const
65 { return _store.empty(); }
67 size_type size() const
68 { return _store.size(); }
71 iterator begin( const std::string & tag_r )
72 { return getItemContainer( tag_r ).begin(); }
74 const_iterator begin( const std::string & tag_r ) const
75 { return getConstItemContainer( tag_r ).begin(); }
78 iterator end( const std::string & tag_r )
79 { return getItemContainer( tag_r ).end(); }
81 const_iterator end( const std::string & tag_r ) const
82 { return getConstItemContainer( tag_r ).end(); }
89 void insert( const PoolItem & item_r );
91 void erase( const PoolItem & item_r );
95 ItemContainerT _empty; // for begin(), end() if tag_r can't be found
98 ///////////////////////////////////////////////////////////////////
100 // CLASS NAME : CapHash
113 typedef PoolTraits::DepCapItemContainerT ContainerT;
114 typedef PoolTraits::capitemsize_type size_type;
115 typedef PoolTraits::capitemiterator iterator;
116 typedef PoolTraits::const_capitemiterator const_iterator;
120 typedef PoolTraits::CapItemStoreT CapItemStoreT;
121 typedef PoolTraits::CapItemContainerT CapItemContainerT;
123 // Dep -> CapItemStoreT
124 const CapItemStoreT & capItemStore ( Dep cap_r ) const;
126 // CapItemStoreT, index -> CapItemContainerT
127 const CapItemContainerT & capItemContainer( const CapItemStoreT & cis, const std::string & tag_r ) const;
135 const ContainerT & store() const
140 { return _store.empty(); }
142 size_type size() const
143 { return _store.size(); }
146 iterator begin( const std::string & tag_r, Dep cap_r )
147 { return _store[cap_r][tag_r].begin(); }
149 const_iterator begin( const std::string & tag_r, Dep cap_r ) const
150 { const CapItemStoreT & capitemstore = capItemStore( cap_r );
151 const CapItemContainerT & capcontainer = capItemContainer ( capitemstore, tag_r );
152 return capcontainer.begin(); }
155 iterator end( const std::string & tag_r, Dep cap_r )
156 { return _store[cap_r][tag_r].begin(); }
158 const_iterator end( const std::string & tag_r, Dep cap_r ) const
159 { const CapItemStoreT & capitemstore = capItemStore( cap_r );
160 const CapItemContainerT & capcontainer = capItemContainer ( capitemstore, tag_r );
161 return capcontainer.end(); }
168 void insert( const PoolItem & item_r );
170 void erase( const PoolItem & item_r );
173 PoolTraits::DepCapItemContainerT _store;
176 ///////////////////////////////////////////////////////////////////
178 // CLASS NAME : PoolImpl
183 friend std::ostream & operator<<( std::ostream & str, const PoolImpl & obj );
187 typedef PoolTraits::Item Item;
188 typedef PoolTraits::ItemContainerT ContainerT;
189 typedef PoolTraits::iterator iterator;
190 typedef PoolTraits::const_iterator const_iterator;
191 typedef PoolTraits::size_type size_type;
192 typedef PoolTraits::Inserter Inserter;
193 typedef PoolTraits::Deleter Deleter;
194 typedef PoolTraits::AdditionalCapSet AdditionalCapSet;
202 /** \todo no poll, but make ZYpp distribute it. */
203 Arch targetArch() const
204 { return getZYpp()->architecture(); }
211 const ContainerT & store() const
216 { return _store.empty(); }
218 size_type size() const
219 { return _store.size(); }
223 { return _store.begin(); }
225 const_iterator begin() const
226 { return _store.begin(); }
230 { return _store.end(); }
232 const_iterator end() const
233 { return _store.end(); }
236 * Handling additional requirement. E.G. need package "foo" and package
237 * "foo1" which has a greater version than 1.0:
240 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
241 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo1 > 1.0"));
243 * setAdditionalRequire( capset );
245 void setAdditionalRequire( const AdditionalCapSet & capset ) const
246 { _additionalRequire = capset; }
247 AdditionalCapSet & additionalRequire() const
248 { return _additionalRequire; }
251 * Handling additional conflicts. E.G. do not install anything which provides "foo":
254 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
256 * setAdditionalConflict( capset );
258 void setAdditionalConflict( const AdditionalCapSet & capset ) const
259 { _additionaConflict = capset; }
260 AdditionalCapSet & additionaConflict() const
261 { return _additionaConflict; }
264 * Handling additional provides. This is used for ignoring a requirement.
265 * e.G. Do ignore the requirement "foo":
268 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
270 * setAdditionalProvide( cap );
272 void setAdditionalProvide( const AdditionalCapSet & capset ) const
273 { _additionaProvide = capset; }
274 AdditionalCapSet & additionaProvide() const
275 { return _additionaProvide; }
282 _additionalRequire.clear();
283 _additionaConflict.clear();
284 _additionaProvide.clear();
289 /** erase all resolvables coming from the target */
290 void eraseInstalled() const;
293 /** \name Save and restore state. */
295 void SaveState( const ResObject::Kind & kind_r );
297 void RestoreState( const ResObject::Kind & kind_r );
305 mutable AdditionalCapSet _additionalRequire;
306 mutable AdditionalCapSet _additionaConflict;
307 mutable AdditionalCapSet _additionaProvide;
310 ResPoolProxy proxy( ResPool self ) const
313 _poolProxy.reset( new ResPoolProxy( self ) );
316 void invalidateProxy()
317 { _poolProxy.reset(); }
319 mutable shared_ptr<ResPoolProxy> _poolProxy;
321 ///////////////////////////////////////////////////////////////////
323 /** \relates PoolImpl Stream output */
324 std::ostream & operator<<( std::ostream & str, const PoolImpl & obj );
326 /////////////////////////////////////////////////////////////////
328 ///////////////////////////////////////////////////////////////////
329 /////////////////////////////////////////////////////////////////
331 ///////////////////////////////////////////////////////////////////
332 #endif // ZYPP_POOL_POOLIMPL_H