191 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			191 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #ifndef    __FTVector__
 | ||
|  | #define    __FTVector__
 | ||
|  | 
 | ||
|  | #include "FTGL.h"
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Provides a non-STL alternative to the STL vector | ||
|  |  */ | ||
|  | template <typename FT_VECTOR_ITEM_TYPE> | ||
|  | class FTGL_EXPORT FTVector | ||
|  | { | ||
|  |     public: | ||
|  |         typedef FT_VECTOR_ITEM_TYPE value_type; | ||
|  |         typedef value_type& reference; | ||
|  |         typedef const value_type& const_reference; | ||
|  |         typedef value_type* iterator; | ||
|  |         typedef const value_type* const_iterator; | ||
|  |         typedef size_t size_type; | ||
|  |          | ||
|  |         FTVector() | ||
|  |         { | ||
|  |             Capacity = Size = 0; | ||
|  |             Items = 0; | ||
|  |         } | ||
|  | 
 | ||
|  |          | ||
|  |         virtual ~FTVector() | ||
|  |         { | ||
|  |             clear(); | ||
|  |         } | ||
|  |          | ||
|  |         FTVector& operator =(const FTVector& v) | ||
|  |         { | ||
|  |             reserve(v.capacity()); | ||
|  |              | ||
|  |             iterator ptr = begin(); | ||
|  |             const_iterator vbegin = v.begin(); | ||
|  |             const_iterator vend = v.end(); | ||
|  |              | ||
|  |             while( vbegin != vend) | ||
|  |             { | ||
|  |                 *ptr++ = *vbegin++; | ||
|  |             } | ||
|  |              | ||
|  |             Size = v.size(); | ||
|  |             return *this; | ||
|  |         } | ||
|  |          | ||
|  |         size_type size() const | ||
|  |         { | ||
|  |             return Size; | ||
|  |         } | ||
|  |          | ||
|  |         size_type capacity() const | ||
|  |         { | ||
|  |             return Capacity; | ||
|  |         } | ||
|  |          | ||
|  |         iterator begin() | ||
|  |         { | ||
|  |             return Items; | ||
|  |         } | ||
|  |          | ||
|  |         const_iterator begin() const | ||
|  |         { | ||
|  |             return Items; | ||
|  |         } | ||
|  |          | ||
|  |         iterator end() | ||
|  |         { | ||
|  |             return begin() + size();  | ||
|  |         } | ||
|  |          | ||
|  |         const_iterator end() const | ||
|  |         { | ||
|  |             return begin() + size();  | ||
|  |         } | ||
|  |          | ||
|  |         bool empty() const  | ||
|  |         {  | ||
|  |             return size() == 0;  | ||
|  |         } | ||
|  | 
 | ||
|  |         reference operator [](size_type pos)  | ||
|  |         {  | ||
|  |             return( *(begin() + pos));  | ||
|  |         } | ||
|  | 
 | ||
|  |         const_reference operator []( size_type pos) const  | ||
|  |         {  | ||
|  |             return( *(begin() + pos));  | ||
|  |         } | ||
|  |          | ||
|  |         void clear() | ||
|  |         { | ||
|  |             if( Capacity) | ||
|  |             { | ||
|  |                 delete [] Items; | ||
|  |                 Capacity = Size = 0; | ||
|  |                 Items = 0; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         void reserve( size_type n) | ||
|  |         { | ||
|  |             if( capacity() < n) | ||
|  |             { | ||
|  |                 expand(n); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         void push_back(const value_type& x) | ||
|  |         { | ||
|  |             if( size() == capacity()) | ||
|  |             { | ||
|  |                 expand(); | ||
|  |             } | ||
|  |             | ||
|  |            ( *this)[size()] = x; | ||
|  |             ++Size; | ||
|  |         } | ||
|  | 
 | ||
|  |         void resize(size_type n, value_type x) | ||
|  |         { | ||
|  |             if( n == size()) | ||
|  |             { | ||
|  |                 return; | ||
|  |             } | ||
|  |              | ||
|  |             reserve(n); | ||
|  |             iterator begin, end; | ||
|  |              | ||
|  |             if( n >= Size) | ||
|  |             { | ||
|  |                 begin = this->end(); | ||
|  |                 end = this->begin() + n; | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 begin = this->begin() + n; | ||
|  |                 end = this->end(); | ||
|  |             } | ||
|  |          | ||
|  |             while( begin != end) | ||
|  |             { | ||
|  |                 *begin++ = x; | ||
|  |             } | ||
|  |          | ||
|  |             Size = n; | ||
|  |         } | ||
|  | 
 | ||
|  |          | ||
|  |     private: | ||
|  |         void expand(size_type capacity_hint = 0) | ||
|  |         { | ||
|  |             size_type new_capacity =( capacity() == 0) ? 256 : capacity()* 2; | ||
|  |             if( capacity_hint) | ||
|  |             { | ||
|  |                 while( new_capacity < capacity_hint) | ||
|  |                 { | ||
|  |                     new_capacity *= 2; | ||
|  |                 } | ||
|  |             } | ||
|  |              | ||
|  |             value_type *new_items = new value_type[new_capacity]; | ||
|  |              | ||
|  |             iterator begin = this->begin(); | ||
|  |             iterator end = this->end(); | ||
|  |             value_type *ptr = new_items; | ||
|  |              | ||
|  |             while( begin != end) | ||
|  |             { | ||
|  |                 *ptr++ = *begin++; | ||
|  |             } | ||
|  |              | ||
|  |             if( Capacity) | ||
|  |             { | ||
|  |                 delete [] Items; | ||
|  |             } | ||
|  |          | ||
|  |             Items = new_items; | ||
|  |             Capacity = new_capacity; | ||
|  |         } | ||
|  | 
 | ||
|  |         size_type Capacity; | ||
|  |         size_type Size; | ||
|  |         value_type* Items; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif  //  __FTVector__
 |