knight/shared/KeVector.h
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--
Added ISDKHooks interface with entity listeners (bug 5602, r=psychonic).
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_