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 public: 00102 StdCont( const Ptr & cont_r ) : _cont( cont_r ) { _iter = cont_r.begin(); } 00103 virtual ~StdCont() {} 00104 virtual ContBase * clone() const { return new StdCont( *this ); } 00105 public: 00106 virtual void setBegin() { _iter = _cont.begin(); } 00107 virtual void setNext() { ++_iter; } 00108 virtual bool atEnd() const { return ( _iter == _cont.end() ); } 00109 virtual PMObjectPtr get() const { return *_iter; } 00110 virtual unsigned size() const { return _cont.size(); } 00111 }; 00112 00113 private: 00114 00115 ContBase * _cont; 00116 00117 public: 00118 00119 PMObjectContainerIter( const std::vector<PMObjectPtr> & cont_r ) { 00120 _cont = new StdCont<std::vector<PMObjectPtr> >( cont_r ); 00121 } 00122 PMObjectContainerIter( const std::list<PMObjectPtr> & cont_r ) { 00123 _cont = new StdCont<std::list<PMObjectPtr> >( cont_r ); 00124 } 00125 PMObjectContainerIter( const std::set<PMObjectPtr> & cont_r ) { 00126 _cont = new StdCont<std::set<PMObjectPtr> >( cont_r ); 00127 } 00128 00129 PMObjectContainerIter( const std::vector<PMPackagePtr> & cont_r ) { 00130 _cont = new StdCont<std::vector<PMPackagePtr> >( cont_r ); 00131 } 00132 PMObjectContainerIter( const std::list<PMPackagePtr> & cont_r ) { 00133 _cont = new StdCont<std::list<PMPackagePtr> >( cont_r ); 00134 } 00135 PMObjectContainerIter( const std::set<PMPackagePtr> & cont_r ) { 00136 _cont = new StdCont<std::set<PMPackagePtr> >( cont_r ); 00137 } 00138 00139 PMObjectContainerIter( const std::vector<PMSelectionPtr> & cont_r ) { 00140 _cont = new StdCont<std::vector<PMSelectionPtr> >( cont_r ); 00141 } 00142 PMObjectContainerIter( const std::list<PMSelectionPtr> & cont_r ) { 00143 _cont = new StdCont<std::list<PMSelectionPtr> >( cont_r ); 00144 } 00145 PMObjectContainerIter( const std::set<PMSelectionPtr> & cont_r ) { 00146 _cont = new StdCont<std::set<PMSelectionPtr> >( cont_r ); 00147 } 00148 00149 PMObjectContainerIter( const std::vector<PMYouPatchPtr> & cont_r ) { 00150 _cont = new StdCont<std::vector<PMYouPatchPtr> >( cont_r ); 00151 } 00152 PMObjectContainerIter( const std::list<PMYouPatchPtr> & cont_r ) { 00153 _cont = new StdCont<std::list<PMYouPatchPtr> >( cont_r ); 00154 } 00155 PMObjectContainerIter( const std::set<PMYouPatchPtr> & cont_r ) { 00156 _cont = new StdCont<std::set<PMYouPatchPtr> >( cont_r ); 00157 } 00158 00159 public: 00160 00161 PMObjectContainerIter( const PMObjectContainerIter & rhs ) : _cont( 0 ) { 00162 if ( rhs._cont ) { 00163 _cont = rhs._cont->clone(); 00164 } 00165 } 00166 00167 PMObjectContainerIter & operator = ( const PMObjectContainerIter & rhs ) { 00168 if ( &rhs != this ) { 00169 delete _cont; 00170 if ( rhs._cont ) { 00171 _cont = rhs._cont->clone(); 00172 } else { 00173 _cont = 0; 00174 } 00175 } 00176 return *this; 00177 } 00178 00179 ~PMObjectContainerIter() { 00180 delete _cont; 00181 } 00182 00183 public: 00184 00188 void setBegin() { _cont->setBegin(); } 00189 00193 void setNext() { _cont->setNext(); } 00194 00198 bool atEnd() const { return _cont->atEnd(); } 00199 00204 PMObjectPtr operator * () const { return _cont->get(); } 00205 00215 PMObjectPtr operator -> () const { return _cont->get(); } 00216 00220 unsigned size() const { return _cont->size(); } 00221 00225 bool empty() const { return ( size() == 0 ); } 00226 }; 00227 00229 00230 #endif // PMObjectContainerIter_h