collectors.h
Go to the documentation of this file.
00001 /******************************************************************************
00002 ** Copyright (c) 1992-2010 VT MAK
00003 ** All rights reserved.
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

Document ID: Generated on Tue Oct 11 19:41:03 EDT 2011 from SVN revision 107422
Copyright © 2005-2011 VT MÄK Inc. All Rights Reserved (www.mak.com)