GameServer
FlexArray.h
[詳解]
1 #ifndef __FLEXARRAY_H__
2 #define __FLEXARRAY_H__
3 
5 
6 template<typename T>
7 class FlexArray
8 {
9 
10 public:
11 
12  // コンストラクタ
13  FlexArray(int DefaultCapacity = 20)
14  : CurrentSize(0)
15  , CurrentCapacity(DefaultCapacity)
16  {
17  pArray = new T[DefaultCapacity];
18  }
19 
20  // コピーコンストラクタ
21  FlexArray(const FlexArray &Arg)
22  {
23  CurrentSize = Arg.CurrentSize;
24  CurrentCapacity = Arg.CurrentCapacity;
25  pArray = new T[CurrentCapacity];
26  for (int i = 0; i < CurrentSize; i++)
27  {
28  pArray[i] = Arg[i];
29  }
30  }
31 
32  // デストラクタ
34  {
35  delete[] pArray;
36  }
37 
38  // 追加.
39  void PushBack(T NewItem)
40  {
41  if (CurrentSize + 1 > CurrentCapacity)
42  {
43  Reallocate(CurrentCapacity * 2);
44  }
45 
46  pArray[CurrentSize] = NewItem;
47  CurrentSize++;
48  }
49 
50  // 挿入.
51  void Insert(T NewItem, int Index)
52  {
53  if (CurrentSize + 1 > CurrentCapacity)
54  {
55  Reallocate(CurrentCapacity * 2);
56  }
57 
58  for (int i = CurrentSize; i > Index; i--)
59  {
60  pArray[i] = pArray[i - 1];
61  }
62  pArray[Index] = NewItem;
63  CurrentSize++;
64  }
65 
66  // リアロケート
67  void Reallocate(int Capacity)
68  {
69  CurrentCapacity = Capacity;
70  T *pTmp = new T[Capacity];
71  if (CurrentSize > Capacity)
72  {
73  CurrentSize = Capacity;
74  }
75  for (int i = 0; i < CurrentSize; i++)
76  {
77  pTmp[i] = pArray[i];
78  }
79  delete[] pArray;
80  pArray = pTmp;
81  }
82 
83  // 現在の要素数を取得.
84  int GetCurrentSize() const { return CurrentSize; }
85 
86  // 指定した要素を消去.
87  void Remove(T Item)
88  {
89  for (int i = 0; i < CurrentSize; i++)
90  {
91  if (Item == pArray[i])
92  {
93  for (int j = i; j < CurrentSize - 1; j++)
94  {
95  pArray[j] = pArray[j + 1];
96  }
97  CurrentSize--;
98  return;
99  }
100  }
101  }
102 
103  // オペレータオーバーロード
104  T operator [](int Index) const
105  {
106  return pArray[Index];
107  }
108 
109  // シリアライズ
110  void Serialize(MemoryStreamInterface *pStream);
111 
112 private:
113 
114  // 配列領域.
115  T *pArray;
116 
117  // 現在の要素数.
118  int CurrentSize;
119 
120  // 配列のキャパシティ
121  int CurrentCapacity;
122 
123 };
124 
125 template<>
127 template<>
129 template<>
131 template<>
133 template<>
135 template<>
137 template<>
139 template<>
141 
142 template<typename T>
144 {
145  pStream->Serialize(&CurrentSize);
146  if (CurrentSize > CurrentCapacity)
147  {
148  Reallocate(CurrentSize);
149  }
150 
151  for (int i = 0; i < CurrentSize; i++)
152  {
153  pArray[i].Serialize(pStream);
154  }
155 }
156 
157 
158 #endif // #ifndef __FLEXARRAY_H__
FlexArray(const FlexArray &Arg)
Definition: FlexArray.h:21
void PushBack(T NewItem)
Definition: FlexArray.h:39
~FlexArray()
Definition: FlexArray.h:33
virtual bool Serialize(s32 *pValue)=0
FlexArray(int DefaultCapacity=20)
Definition: FlexArray.h:13
void Serialize(MemoryStreamInterface *pStream)
Definition: FlexArray.h:143
void Remove(T Item)
Definition: FlexArray.h:87
void Insert(T NewItem, int Index)
Definition: FlexArray.h:51
Definition: FlexArray.h:7
Definition: MemoryStreamInterface.h:8
T operator[](int Index) const
Definition: FlexArray.h:104
int GetCurrentSize() const
Definition: FlexArray.h:84
void Reallocate(int Capacity)
Definition: FlexArray.h:67