MeshKit
1.0
|
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