SolvIterMixin.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 #ifndef ZYPP_SAT_SOLVITERMIXIN_H
00013 #define ZYPP_SAT_SOLVITERMIXIN_H
00014
00015 #include <iosfwd>
00016
00017 #include "zypp/base/PtrTypes.h"
00018 #include "zypp/base/Iterator.h"
00019 #include "zypp/base/Tr1hash.h"
00020
00021 #include "zypp/sat/Solvable.h"
00022
00024 namespace zypp
00025 {
00026
00027 class PoolItem;
00028 class asPoolItem;
00029
00030 namespace ui
00031 {
00032 class asSelectable;
00033 }
00034
00036 namespace sat
00037 {
00038
00039 class Solvable;
00040 class asSolvable;
00041
00042 namespace solvitermixin_detail
00043 {
00049 struct UnifyByIdent
00050 {
00051 bool operator()( const Solvable & solv_r ) const;
00052
00053 typedef std::tr1::unordered_set<unsigned> Uset;
00054 UnifyByIdent()
00055 : _uset( new Uset )
00056 {}
00057 shared_ptr<Uset> _uset;
00058 };
00059
00060
00061 }
00062
00063
00065
00066
00067
00121 template <class Derived,class DerivedSolvable_iterator>
00122 class SolvIterMixin
00123 {
00124 public:
00125 typedef size_t size_type;
00126
00127 public:
00134 bool empty() const
00135 { return( self().begin() == self().end() ); }
00136
00138 size_type size() const
00139 { size_type s = 0; for_( it, self().begin(), self().end() ) ++s; return s;}
00140
00142 template<class _Solv>
00143 bool contains( const _Solv & solv_r ) const
00144 {
00145 Solvable solv( asSolvable()( solv_r ) );
00146 for_( it, self().begin(), self().end() )
00147 if ( *it == solv )
00148 return true;
00149 return false;
00150 }
00152
00153 public:
00156 typedef DerivedSolvable_iterator Solvable_iterator;
00157 Solvable_iterator solvableBegin() const
00158 { return self().begin(); }
00159 Solvable_iterator solvableEnd() const
00160 { return self().end(); }
00162
00165 typedef transform_iterator<asPoolItem,Solvable_iterator> PoolItem_iterator;
00166 PoolItem_iterator poolItemBegin() const
00167 { return make_transform_iterator( solvableBegin(), asPoolItem() ); }
00168 PoolItem_iterator poolItemEnd() const
00169 { return make_transform_iterator( solvableEnd(), asPoolItem() ); }
00171
00172 private:
00173 typedef filter_iterator<solvitermixin_detail::UnifyByIdent,Solvable_iterator> UnifiedSolvable_iterator;
00174 public:
00177 typedef transform_iterator<ui::asSelectable,UnifiedSolvable_iterator> Selectable_iterator;
00178 Selectable_iterator selectableBegin() const
00179 { return make_transform_iterator( unifiedSolvableBegin(), ui::asSelectable() ); }
00180 Selectable_iterator selectableEnd() const
00181 { return make_transform_iterator( unifiedSolvableEnd(), ui::asSelectable() ); }
00183
00184 private:
00187 UnifiedSolvable_iterator unifiedSolvableBegin() const
00188 { return make_filter_iterator( solvitermixin_detail::UnifyByIdent(), solvableBegin(), solvableEnd() ); }
00189 UnifiedSolvable_iterator unifiedSolvableEnd() const
00190 { return make_filter_iterator( solvitermixin_detail::UnifyByIdent(), solvableEnd(), solvableEnd() );; }
00192 private:
00193 const Derived & self() const
00194 { return *static_cast<const Derived*>( this ); }
00195 protected:
00196 SolvIterMixin() {}
00197 ~SolvIterMixin() {}
00198 SolvIterMixin(const SolvIterMixin &) {}
00199 void operator=(const SolvIterMixin &) {}
00200 };
00202
00204 }
00207 }
00209 #endif // ZYPP_SAT_SOLVITERMIXIN_H