dvander@2226: #ifndef _INCLUDE_KNIGHT_KE_VECTOR_H_ dvander@2226: #define _INCLUDE_KNIGHT_KE_VECTOR_H_ dvander@2226: dvander@2226: #include dvander@2226: dvander@2226: namespace Knight dvander@2226: { dvander@2226: template dvander@2226: class KeVector dvander@2226: { dvander@2226: public: dvander@2226: KeVector() : m_Data(NULL), m_Size(0), m_CurrentUsedSize(0) dvander@2226: { dvander@2226: } dvander@2226: dvander@2226: KeVector(const KeVector & other) dvander@2226: { dvander@2226: m_Size = other.m_CurrentUsedSize; dvander@2226: m_CurrentUsedSize = other.m_CurrentUsedSize; dvander@2226: dvander@2226: if (m_Size > 0) dvander@2226: { dvander@2226: m_Data = new T[other.m_CurrentUsedSize]; dvander@2226: dvander@2226: for (size_t i = 0; i < m_Size; i++) dvander@2226: { dvander@2226: m_Data[i] = other.m_Data[i]; dvander@2226: } dvander@2226: } dvander@2226: else dvander@2226: { dvander@2226: m_Data = NULL; dvander@2226: } dvander@2226: } dvander@2226: dvander@2226: ~KeVector() dvander@2226: { dvander@2226: clear(); dvander@2226: } dvander@2226: dvander@2226: KeVector & operator =(const KeVector & other) dvander@2226: { dvander@2226: clear(); dvander@2226: dvander@2226: if (other.m_CurrentUsedSize) dvander@2226: { dvander@2226: m_Data = new T[other.m_CurrentUsedSize]; dvander@2226: m_Size = other.m_CurrentUsedSize; dvander@2226: m_CurrentUsedSize = other.m_CurrentUsedSize; dvander@2226: dvander@2226: for (size_t i = 0; i < m_Size; i++) dvander@2226: { dvander@2226: m_Data[i] = other.m_Data[i]; dvander@2226: } dvander@2226: } dvander@2226: } dvander@2226: dvander@2226: size_t size() const dvander@2226: { dvander@2226: return m_CurrentUsedSize; dvander@2226: } dvander@2226: dvander@2226: void push_back(const T & elem) dvander@2226: { dvander@2226: GrowIfNeeded(1); dvander@2226: dvander@2226: new (&m_Data[m_CurrentUsedSize]) T(elem); dvander@2226: dvander@2226: m_CurrentUsedSize++; dvander@2226: } dvander@2226: dvander@2226: void pop_back(const T & elem) dvander@2226: { dvander@2226: if (m_CurrentUsedSize == 0) dvander@2226: { dvander@2226: return; dvander@2226: } dvander@2226: dvander@2226: m_CurrentUsedSize--; dvander@2226: m_Data[m_CurrentUsedSize].~T(); dvander@2226: } dvander@2226: dvander@2226: bool is_empty() dvander@2226: { dvander@2226: return (m_CurrentUsedSize == 0); dvander@2226: } dvander@2226: dvander@2226: T & operator [](size_t pos) dvander@2226: { dvander@2226: return m_Data[pos]; dvander@2226: } dvander@2226: dvander@2226: const T & operator [](size_t pos) const dvander@2226: { dvander@2226: return m_Data[pos]; dvander@2226: } dvander@2226: dvander@2226: void clear() dvander@2226: { dvander@2226: for (size_t i = 0; i < m_CurrentUsedSize; i++) dvander@2226: { dvander@2226: m_Data[i].~T(); dvander@2226: } dvander@2226: dvander@2226: free(m_Data); dvander@2226: dvander@2226: m_Data = NULL; dvander@2226: m_Size = 0; dvander@2226: m_CurrentUsedSize = 0; dvander@2226: } dvander@2226: private: dvander@2226: void Grow(size_t amount) dvander@2226: { dvander@2226: T *new_data; dvander@2226: size_t new_size; dvander@2226: dvander@2226: if (m_Size == 0) dvander@2226: { dvander@2226: new_size = 8; dvander@2226: } dvander@2226: else dvander@2226: { dvander@2226: new_size = m_Size * 2; dvander@2226: } dvander@2226: dvander@2226: while (m_CurrentUsedSize + amount > new_size) dvander@2226: { dvander@2226: new_size *= 2; dvander@2226: } dvander@2226: dvander@2226: new_data = (T *)malloc(sizeof(T) * new_size); dvander@2226: dvander@2226: for (size_t i = 0; i < m_CurrentUsedSize; i++) dvander@2226: { dvander@2226: new (&new_data[i]) T(m_Data[i]); dvander@2226: m_Data[i].~T(); dvander@2226: } dvander@2226: dvander@2226: free(m_Data); dvander@2226: m_Data = new_data; dvander@2226: m_Size = new_size; dvander@2226: } dvander@2226: dvander@2226: void GrowIfNeeded(size_t amount) dvander@2226: { dvander@2226: if (m_CurrentUsedSize + amount >= m_Size) dvander@2226: { dvander@2226: Grow(amount); dvander@2226: } dvander@2226: } dvander@2226: private: dvander@2226: T *m_Data; dvander@2226: size_t m_Size; dvander@2226: size_t m_CurrentUsedSize; dvander@2226: }; dvander@2226: } dvander@2226: dvander@2226: #endif //_INCLUDE_KNIGHT_KE_VECTOR_H_