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__
|