| author | GoD-Tony <aangione@gmail.com> |
| Sun Aug 04 10:03:40 2013 -0400 (2013-08-04) | |
| changeset 3971 | d2e8100b2814 |
| parent 2226 | d10b38524be3 |
| permissions | -rw-r--r-- |
| dvander@2226 | 1 |
#ifndef _INCLUDE_KNIGHT_KE_VECTOR_H_ |
| dvander@2226 | 2 |
#define _INCLUDE_KNIGHT_KE_VECTOR_H_ |
| dvander@2226 | 3 |
|
| dvander@2226 | 4 |
#include <new> |
| dvander@2226 | 5 |
|
| dvander@2226 | 6 |
namespace Knight |
| dvander@2226 | 7 |
{ |
| dvander@2226 | 8 |
template <class T> |
| dvander@2226 | 9 |
class KeVector |
| dvander@2226 | 10 |
{ |
| dvander@2226 | 11 |
public: |
| dvander@2226 | 12 |
KeVector<T>() : m_Data(NULL), m_Size(0), m_CurrentUsedSize(0) |
| dvander@2226 | 13 |
{ |
| dvander@2226 | 14 |
} |
| dvander@2226 | 15 |
|
| dvander@2226 | 16 |
KeVector<T>(const KeVector<T> & other) |
| dvander@2226 | 17 |
{ |
| dvander@2226 | 18 |
m_Size = other.m_CurrentUsedSize; |
| dvander@2226 | 19 |
m_CurrentUsedSize = other.m_CurrentUsedSize; |
| dvander@2226 | 20 |
|
| dvander@2226 | 21 |
if (m_Size > 0) |
| dvander@2226 | 22 |
{ |
| dvander@2226 | 23 |
m_Data = new T[other.m_CurrentUsedSize]; |
| dvander@2226 | 24 |
|
| dvander@2226 | 25 |
for (size_t i = 0; i < m_Size; i++) |
| dvander@2226 | 26 |
{ |
| dvander@2226 | 27 |
m_Data[i] = other.m_Data[i]; |
| dvander@2226 | 28 |
} |
| dvander@2226 | 29 |
} |
| dvander@2226 | 30 |
else |
| dvander@2226 | 31 |
{ |
| dvander@2226 | 32 |
m_Data = NULL; |
| dvander@2226 | 33 |
} |
| dvander@2226 | 34 |
} |
| dvander@2226 | 35 |
|
| dvander@2226 | 36 |
~KeVector<T>() |
| dvander@2226 | 37 |
{ |
| dvander@2226 | 38 |
clear(); |
| dvander@2226 | 39 |
} |
| dvander@2226 | 40 |
|
| dvander@2226 | 41 |
KeVector & operator =(const KeVector<T> & other) |
| dvander@2226 | 42 |
{ |
| dvander@2226 | 43 |
clear(); |
| dvander@2226 | 44 |
|
| dvander@2226 | 45 |
if (other.m_CurrentUsedSize) |
| dvander@2226 | 46 |
{ |
| dvander@2226 | 47 |
m_Data = new T[other.m_CurrentUsedSize]; |
| dvander@2226 | 48 |
m_Size = other.m_CurrentUsedSize; |
| dvander@2226 | 49 |
m_CurrentUsedSize = other.m_CurrentUsedSize; |
| dvander@2226 | 50 |
|
| dvander@2226 | 51 |
for (size_t i = 0; i < m_Size; i++) |
| dvander@2226 | 52 |
{ |
| dvander@2226 | 53 |
m_Data[i] = other.m_Data[i]; |
| dvander@2226 | 54 |
} |
| dvander@2226 | 55 |
} |
| dvander@2226 | 56 |
} |
| dvander@2226 | 57 |
|
| dvander@2226 | 58 |
size_t size() const |
| dvander@2226 | 59 |
{ |
| dvander@2226 | 60 |
return m_CurrentUsedSize; |
| dvander@2226 | 61 |
} |
| dvander@2226 | 62 |
|
| dvander@2226 | 63 |
void push_back(const T & elem) |
| dvander@2226 | 64 |
{ |
| dvander@2226 | 65 |
GrowIfNeeded(1); |
| dvander@2226 | 66 |
|
| dvander@2226 | 67 |
new (&m_Data[m_CurrentUsedSize]) T(elem); |
| dvander@2226 | 68 |
|
| dvander@2226 | 69 |
m_CurrentUsedSize++; |
| dvander@2226 | 70 |
} |
| dvander@2226 | 71 |
|
| dvander@2226 | 72 |
void pop_back(const T & elem) |
| dvander@2226 | 73 |
{ |
| dvander@2226 | 74 |
if (m_CurrentUsedSize == 0) |
| dvander@2226 | 75 |
{ |
| dvander@2226 | 76 |
return; |
| dvander@2226 | 77 |
} |
| dvander@2226 | 78 |
|
| dvander@2226 | 79 |
m_CurrentUsedSize--; |
| dvander@2226 | 80 |
m_Data[m_CurrentUsedSize].~T(); |
| dvander@2226 | 81 |
} |
| dvander@2226 | 82 |
|
| dvander@2226 | 83 |
bool is_empty() |
| dvander@2226 | 84 |
{ |
| dvander@2226 | 85 |
return (m_CurrentUsedSize == 0); |
| dvander@2226 | 86 |
} |
| dvander@2226 | 87 |
|
| dvander@2226 | 88 |
T & operator [](size_t pos) |
| dvander@2226 | 89 |
{ |
| dvander@2226 | 90 |
return m_Data[pos]; |
| dvander@2226 | 91 |
} |
| dvander@2226 | 92 |
|
| dvander@2226 | 93 |
const T & operator [](size_t pos) const |
| dvander@2226 | 94 |
{ |
| dvander@2226 | 95 |
return m_Data[pos]; |
| dvander@2226 | 96 |
} |
| dvander@2226 | 97 |
|
| dvander@2226 | 98 |
void clear() |
| dvander@2226 | 99 |
{ |
| dvander@2226 | 100 |
for (size_t i = 0; i < m_CurrentUsedSize; i++) |
| dvander@2226 | 101 |
{ |
| dvander@2226 | 102 |
m_Data[i].~T(); |
| dvander@2226 | 103 |
} |
| dvander@2226 | 104 |
|
| dvander@2226 | 105 |
free(m_Data); |
| dvander@2226 | 106 |
|
| dvander@2226 | 107 |
m_Data = NULL; |
| dvander@2226 | 108 |
m_Size = 0; |
| dvander@2226 | 109 |
m_CurrentUsedSize = 0; |
| dvander@2226 | 110 |
} |
| dvander@2226 | 111 |
private: |
| dvander@2226 | 112 |
void Grow(size_t amount) |
| dvander@2226 | 113 |
{ |
| dvander@2226 | 114 |
T *new_data; |
| dvander@2226 | 115 |
size_t new_size; |
| dvander@2226 | 116 |
|
| dvander@2226 | 117 |
if (m_Size == 0) |
| dvander@2226 | 118 |
{ |
| dvander@2226 | 119 |
new_size = 8; |
| dvander@2226 | 120 |
} |
| dvander@2226 | 121 |
else |
| dvander@2226 | 122 |
{ |
| dvander@2226 | 123 |
new_size = m_Size * 2; |
| dvander@2226 | 124 |
} |
| dvander@2226 | 125 |
|
| dvander@2226 | 126 |
while (m_CurrentUsedSize + amount > new_size) |
| dvander@2226 | 127 |
{ |
| dvander@2226 | 128 |
new_size *= 2; |
| dvander@2226 | 129 |
} |
| dvander@2226 | 130 |
|
| dvander@2226 | 131 |
new_data = (T *)malloc(sizeof(T) * new_size); |
| dvander@2226 | 132 |
|
| dvander@2226 | 133 |
for (size_t i = 0; i < m_CurrentUsedSize; i++) |
| dvander@2226 | 134 |
{ |
| dvander@2226 | 135 |
new (&new_data[i]) T(m_Data[i]); |
| dvander@2226 | 136 |
m_Data[i].~T(); |
| dvander@2226 | 137 |
} |
| dvander@2226 | 138 |
|
| dvander@2226 | 139 |
free(m_Data); |
| dvander@2226 | 140 |
m_Data = new_data; |
| dvander@2226 | 141 |
m_Size = new_size; |
| dvander@2226 | 142 |
} |
| dvander@2226 | 143 |
|
| dvander@2226 | 144 |
void GrowIfNeeded(size_t amount) |
| dvander@2226 | 145 |
{ |
| dvander@2226 | 146 |
if (m_CurrentUsedSize + amount >= m_Size) |
| dvander@2226 | 147 |
{ |
| dvander@2226 | 148 |
Grow(amount); |
| dvander@2226 | 149 |
} |
| dvander@2226 | 150 |
} |
| dvander@2226 | 151 |
private: |
| dvander@2226 | 152 |
T *m_Data; |
| dvander@2226 | 153 |
size_t m_Size; |
| dvander@2226 | 154 |
size_t m_CurrentUsedSize; |
| dvander@2226 | 155 |
}; |
| dvander@2226 | 156 |
} |
| dvander@2226 | 157 |
|
| dvander@2226 | 158 |
#endif //_INCLUDE_KNIGHT_KE_VECTOR_H_ |