1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/ResPoolProxy.h
12 #ifndef ZYPP_RESPOOLPROXY_H
13 #define ZYPP_RESPOOLPROXY_H
17 #include "zypp/base/PtrTypes.h"
19 #include "zypp/ResPool.h"
20 #include "zypp/ui/Selectable.h"
21 #include "zypp/ui/SelFilters.h"
23 ///////////////////////////////////////////////////////////////////
25 { /////////////////////////////////////////////////////////////////
27 ///////////////////////////////////////////////////////////////////
29 // CLASS NAME : ResPoolProxy
31 /** ResPool::instance().proxy();
32 * \todo integrate it into ResPool
36 friend std::ostream & operator<<( std::ostream & str, const ResPoolProxy & obj );
37 friend std::ostream & dumpOn( std::ostream & str, const ResPoolProxy & obj );
38 typedef std::multimap<ResKind,ui::Selectable::Ptr> SelectablePool;
44 typedef MapKVIteratorTraits<SelectablePool>::Value_const_iterator const_iterator;
45 typedef SelectablePool::size_type size_type;
47 typedef ResPool::repository_iterator repository_iterator;
51 /** Default ctor: no pool
52 * Nonempty proxies are provided by \ref ResPool.
53 * \see \ref ResPool::proxy
55 * ResPoolProxy p( ResPool::instance().proxy() );
64 /** \name Lookup individual Selectables. */
66 ui::Selectable::Ptr lookup( const pool::ByIdent & ident_r ) const;
68 ui::Selectable::Ptr lookup( IdString ident_r ) const
69 { return lookup( pool::ByIdent( ident_r ) ); }
71 ui::Selectable::Ptr lookup( ResKind kind_r, const std::string & name_r ) const
72 { return lookup( pool::ByIdent( kind_r, name_r ) ); }
74 ui::Selectable::Ptr lookup( const sat::Solvable & solv_r ) const
75 { return lookup( pool::ByIdent( solv_r ) ); }
77 ui::Selectable::Ptr lookup( const ResObject::constPtr & resolvable_r ) const
78 { return resolvable_r ? lookup( resolvable_r->satSolvable() ) : ui::Selectable::Ptr(); }
80 ui::Selectable::Ptr lookup( const PoolItem & pi_r ) const
81 { return lookup( pi_r.satSolvable() ); }
85 /** \name Iterate through all Selectables of a all kind. */
88 size_type size() const;
89 const_iterator begin() const;
90 const_iterator end() const;
93 /** \name Iterate through all Selectables of a certain kind. */
95 /** True if there are items of a certain kind. */
96 bool empty( const ResKind & kind_r ) const;
100 { return empty( ResTraits<TRes>::kind ); }
102 /** Number of Items of a certain kind. */
103 size_type size( const ResKind & kind_r ) const;
106 size_type size() const
107 { return size( ResTraits<TRes>::kind ); }
109 const_iterator byKindBegin( const ResKind & kind_r ) const;
112 const_iterator byKindBegin() const
113 { return byKindBegin( ResTraits<TRes>::kind ); }
116 const_iterator byKindEnd( const ResKind & kind_r ) const;
119 const_iterator byKindEnd() const
120 { return byKindEnd( ResTraits<TRes>::kind ); }
123 Iterable<const_iterator> byKind( const ResKind & kind_r ) const
124 { return makeIterable( byKindBegin( kind_r ), byKindEnd( kind_r ) ); }
127 Iterable<const_iterator> byKind() const
128 { return makeIterable( byKindBegin<TRes>(), byKindEnd<TRes>() ); }
133 /** \name Iterate through all Repositories that contribute ResObjects.
136 size_type knownRepositoriesSize() const;
138 repository_iterator knownRepositoriesBegin() const;
140 repository_iterator knownRepositoriesEnd() const;
142 Iterable<repository_iterator> knownRepositories() const
143 { return makeIterable( knownRepositoriesBegin(), knownRepositoriesEnd() ); }
147 /** Test whether there is at least one ui::Selectable with
148 * an installed object.
150 bool hasInstalledObj( const ResKind & kind_r ) const
152 return( make_begin<ui::selfilter::ByHasInstalledObj>( kind_r )
153 != make_end<ui::selfilter::ByHasInstalledObj>( kind_r ) );
157 bool hasInstalledObj() const
158 { return hasInstalledObj( ResTraits<TRes>::kind ); }
161 /** \name Save and restore state per kind of resolvable.
162 * Simple version, no safety net. So don't restore or diff,
163 * if you didn't save before.
165 * Diff returns true, if current stat differs from the saved
168 * Use \ref scopedSaveState for exception safe scoped save/restore
171 void saveState() const;
173 void saveState( const ResKind & kind_r ) const;
176 void saveState() const
177 { return saveState( ResTraits<TRes>::kind ); }
179 void restoreState() const;
181 void restoreState( const ResKind & kind_r ) const;
184 void restoreState() const
185 { return restoreState( ResTraits<TRes>::kind ); }
187 bool diffState() const;
189 bool diffState( const ResKind & kind_r ) const;
192 bool diffState() const
193 { return diffState( ResTraits<TRes>::kind ); }
196 * \class ScopedSaveState
197 * \brief Exception safe scoped save/restore state.
198 * Call \ref acceptState to prevent the class from restoring
199 * the remembered state.
202 struct ScopedSaveState;
204 ScopedSaveState scopedSaveState() const;
206 ScopedSaveState scopedSaveState( const ResKind & kind_r ) const;
209 ScopedSaveState && scopedSaveState() const
210 { return scopedSaveState( ResTraits<TRes>::kind ); }
215 template<class TFilter>
216 filter_iterator<TFilter,const_iterator>
217 make_begin( TFilter filter_r, const ResKind & kind_r ) const
219 return make_filter_iterator( filter_r,
223 template<class TFilter>
224 filter_iterator<TFilter,const_iterator>
225 make_begin( const ResKind & kind_r ) const
227 return make_begin( TFilter(), kind_r );
231 template<class TFilter>
232 filter_iterator<TFilter,const_iterator>
233 make_end( TFilter filter_r, const ResKind & kind_r ) const
235 return make_filter_iterator( filter_r,
239 template<class TFilter>
240 filter_iterator<TFilter,const_iterator>
241 make_end( const ResKind & kind_r ) const
243 return make_end( TFilter(), kind_r );
247 friend class pool::PoolImpl;
249 ResPoolProxy( ResPool pool_r, const pool::PoolImpl & poolImpl_r );
250 /** Pointer to implementation */
251 RW_pointer<Impl> _pimpl;
253 ///////////////////////////////////////////////////////////////////
255 /** \relates ResPoolProxy Stream output */
256 std::ostream & operator<<( std::ostream & str, const ResPoolProxy & obj );
258 /** \relates ResPoolProxy Verbose stream output */
259 std::ostream & dumpOn( std::ostream & str, const ResPoolProxy & obj );
261 ///////////////////////////////////////////////////////////////////
263 struct ResPoolProxy::ScopedSaveState
265 NON_COPYABLE_BUT_MOVE( ScopedSaveState );
267 ScopedSaveState( const ResPoolProxy & pool_r )
268 : _pimpl( new Impl( pool_r ) )
269 { _pimpl->saveState(); }
271 ScopedSaveState( const ResPoolProxy & pool_r, const ResKind & kind_r )
272 : _pimpl( new Impl( pool_r, kind_r ) )
273 { _pimpl->saveState(); }
276 { if ( _pimpl ) _pimpl->restoreState(); }
284 Impl( const ResPoolProxy & pool_r )
287 Impl( const ResPoolProxy & pool_r, const ResKind & kind_r )
288 : _pool( pool_r ), _kind( new ResKind( kind_r ) )
291 { if ( _kind ) _pool.saveState( *_kind ); else _pool.saveState(); }
293 { if ( _kind ) _pool.restoreState( *_kind ); else _pool.restoreState(); }
295 scoped_ptr<ResKind> _kind;
298 std::unique_ptr<Impl> _pimpl;
301 inline ResPoolProxy::ScopedSaveState ResPoolProxy::scopedSaveState() const
302 { return ScopedSaveState( *this ); }
304 inline ResPoolProxy::ScopedSaveState ResPoolProxy::scopedSaveState( const ResKind & kind_r ) const
305 { return ScopedSaveState( *this, kind_r ); }
307 /////////////////////////////////////////////////////////////////
309 ///////////////////////////////////////////////////////////////////
310 #endif // ZYPP_RESPOOLPROXY_H