00001 #ifndef __FTVector__
00002 #define __FTVector__
00003
00004 #include "FTGL.h"
00005
00006
00007
00008
00009 template <typename FT_VECTOR_ITEM_TYPE>
00010 class FTGL_EXPORT FTVector
00011 {
00012 public:
00013 typedef FT_VECTOR_ITEM_TYPE value_type;
00014 typedef value_type& reference;
00015 typedef const value_type& const_reference;
00016 typedef value_type* iterator;
00017 typedef const value_type* const_iterator;
00018 typedef size_t size_type;
00019
00020 FTVector()
00021 {
00022 Capacity = Size = 0;
00023 Items = 0;
00024 }
00025
00026
00027 virtual ~FTVector()
00028 {
00029 clear();
00030 }
00031
00032 FTVector& operator =(const FTVector& v)
00033 {
00034 reserve(v.capacity());
00035
00036 iterator ptr = begin();
00037 const_iterator vbegin = v.begin();
00038 const_iterator vend = v.end();
00039
00040 while( vbegin != vend)
00041 {
00042 *ptr++ = *vbegin++;
00043 }
00044
00045 Size = v.size();
00046 return *this;
00047 }
00048
00049 size_type size() const
00050 {
00051 return Size;
00052 }
00053
00054 size_type capacity() const
00055 {
00056 return Capacity;
00057 }
00058
00059 iterator begin()
00060 {
00061 return Items;
00062 }
00063
00064 const_iterator begin() const
00065 {
00066 return Items;
00067 }
00068
00069 iterator end()
00070 {
00071 return begin() + size();
00072 }
00073
00074 const_iterator end() const
00075 {
00076 return begin() + size();
00077 }
00078
00079 bool empty() const
00080 {
00081 return size() == 0;
00082 }
00083
00084 reference operator [](size_type pos)
00085 {
00086 return( *(begin() + pos));
00087 }
00088
00089 const_reference operator []( size_type pos) const
00090 {
00091 return( *(begin() + pos));
00092 }
00093
00094 void clear()
00095 {
00096 if( Capacity)
00097 {
00098 delete [] Items;
00099 Capacity = Size = 0;
00100 Items = 0;
00101 }
00102 }
00103
00104 void reserve( size_type n)
00105 {
00106 if( capacity() < n)
00107 {
00108 expand(n);
00109 }
00110 }
00111
00112 void push_back(const value_type& x)
00113 {
00114 if( size() == capacity())
00115 {
00116 expand();
00117 }
00118
00119 ( *this)[size()] = x;
00120 ++Size;
00121 }
00122
00123 void resize(size_type n, value_type x)
00124 {
00125 if( n == size())
00126 {
00127 return;
00128 }
00129
00130 reserve(n);
00131 iterator begin1, end1;
00132
00133 if( n >= Size)
00134 {
00135 begin1 = this->end();
00136 end1 = this->begin() + n;
00137 }
00138 else
00139 {
00140 begin1 = this->begin() + n;
00141 end1 = this->end();
00142 }
00143
00144 while( begin1 != end1)
00145 {
00146 *begin1++ = x;
00147 }
00148
00149 Size = n;
00150 }
00151
00152
00153 private:
00154 void expand(size_type capacity_hint = 0)
00155 {
00156 size_type new_capacity =( capacity() == 0) ? 256 : capacity()* 2;
00157 if( capacity_hint)
00158 {
00159 while( new_capacity < capacity_hint)
00160 {
00161 new_capacity *= 2;
00162 }
00163 }
00164
00165 value_type *new_items = new value_type[new_capacity];
00166
00167 iterator begin2 = this->begin();
00168 iterator end2 = this->end();
00169 value_type *ptr = new_items;
00170
00171 while( begin2 != end2)
00172 {
00173 *ptr++ = *begin2++;
00174 }
00175
00176 if( Capacity)
00177 {
00178 delete [] Items;
00179 }
00180
00181 Items = new_items;
00182 Capacity = new_capacity;
00183 }
00184
00185 size_type Capacity;
00186 size_type Size;
00187 value_type* Items;
00188 };
00189
00190 #endif // __FTVector__