libzypp  10.5.0
LookupAttrTools.h
Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00012 #ifndef ZYPP_SAT_LOOKUPATTRTOOLS_H
00013 #define ZYPP_SAT_LOOKUPATTRTOOLS_H
00014 
00015 #include "zypp/sat/LookupAttr.h"
00016 #include "zypp/Repository.h"
00017 
00019 namespace zypp
00020 { 
00021 
00022   namespace sat
00023   { 
00024 
00026     //
00027     //  CLASS NAME : LookupAttr::transformIterator
00028     //
00055     template<class _ResultT, class _AttrT>
00056     class LookupAttr::transformIterator : public boost::iterator_adaptor<
00057           transformIterator<_ResultT,_AttrT> // Derived
00058           , LookupAttr::iterator         // Base
00059           , _ResultT                     // Value
00060           , boost::forward_traversal_tag // CategoryOrTraversal
00061           , _ResultT                     // Reference
00062     >
00063     {
00064       public:
00065         transformIterator()
00066         {}
00067 
00068         explicit
00069         transformIterator( const LookupAttr::iterator & val_r )
00070         { this->base_reference() = val_r; }
00071 
00072       public:
00073 
00077         void nextSkipSolvAttr()
00078         { this->base_reference().nextSkipSolvAttr(); }
00079 
00081         void nextSkipSolvable()
00082         { this->base_reference().nextSkipSolvable(); }
00083 
00085         void nextSkipRepo()
00086         { this->base_reference().nextSkipRepo(); }
00087 
00089         void skipSolvAttr()
00090         { this->base_reference().skipSolvAttr(); }
00091 
00093         void skipSolvable()
00094         { this->base_reference().skipSolvable(); }
00095 
00097         void skipRepo()
00098         { this->base_reference().skipRepo(); }
00100 
00104         Repository inRepo() const
00105         { return this->base_reference().inRepo(); }
00106 
00108         Solvable inSolvable() const
00109         { return this->base_reference().inSolvable(); }
00110 
00112         SolvAttr inSolvAttr() const
00113         { return this->base_reference().inSolvAttr(); }
00115 
00116       private:
00117         friend class boost::iterator_core_access;
00118 
00119         _ResultT dereference() const
00120         {
00121           const LookupAttr::iterator lit( this->base_reference() );
00122           return _ResultT( lit.asType<_AttrT>() );
00123         }
00124     };
00126 
00127     template<class _ResultT, class _AttrT>
00128     class ArrayAttr;
00129 
00130     template<class _ResultT, class _AttrT>
00131     std::ostream & operator<<( std::ostream & str, const ArrayAttr<_ResultT,_AttrT> & obj );
00132 
00134     //
00135     //  CLASS NAME : ArrayAttr
00136     //
00153     template<class _ResultT, class _AttrT>
00154     class ArrayAttr
00155     {
00156       friend std::ostream & operator<< <_ResultT,_AttrT>( std::ostream & str, const ArrayAttr<_ResultT,_AttrT> & obj );
00157 
00158       public:
00159         ArrayAttr()
00160         {}
00161 
00162         ArrayAttr( SolvAttr attr_r, LookupAttr::Location loc_r = LookupAttr::SOLV_ATTR )
00163         : _q( attr_r, loc_r )
00164         {}
00165 
00166         ArrayAttr( SolvAttr attr_r, Repository repo_r, LookupAttr::Location loc_r = LookupAttr::SOLV_ATTR )
00167         : _q( attr_r, repo_r, loc_r )
00168         {}
00169 
00170         ArrayAttr( SolvAttr attr_r, Solvable solv_r )
00171         : _q( attr_r, solv_r )
00172         {}
00173 
00174       public:
00175         typedef LookupAttr::transformIterator<_ResultT,_AttrT> iterator;
00176         typedef LookupAttr::size_type size_type;
00177 
00178         iterator begin() const
00179         { return iterator( _q.begin() ); }
00180 
00181         iterator end() const
00182         { return iterator( _q.end() ); }
00183 
00184         bool empty() const
00185         { return _q.empty(); }
00186 
00187         size_type size() const
00188         {
00189           size_type count = 0;
00190           for_( it, begin(), end() )
00191             ++count;
00192           return count;
00193         }
00194 
00195       public:
00196 
00197         iterator find( const _ResultT & key_r ) const
00198         {
00199           for_( it, begin(), end() )
00200           {
00201             if ( *it == key_r )
00202               return it;
00203           }
00204           return end();
00205         }
00206 
00207       private:
00208         LookupAttr _q;
00209     };
00211 
00213     template<class _ResultT, class _AttrT>
00214     inline std::ostream & operator<<( std::ostream & str, const ArrayAttr<_ResultT,_AttrT> & obj )
00215     { return dumpOn( str, obj._q ); }
00216 
00218   } // namespace sat
00221 } // namespace zypp
00223 #endif // ZYPP_SAT_LOOKUPATTRTOOLS_H