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
1.4.4