Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

PMObjectContainerIter.h

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                                                                      |
00003 |                      __   __    ____ _____ ____                      |
00004 |                      \ \ / /_ _/ ___|_   _|___ \                     |
00005 |                       \ V / _` \___ \ | |   __) |                    |
00006 |                        | | (_| |___) || |  / __/                     |
00007 |                        |_|\__,_|____/ |_| |_____|                    |
00008 |                                                                      |
00009 |                               core system                            |
00010 |                                                        (C) SuSE GmbH |
00011 \----------------------------------------------------------------------/
00012 
00013    File:       PMObjectContainerIter.h
00014 
00015    Author:     Michael Andres <ma@suse.de>
00016    Maintainer: Michael Andres <ma@suse.de>
00017 
00018 /-*/
00019 #ifndef PMObjectContainerIter_h
00020 #define PMObjectContainerIter_h
00021 
00022 #include <vector>
00023 #include <list>
00024 #include <set>
00025 
00026 #include <y2pm/PMObjectPtr.h>
00027 #include <y2pm/PMPackagePtr.h>
00028 #include <y2pm/PMSelectionPtr.h>
00029 #include <y2pm/PMYouPatchPtr.h>
00030 
00032 //
00033 //      CLASS NAME : PMObjectContainerIter
00074 class PMObjectContainerIter {
00075 
00076   private:
00077 
00081     class ContBase {
00082       public:
00083         ContBase() {}
00084         virtual ~ContBase() {}
00085         virtual ContBase *  clone()    const = 0;
00086       public:
00087         virtual void        setBegin()       = 0;
00088         virtual void        setNext()        = 0;
00089         virtual bool        atEnd()    const = 0;
00090         virtual PMObjectPtr get()      const = 0;
00091         virtual unsigned    size()     const = 0;
00092     };
00093 
00097     template <class Ptr> class StdCont : public ContBase {
00098       private:
00099         const Ptr &                  _cont;
00100         typename Ptr::const_iterator _iter;
00101 
00102         template <typename Tp>
00103         PMObjectPtr _get( const Tp & ) const { return *_iter; }
00104 
00105         template <typename Tp,class ObjPtr>
00106         PMObjectPtr _get( const std::map<Tp,ObjPtr> & ) const { return _iter->second; }
00107 
00108       public:
00109         StdCont( const Ptr & cont_r ) : _cont( cont_r ) { _iter = cont_r.begin(); }
00110         virtual ~StdCont() {}
00111         virtual ContBase *  clone()    const { return new StdCont( *this ); }
00112       public:
00113         virtual void        setBegin()       { _iter = _cont.begin(); }
00114         virtual void        setNext()        { ++_iter; }
00115         virtual bool        atEnd()    const { return ( _iter == _cont.end() ); }
00116         virtual PMObjectPtr get()      const { return _get( _cont ); }
00117         virtual unsigned    size()     const { return _cont.size(); }
00118    };
00119 
00120 
00121   private:
00122 
00123     ContBase * _cont;
00124 
00125   public:
00126     template <class ObjPtr>
00127     PMObjectContainerIter( const std::vector<ObjPtr> & cont_r ) {
00128       _cont = new StdCont<std::vector<ObjPtr> >( cont_r );
00129     }
00130     template <class ObjPtr>
00131     PMObjectContainerIter( const std::list<ObjPtr> & cont_r ) {
00132       _cont = new StdCont<std::list<ObjPtr> >( cont_r );
00133     }
00134     template <class ObjPtr>
00135     PMObjectContainerIter( const std::set<ObjPtr> & cont_r ) {
00136       _cont = new StdCont<std::set<ObjPtr> >( cont_r );
00137     }
00138     template <typename Tp,class ObjPtr>
00139     PMObjectContainerIter( const std::map<Tp,ObjPtr> & cont_r ) {
00140       _cont = new StdCont<std::map<Tp,ObjPtr> >( cont_r );
00141     }
00142 
00143 #if 0
00144     PMObjectContainerIter( const std::vector<PMObjectPtr> & cont_r ) {
00145       _cont = new StdCont<std::vector<PMObjectPtr> >( cont_r );
00146     }
00147     PMObjectContainerIter( const std::list<PMObjectPtr> & cont_r ) {
00148       _cont = new StdCont<std::list<PMObjectPtr> >( cont_r );
00149     }
00150     PMObjectContainerIter( const std::set<PMObjectPtr> & cont_r ) {
00151       _cont = new StdCont<std::set<PMObjectPtr> >( cont_r );
00152     }
00153 
00154     PMObjectContainerIter( const std::vector<PMPackagePtr> & cont_r ) {
00155       _cont = new StdCont<std::vector<PMPackagePtr> >( cont_r );
00156     }
00157     PMObjectContainerIter( const std::list<PMPackagePtr> & cont_r ) {
00158       _cont = new StdCont<std::list<PMPackagePtr> >( cont_r );
00159     }
00160     PMObjectContainerIter( const std::set<PMPackagePtr> & cont_r ) {
00161       _cont = new StdCont<std::set<PMPackagePtr> >( cont_r );
00162     }
00163 
00164     PMObjectContainerIter( const std::vector<PMSelectionPtr> & cont_r ) {
00165       _cont = new StdCont<std::vector<PMSelectionPtr> >( cont_r );
00166     }
00167     PMObjectContainerIter( const std::list<PMSelectionPtr> & cont_r ) {
00168       _cont = new StdCont<std::list<PMSelectionPtr> >( cont_r );
00169     }
00170     PMObjectContainerIter( const std::set<PMSelectionPtr> & cont_r ) {
00171       _cont = new StdCont<std::set<PMSelectionPtr> >( cont_r );
00172     }
00173 
00174     PMObjectContainerIter( const std::vector<PMYouPatchPtr> & cont_r ) {
00175       _cont = new StdCont<std::vector<PMYouPatchPtr> >( cont_r );
00176     }
00177     PMObjectContainerIter( const std::list<PMYouPatchPtr> & cont_r ) {
00178       _cont = new StdCont<std::list<PMYouPatchPtr> >( cont_r );
00179     }
00180     PMObjectContainerIter( const std::set<PMYouPatchPtr> & cont_r ) {
00181       _cont = new StdCont<std::set<PMYouPatchPtr> >( cont_r );
00182     }
00183 #endif
00184 
00185   public:
00186 
00187     PMObjectContainerIter( const PMObjectContainerIter & rhs ) : _cont( 0 ) {
00188       if ( rhs._cont ) {
00189         _cont = rhs._cont->clone();
00190       }
00191     }
00192 
00193     PMObjectContainerIter & operator = ( const PMObjectContainerIter & rhs ) {
00194       if ( &rhs != this ) {
00195         delete _cont;
00196         if ( rhs._cont ) {
00197           _cont = rhs._cont->clone();
00198         } else {
00199           _cont = 0;
00200         }
00201       }
00202       return *this;
00203     }
00204 
00205     ~PMObjectContainerIter() {
00206       delete _cont;
00207     }
00208 
00209   public:
00210 
00214     void setBegin() { _cont->setBegin(); }
00215 
00219     void setNext() { _cont->setNext(); }
00220 
00224     bool atEnd() const { return _cont->atEnd(); }
00225 
00230     PMObjectPtr operator * () const { return _cont->get(); }
00231 
00241     PMObjectPtr operator -> () const { return _cont->get(); }
00242 
00246     unsigned size() const { return _cont->size(); }
00247 
00251     bool empty() const { return ( size() == 0 ); }
00252 };
00253 
00255 
00256 #endif // PMObjectContainerIter_h

Generated on Mon Sep 12 21:52:13 2005 for yast2-packagemanager by  doxygen 1.4.4