Go to the documentation of this file.00001
00002
00003
00004
00005
00009
00010 #ifndef collectors_H_
00011 #define collectors_H_
00012
00013 #include <vector>
00014 #include <deque>
00015 #include <list>
00016 #include <set>
00017 #include <vlutil/vlSmartPointers.h>
00018
00019 namespace MAKLogger
00020 {
00021
00022
00025 template <typename T>
00026 class DtCollectorImpl
00027 {
00028 public:
00029 virtual ~DtCollectorImpl() {}
00030
00031 virtual void collect(T&) = 0;
00032 virtual void collect(const T&) = 0;
00033
00034 virtual size_t size() const = 0;
00035 virtual bool full() const = 0;
00036 virtual bool empty() const = 0;
00037 };
00038
00045 template <typename T>
00046 class DtCollector
00047 {
00048 public:
00049
00050 DtCollector(DtCollectorImpl<T>* impl) :
00051 myImpl(DtBoost::shared_ptr<DtCollectorImpl<T> >(impl)){}
00052
00053 void collect(T& t) { myImpl->collect(t);}
00054 void collect(const T& t) { myImpl->collect(t);}
00055 size_t size() const { return myImpl->size();}
00056 bool full() const { return myImpl->full();}
00057 bool empty() const { return myImpl->empty();}
00058
00059 protected:
00060 DtBoost::shared_ptr<DtCollectorImpl<T> > myImpl;
00061 private:
00063 DtCollector* operator&();
00065 static void *operator new(size_t size);
00067 static void operator delete(void* ptr);
00068 };
00069
00073 template <typename T,typename Container>
00074 class DtPushBackCollector : public DtCollectorImpl<T>
00075 {
00076 public:
00077
00078 DtPushBackCollector(Container& container) :
00079 myContainer(container)
00080 {
00081 }
00082
00083 virtual void collect(T& t)
00084 {
00085 myContainer.push_back(t);
00086 }
00087
00088 virtual void collect(const T& t)
00089 {
00090 myContainer.push_back(t);
00091 }
00092
00093 virtual size_t size()const
00094 {
00095 return myContainer.size();
00096 }
00097
00098 virtual bool full() const
00099 {
00100 return false;
00101 }
00102
00103 virtual bool empty() const
00104 {
00105 return myContainer.empty();
00106 }
00107
00108 protected:
00109 Container& myContainer;
00110 };
00111
00113 template <typename T,typename Container>
00114 class DtInsertCollector : public DtCollectorImpl<T>
00115 {
00116 public:
00117
00118 DtInsertCollector(Container& container) : myContainer(container) {}
00119
00120 virtual void collect(T& t)
00121 {
00122 myContainer.insert(t);
00123 }
00124
00125 virtual void collect(const T& t)
00126 {
00127 myContainer.insert(t);
00128 }
00129
00130 virtual size_t size()const
00131 {
00132 return myContainer.size();
00133 }
00134
00135 virtual bool full() const
00136 {
00137 return false;
00138 }
00139
00140 virtual bool empty() const
00141 {
00142 return myContainer.empty();
00143 }
00144
00145 protected:
00146 Container& myContainer;
00147 };
00148
00150 template <typename T,typename Container>
00151 class DtFixedSizePushBackCollector : public DtCollectorImpl<T>
00152 {
00153 public:
00154
00155 DtFixedSizePushBackCollector(Container& container,int size) :
00156 myContainer(container),myMaxSize(size) {}
00157
00158 virtual void collect(T& t)
00159 {
00160 if(!full) myContainer.push_back(t);
00161 }
00162
00163 virtual void collect(const T& t)
00164 {
00165 if(!full) myContainer.push_back(t);
00166 }
00167
00168 virtual void size()const
00169 {
00170 myContainer.size();
00171 }
00172
00173 virtual bool full() const
00174 {
00175 return myMaxSize == myContainer.size();
00176 }
00177
00178 virtual bool empty() const
00179 {
00180 return myContainer.empty();
00181 }
00182
00183 protected:
00184 Container& myContainer;
00185 int myMaxSize;
00186 };
00187
00189 template <typename T>
00190 class DtFixedSizeArrayCollector : public DtCollectorImpl<T>
00191 {
00192 public:
00193
00194 DtFixedSizeArrayCollector(T* container,int size) :
00195 myContainer(container),
00196 myMaxSize(size),
00197 myCurrentIndex(0)
00198 {}
00199
00200 virtual void collect(T& t)
00201 {
00202 if(!full) myContainer[myCurrentIndex] = t;
00203 ++myCurrentIndex;
00204 }
00205
00206 virtual void collect(const T& t)
00207 {
00208 if(!full) myContainer[myCurrentIndex] = t;
00209 ++myCurrentIndex;
00210 }
00211
00212 virtual void size()const
00213 {
00214 return myCurrentIndex;
00215 }
00216
00217 virtual bool full() const
00218 {
00219 return myMaxSize <= myCurrentIndex;
00220 }
00221
00222 virtual bool empty() const
00223 {
00224 return myCurrentIndex == 0;
00225 }
00226
00227 protected:
00228 T* myContainer;
00229 int myMaxSize;
00230 int myCurrentIndex;
00231 };
00232
00234 class DtCollectors
00235 {
00236 public:
00237 template <typename T>
00238 static DtCollector<T> create(std::vector<T>& collection)
00239 {
00240 return new DtPushBackCollector<T,std::vector<T> >(collection);
00241 }
00242
00243 template <typename T>
00244 static DtCollector<T> create(std::deque<T>& collection)
00245 {
00246 return new DtPushBackCollector<T,std::deque<T> >(collection);
00247 }
00248
00249 template <typename T>
00250 static DtCollector<T> create(std::list<T>& collection)
00251 {
00252 return new DtPushBackCollector<T,std::list<T> >(collection);
00253 }
00254
00255 template <typename T>
00256 static DtCollector<T> create(std::set<T>& collection)
00257 {
00258 return new DtInsertCollector<T,std::set<T> >(collection);
00259 }
00260
00261 template <typename T>
00262 static DtCollector<T> create(T* array,int size)
00263 {
00264 return new DtFixedSizeArrayCollector<T>(array,size);
00265 }
00266 };
00267
00268 template <typename Key,typename Value>
00269 class DtMapCollector
00270 {
00271 public:
00272 virtual void add(Key,Value) = 0;
00273 virtual bool containes(Key) = 0;
00274
00275 virtual int size() const = 0;
00276 virtual bool full() const = 0;
00277 virtual bool empty() const = 0;
00278 };
00279
00281 template <typename Key,typename Value,typename Container>
00282 class DtInsertMapCollector : public DtMapCollector<Key,Value>
00283 {
00284 public:
00285 DtInsertMapCollector(Container& container) :
00286 DtMapCollector<Key,Value>(),
00287 myContainer(container) {}
00288
00289 virtual void add(Key key,Value value)
00290 {
00291 myContainer.insert(key,value);
00292 }
00293
00294 virtual bool containes(Key key)
00295 {
00296 return myContainer.find(key) != myContainer.end();
00297 }
00298
00299 virtual int size()const
00300 {
00301 return myContainer.size();
00302 }
00303
00304 virtual bool full() const
00305 {
00306 return false;
00307 }
00308
00309 virtual bool empty() const
00310 {
00311 return myContainer.empty();
00312 }
00313
00314 protected:
00315 Container& myContainer;
00316 };
00317
00318 }
00319
00320 #endif