00001
00002
00003
00004
00005
00006
00007
00008
00012 #include <iostream>
00013 #include "zypp/base/LogTools.h"
00014
00015 #include "zypp/base/Iterator.h"
00016 #include "zypp/base/Algorithm.h"
00017 #include "zypp/base/Functional.h"
00018
00019 #include "zypp/ResPoolProxy.h"
00020 #include "zypp/pool/PoolImpl.h"
00021 #include "zypp/ui/SelectableImpl.h"
00022
00023 using std::endl;
00024
00026 namespace zypp
00027 {
00028
00030 struct PoolItemSaver
00031 {
00032 void saveState( ResPool pool_r )
00033 {
00034 std::for_each( pool_r.begin(), pool_r.end(),
00035 std::mem_fun_ref(&PoolItem::saveState) );
00036 }
00037
00038 void saveState( ResPool pool_r, const ResKind & kind_r )
00039 {
00040 std::for_each( pool_r.byKindBegin(kind_r), pool_r.byKindEnd(kind_r),
00041 std::mem_fun_ref(&PoolItem::saveState) );
00042 }
00043
00044 void restoreState( ResPool pool_r )
00045 {
00046 std::for_each( pool_r.begin(), pool_r.end(),
00047 std::mem_fun_ref(&PoolItem::restoreState) );
00048 }
00049
00050 void restoreState( ResPool pool_r, const ResKind & kind_r )
00051 {
00052 std::for_each( pool_r.byKindBegin(kind_r), pool_r.byKindEnd(kind_r),
00053 std::mem_fun_ref(&PoolItem::restoreState) );
00054 }
00055
00056 bool diffState( ResPool pool_r ) const
00057 {
00058
00059 return( invokeOnEach( pool_r.begin(), pool_r.end(),
00060 std::mem_fun_ref(&PoolItem::sameState) ) < 0 );
00061 }
00062
00063 bool diffState( ResPool pool_r, const ResKind & kind_r ) const
00064 {
00065
00066 return( invokeOnEach( pool_r.byKindBegin(kind_r), pool_r.byKindEnd(kind_r),
00067 std::mem_fun_ref(&PoolItem::sameState) ) < 0 );
00068 }
00069 };
00070
00071 namespace
00072 {
00073 ui::Selectable::Ptr makeSelectablePtr( pool::PoolImpl::Id2ItemT::const_iterator begin_r,
00074 pool::PoolImpl::Id2ItemT::const_iterator end_r )
00075 {
00076 pool::PoolTraits::byIdent_iterator begin( begin_r, pool::PoolTraits::Id2ItemValueSelector() );
00077 pool::PoolTraits::byIdent_iterator end( end_r, pool::PoolTraits::Id2ItemValueSelector() );
00078 sat::Solvable solv( begin->satSolvable() );
00079
00080 return new ui::Selectable( ui::Selectable::Impl_Ptr( new ui::Selectable::Impl( solv.kind(), solv.name(), begin, end ) ) );
00081 }
00082 }
00083
00085
00086
00087
00091 struct ResPoolProxy::Impl
00092 {
00093 friend std::ostream & operator<<( std::ostream & str, const Impl & obj );
00094 friend std::ostream & dumpOn( std::ostream & str, const Impl & obj );
00095
00096 typedef std::tr1::unordered_map<sat::detail::IdType,ui::Selectable::Ptr> SelectableIndex;
00097 typedef ResPoolProxy::const_iterator const_iterator;
00098
00099 public:
00100 Impl()
00101 :_pool( ResPool::instance() )
00102 {}
00103
00104 Impl( ResPool pool_r, const pool::PoolImpl & poolImpl_r )
00105 : _pool( pool_r )
00106 {
00107 const pool::PoolImpl::Id2ItemT & id2item( poolImpl_r.id2item() );
00108 if ( ! id2item.empty() )
00109 {
00110
00111 pool::PoolImpl::Id2ItemT::const_iterator cbegin = id2item.begin();
00112
00113 for_( it, id2item.begin(), id2item.end() )
00114 {
00115 if ( it->first != cbegin->first )
00116 {
00117
00118 ui::Selectable::Ptr p( makeSelectablePtr( cbegin, it ) );
00119 _selPool.insert( SelectablePool::value_type( p->kind(), p ) );
00120 _selIndex[cbegin->first] = p;
00121
00122 cbegin = it;
00123 }
00124 }
00125
00126 ui::Selectable::Ptr p( makeSelectablePtr( cbegin, id2item.end() ) );
00127 _selPool.insert( SelectablePool::value_type( p->kind(), p ) );
00128 _selIndex[cbegin->first] = p;
00129 }
00130 }
00131
00132 public:
00133 ui::Selectable::Ptr lookup( const pool::ByIdent & ident_r ) const
00134 {
00135 SelectableIndex::const_iterator it( _selIndex.find( ident_r.get() ) );
00136 if ( it != _selIndex.end() )
00137 return it->second;
00138 return ui::Selectable::Ptr();
00139 }
00140
00141 public:
00142 bool empty() const
00143 { return _selPool.empty(); }
00144
00145 size_type size() const
00146 { return _selPool.size(); }
00147
00148 const_iterator begin() const
00149 { return make_map_value_begin( _selPool ); }
00150
00151 const_iterator end() const
00152 { return make_map_value_end( _selPool ); }
00153
00154 public:
00155 bool empty( const ResKind & kind_r ) const
00156 { return( _selPool.count( kind_r ) == 0 ); }
00157
00158 size_type size( const ResKind & kind_r ) const
00159 { return _selPool.count( kind_r ); }
00160
00161 const_iterator byKindBegin( const ResKind & kind_r ) const
00162 { return make_map_value_lower_bound( _selPool, kind_r ); }
00163
00164 const_iterator byKindEnd( const ResKind & kind_r ) const
00165 { return make_map_value_upper_bound( _selPool, kind_r ); }
00166
00167 public:
00168 size_type knownRepositoriesSize() const
00169 { return _pool.knownRepositoriesSize(); }
00170
00171 repository_iterator knownRepositoriesBegin() const
00172 { return _pool.knownRepositoriesBegin(); }
00173
00174 repository_iterator knownRepositoriesEnd() const
00175 { return _pool.knownRepositoriesEnd(); }
00176
00177 public:
00178
00179 void saveState() const
00180 { PoolItemSaver().saveState( _pool ); }
00181
00182 void saveState( const ResKind & kind_r ) const
00183 { PoolItemSaver().saveState( _pool, kind_r ); }
00184
00185 void restoreState() const
00186 { PoolItemSaver().restoreState( _pool ); }
00187
00188 void restoreState( const ResKind & kind_r ) const
00189 { PoolItemSaver().restoreState( _pool, kind_r ); }
00190
00191 bool diffState() const
00192 { return PoolItemSaver().diffState( _pool ); }
00193
00194 bool diffState( const ResKind & kind_r ) const
00195 { return PoolItemSaver().diffState( _pool, kind_r ); }
00196
00197 private:
00198 ResPool _pool;
00199 mutable SelectablePool _selPool;
00200 mutable SelectableIndex _selIndex;
00201
00202 public:
00204 static shared_ptr<Impl> nullimpl()
00205 {
00206 static shared_ptr<Impl> _nullimpl( new Impl );
00207 return _nullimpl;
00208 }
00209 };
00211
00213 inline std::ostream & operator<<( std::ostream & str, const ResPoolProxy::Impl & obj )
00214 {
00215 return str << "ResPoolProxy (" << obj._pool.serial() << ") [" << obj._pool.size()
00216 << "solv/" << obj.size()<< "sel]";
00217 }
00218
00219 namespace detail
00220 {
00221 struct DumpFilter
00222 {
00223 bool operator()( const ui::Selectable::Ptr & selp ) const
00224 { return selp->toModify(); }
00225 };
00226 }
00227
00229 inline std::ostream & dumpOn( std::ostream & str, const ResPoolProxy::Impl & obj )
00230 {
00231 detail::DumpFilter f;
00232 return dumpRange( str << obj << " toModify: ",
00233 make_filter_begin( f, obj ),
00234 make_filter_end( f, obj ) );
00235 }
00236
00238
00239
00240
00242
00244
00245
00246
00247
00248 ResPoolProxy::ResPoolProxy()
00249 : _pimpl( Impl::nullimpl() )
00250 {}
00251
00253
00254
00255
00256
00257 ResPoolProxy::ResPoolProxy( ResPool pool_r, const pool::PoolImpl & poolImpl_r )
00258 : _pimpl( new Impl( pool_r, poolImpl_r ) )
00259 {}
00260
00262
00263
00264
00265
00266 ResPoolProxy::~ResPoolProxy()
00267 {}
00268
00270
00271
00272
00274
00275 ui::Selectable::Ptr ResPoolProxy::lookup( const pool::ByIdent & ident_r ) const
00276 { return _pimpl->lookup( ident_r ); }
00277
00278 bool ResPoolProxy::empty() const
00279 { return _pimpl->empty(); }
00280
00281 ResPoolProxy::size_type ResPoolProxy::size() const
00282 { return _pimpl->size(); }
00283
00284 ResPoolProxy::const_iterator ResPoolProxy::begin() const
00285 { return _pimpl->begin(); }
00286
00287 ResPoolProxy::const_iterator ResPoolProxy::end() const
00288 { return _pimpl->end(); }
00289
00290 bool ResPoolProxy::empty( const ResKind & kind_r ) const
00291 { return _pimpl->empty( kind_r ); }
00292
00293 ResPoolProxy::size_type ResPoolProxy::size( const ResKind & kind_r ) const
00294 { return _pimpl->size( kind_r ); }
00295
00296 ResPoolProxy::const_iterator ResPoolProxy::byKindBegin( const ResKind & kind_r ) const
00297 { return _pimpl->byKindBegin( kind_r ); }
00298
00299 ResPoolProxy::const_iterator ResPoolProxy::byKindEnd( const ResKind & kind_r ) const
00300 { return _pimpl->byKindEnd( kind_r ); }
00301
00302 ResPoolProxy::size_type ResPoolProxy::knownRepositoriesSize() const
00303 { return _pimpl->knownRepositoriesSize(); }
00304
00305 ResPoolProxy::repository_iterator ResPoolProxy::knownRepositoriesBegin() const
00306 { return _pimpl->knownRepositoriesBegin(); }
00307
00308 ResPoolProxy::repository_iterator ResPoolProxy::knownRepositoriesEnd() const
00309 { return _pimpl->knownRepositoriesEnd(); }
00310
00311 void ResPoolProxy::saveState() const
00312 { _pimpl->saveState(); }
00313
00314 void ResPoolProxy::saveState( const ResKind & kind_r ) const
00315 { _pimpl->saveState( kind_r ); }
00316
00317 void ResPoolProxy::restoreState() const
00318 { _pimpl->restoreState(); }
00319
00320 void ResPoolProxy::restoreState( const ResKind & kind_r ) const
00321 { _pimpl->restoreState( kind_r ); }
00322
00323 bool ResPoolProxy::diffState() const
00324 { return _pimpl->diffState(); }
00325
00326 bool ResPoolProxy::diffState( const ResKind & kind_r ) const
00327 { return _pimpl->diffState( kind_r ); }
00328
00329 std::ostream & operator<<( std::ostream & str, const ResPoolProxy & obj )
00330 { return str << *obj._pimpl; }
00331
00332 std::ostream & dumpOn( std::ostream & str, const ResPoolProxy & obj )
00333 { return dumpOn( str, *obj._pimpl ); }
00334
00336 }