00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _OSBPTRLIST_H_
00031 #define _OSBPTRLIST_H_
00032
00033
00034
00035
00036 #include <list>
00037 #include <memory>
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 namespace OSB_LIB {
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00070 template< typename T, typename Cont = std::list<T*> >
00071 struct PtrList {
00072 public:
00074 typedef typename Cont::size_type Size;
00076 typedef typename Cont::iterator Iter;
00078 typedef typename Cont::const_iterator ConstIter;
00080 typedef std::auto_ptr<T> AutoPtr;
00081
00082 public:
00084 PtrList();
00086 ~PtrList();
00088 PtrList(const PtrList& rhs);
00090 PtrList& operator=(const PtrList& rhs);
00091
00092 public:
00094 bool empty() const;
00096 Size size() const;
00098 Iter begin();
00100 ConstIter begin() const;
00102 Iter end();
00104 ConstIter end() const;
00105
00107 void pushBack(AutoPtr e);
00114 Iter erase(Iter pos);
00116 void swap(PtrList& other);
00117
00118 private:
00120 Cont cont_;
00121 };
00122 }
00123
00124
00125
00126 namespace OSB_LIB {
00127 template<typename T, typename C>
00128 inline PtrList<T, C>::PtrList()
00129 {
00130 }
00131
00132 template<typename T, typename C>
00133 PtrList<T, C>::~PtrList()
00134 {
00135 for (Iter e = cont_.end(),
00136 i = cont_.begin(); i != e; ++i)
00137 {
00138 delete *i;
00139 }
00140 }
00141
00142 template<typename T, typename C>
00143 PtrList<T, C>::PtrList(const PtrList& rhs)
00144 {
00145 ConstIter e = rhs.end();
00146 ConstIter i = rhs.begin();
00147 for (; i != e; ++i) {
00148 T* t = *i;
00149 if (0 != t) pushBack(t->clone());
00150 else cont_.push_back(0);
00151 }
00152 }
00153
00154 template<typename T, typename C>
00155 PtrList<T, C>& PtrList<T, C>::operator=(const PtrList& rhs)
00156 {
00157 if (this != &rhs) {
00158 PtrList tmp(rhs);
00159 swap(tmp);
00160 }
00161 return *this;
00162 }
00163
00164 template<typename T, typename C>
00165 inline bool PtrList<T, C>::empty() const
00166 {
00167 return cont_.empty();
00168 }
00169
00170 template<typename T, typename C>
00171 inline typename PtrList<T, C>::Size PtrList<T, C>::size() const
00172 {
00173 return cont_.size();
00174 }
00175
00176 template<typename T, typename C>
00177 inline typename PtrList<T, C>::Iter PtrList<T, C>::begin()
00178 {
00179 return cont_.begin();
00180 }
00181
00182 template<typename T, typename C>
00183 inline typename PtrList<T, C>::ConstIter PtrList<T, C>::begin() const
00184 {
00185 return cont_.begin();
00186 }
00187
00188 template<typename T, typename C>
00189 inline typename PtrList<T, C>::Iter PtrList<T, C>::end()
00190 {
00191 return cont_.end();
00192 }
00193
00194 template<typename T, typename C>
00195 inline typename PtrList<T, C>::ConstIter PtrList<T, C>::end() const
00196 {
00197 return cont_.end();
00198 }
00199
00200 template<typename T, typename C>
00201 void PtrList<T, C>::pushBack(AutoPtr e)
00202 {
00203 cont_.push_back(e.get());
00204 e.release();
00205 }
00206
00207 template<typename T, typename C>
00208 typename PtrList<T, C>::Iter PtrList<T, C>::erase(Iter pos)
00209 {
00210 T* t = *pos;
00211 delete t;
00212 return cont_.erase(pos);
00213 }
00214
00215 template<typename T, typename C>
00216 inline void PtrList<T, C>::swap(PtrList& other)
00217 {
00218 cont_.swap(other.cont_);
00219 }
00220 }
00221 #endif // #ifndef _OSBPTRLIST_H_