MeshKit  1.0
Buffer.h
Go to the documentation of this file.
00001 #ifndef GFXTOOLS_BUFFER_INCLUDED // -*- C++ -*-
00002 #define GFXTOOLS_BUFFER_INCLUDED
00003 
00004 #include "Array.h"
00005 
00006 template<class T>
00007 class buffer : public array<T> {
00008 protected:
00009     int fill;
00010 public:
00011     buffer() { init(8); }
00012     buffer(int l) { init(l); }
00013     
00014     inline void init(int l) { array<T>::init(l); fill=0; }
00015 
00016     inline int add(const T& t);
00017     inline void reset();
00018     inline int find(const T&);
00019     inline T remove(int i);
00020     inline int addAll(const buffer<T>& buf);
00021     inline void removeDuplicates();
00022 
00023     inline int length() const { return fill; }
00024     inline int maxLength() const { return array<T>::len; }
00025 };
00026 
00027 
00028 template<class T>
00029 inline int buffer<T>::add(const T& t)
00030 {
00031     if( fill == array<T>::len )
00032         array<T>::resize(  array<T>::len*2 );
00033 
00034      array<T>::data[fill] = t;
00035 
00036     return fill++;
00037 }
00038 
00039 template<class T>
00040 inline void buffer<T>::reset()
00041 {
00042     fill = 0;
00043 }
00044 
00045 template<class T>
00046 inline int buffer<T>::find(const T& t)
00047 {
00048     for(int i=0;i<fill;i++)
00049         if(  array<T>::data[i] == t )
00050             return i;
00051 
00052     return -1;
00053 }
00054 
00055 template<class T>
00056 inline T buffer<T>::remove(int i)
00057 {
00058 #ifdef SAFETY
00059     assert( i>=0 );
00060     assert( i<fill );
00061 #endif
00062 
00063     fill--;
00064     T temp =  array<T>::data[i];
00065      array<T>::data[i] =  array<T>::data[fill];
00066 
00067     return temp;
00068 }
00069 
00070 template<class T>
00071 inline int buffer<T>::addAll(const buffer<T>& buf)
00072 {
00073     for(int i=0; i<buf.fill; i++)
00074         add(buf(i));
00075 
00076     return fill;
00077 }
00078 
00079 template<class T>
00080 inline void buffer<T>::removeDuplicates()
00081 {
00082     for(int i=0; i<fill; i++)
00083     {
00084         for(int j=i+1; j<fill; )
00085         {
00086             if(  array<T>::data[j] ==  array<T>::data[i] )
00087                 remove(j);
00088             else
00089                 j++;
00090         }
00091     }
00092 }
00093 
00094 // GFXTOOLS_BUFFER_INCLUDED
00095 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines