Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
Array.hpp
[詳解]
1// ----------------------------------------------------------------------------
6
7#pragma once
8
9#include "HeapMemory.h"
10
11namespace alt
12{
13 namespace skeleton
14 {
18 template<class T>
19 class Array
20 {
21 public:
23 Array<T> ()
24 {
26 _array = NULL;
27 _size = 0;
28 _reserve = 0;
29 };
30
33 Array<T> (IMemory* memory)
34 {
35 if (memory == NULL)
37 else
38 _memory = memory;
39 _array = NULL;
40 _size = 0;
41 _reserve = 0;
42 }
43
46 Array<T> (const Array<T>& base)
47 {
48 operator =(base);
49 };
50
52 virtual APIENTRY ~Array<T> ()
53 {
54 Clear ();
55 auto basicMemory = dynamic_cast<alt::BasicMemory*>(_memory);
56 if (basicMemory)
57 {
58 delete basicMemory;
59 }
60 _memory = NULL;
61 };
62
66 T* APIENTRY Get (SIZE_T index) const
67 {
68 if (index >= _size) return (T*)NULL;
69 return &(_array[index]);
70 };
71
75 T* APIENTRY operator[](SIZE_T index) const
76 {
77 return Get (index);
78 };
79
83 VOID APIENTRY Add (T& item)
84 {
85 Extend ();
86
87 CopyMemory (&_array[_size], &item, sizeof (LPVOID)); // ★☆★
88 _array[_size] = item;
89 _size++;
90 };
91
95 VOID APIENTRY Insert (T& item, SIZE_T position)
96 {
97 if (position > _size) return;
98
99 Extend ();
100
101 MoveMemory (
102 &_array[position + 1],
103 &_array[position],
104 (_size - position) * sizeof (T));
105 ZeroMemory (&_array[position], sizeof (T));
106 CopyMemory (&_array[position], &item, sizeof (LPVOID)); // ★☆★
107 _array[position] = item;
108
109 _size++;
110 };
111
114 VOID APIENTRY Remove (SIZE_T position)
115 {
116 if (position >= _size) return;
117
118 //void(**vtable)() = *(void(***)())(&_array[position]);
119 //vtable[0] ();
120 (&_array[position])->~T ();
121
122 CopyMemory (
123 &_array[position],
124 &_array[position + 1],
125 (_size - position) * sizeof (T));
126
127 _size--;
128 _reserve++;
129 };
130
132 VOID APIENTRY Shurink ()
133 {
134 if (_reserve == 0) return;
135
136 T* newArray = static_cast<T*>(_memory->Allocate (sizeof (T) * _size));
137 CopyMemory (newArray, _array, (sizeof (T) * _size));
139 // ちょっと強引な気もする。
140 auto heapMemory = dynamic_cast<alt::HeapMemory*>(_memory);
141 if (heapMemory != NULL) heapMemory->Compact ();
142 _array = newArray;
143 _reserve = 0;
144 };
145
148 VOID APIENTRY Reserve (SIZE_T size)
149 {
150 Extend (size);
151 };
152
154 VOID APIENTRY Clear ()
155 {
156 if (_size)
157 {
158 for (SIZE_T i = 0; i < Size (); i++)
159 {
160 (&_array[i])->~T ();
161 }
163 _array = NULL;
164 _size = 0;
165 }
166 };
167
170 VOID APIENTRY operator = (const Array<T>& base)
171 {
172 Clear ();
173
174 if (dynamic_cast<alt::BasicMemory*>(base._memory))
175 _memory = new alt::BasicMemory ();
176 else
177 _memory = base._memory;
178 _size = base._size;
179 _array = static_cast<T*>(_memory->Allocate (sizeof (T) * _size));
180 for (SIZE_T i = 0; i < _size; i++)
181 {
182 CopyMemory (&_array[i], &base._array[i], sizeof (LPVOID)); // ★☆★
183 _array[i] = base._array[i];
184 }
185 _reserve = 0;
186 };
187
190 VOID APIENTRY operator += (const Array<T>& base)
191 {
192 Extend (base._size - _reserve);
193
194 for (SIZE_T i = 0; i < base._size; i++)
195 {
196 CopyMemory (&_array[_size + i], &base._array[i], sizeof (LPVOID)); // ★☆★
197 _array[_size + i] = base._array[i];
198 }
199 _size += base._size;
200 _reserve = 0;
201 };
202
206 SIZE_T APIENTRY Size () const
207 {
208 return _size;
209 };
210
213 T* APIENTRY begin ()
214 {
215 return &_array[0];
216 };
217
220 T* APIENTRY end ()
221 {
222 return &_array[_size];
223 };
224
227 const T* APIENTRY begin () const
228 {
229 return &_array[0];
230 };
231
234 const T* APIENTRY end () const
235 {
236 return &_array[_size];
237 };
238
239 private:
240 VOID APIENTRY Extend (SIZE_T size = 1)
241 {
242 // size reserve
243 // --+-----+--------+
244 // #1| 0| 0|
245 // #2| n| 0|
246 // #3| 0| n|
247 // #4| n| n|
248
249 if (_size == 0 && _reserve == 0)
250 {
251 // #1 初期状態
252 _array = static_cast<T*>(_memory->Allocate (sizeof (T) * size));
253 }
254 else if (_size > 0 && _reserve == 0)
255 {
256 // #2 確保済み、リザーブなし
257 _array = static_cast<T*>(
258 _memory->Reallocate (_array, sizeof (T) * (_size + size)));
259 }
260 else if (_size == 0 && _reserve > 0)
261 {
262 // #3 確保なし、リザーブあり
263 _reserve--;
264 }
265 else
266 {
267 // #4 確保済み、リザーブあり
268 _reserve--;
269 }
270 };
271
274 SIZE_T _size;
275 SIZE_T _reserve;
276 };
277 }
278}
ヒープメモリに関するAPIを集約したクラス
#define size
malloc/realloc/freeを使った標準的なメモリクラス
Definition: HeapMemory.h:17
ヒープメモリに関するAPIを集約したクラス
Definition: HeapMemory.h:46
SIZE_T APIENTRY Compact() const
取得したヒープ領域の整理
Definition: HeapMemory.cpp:110
サイズ可変の配列を具現したクラス
Definition: Array.hpp:20
T *APIENTRY Get(SIZE_T index) const
指定したインデックスの値を取得
Definition: Array.hpp:66
VOID APIENTRY Reserve(SIZE_T size)
事前に空の領域を取得
Definition: Array.hpp:148
T *APIENTRY end()
for(auto n : array){}を使用できるようにするインターフェース
Definition: Array.hpp:220
const T *APIENTRY end() const
for(auto& n : array){}を使用できるようにするインターフェース
Definition: Array.hpp:234
VOID APIENTRY Extend(SIZE_T size=1)
Definition: Array.hpp:240
VOID APIENTRY operator+=(const Array< T > &base)
同じ型のArray<T>を末尾に追加
Definition: Array.hpp:190
VOID APIENTRY operator=(const Array< T > &base)
同じ型のArray<T>をコピー
Definition: Array.hpp:170
T *APIENTRY begin()
for(auto n : array){}を使用できるようにするインターフェース
Definition: Array.hpp:213
VOID APIENTRY Clear()
領域の開放
Definition: Array.hpp:154
IMemory * _memory
Definition: Array.hpp:272
VOID APIENTRY Remove(SIZE_T position)
Array<T>から値を削除
Definition: Array.hpp:114
VOID APIENTRY Shurink()
削除を繰り返すことで発生するリザーブ領域を解放
Definition: Array.hpp:132
VOID APIENTRY Insert(T &item, SIZE_T position)
Array<T>へ値を挿入
Definition: Array.hpp:95
const T *APIENTRY begin() const
for(auto& n : array){}を使用できるようにするインターフェース
Definition: Array.hpp:227
VOID APIENTRY Add(T &item)
Array<T>へ値を追加
Definition: Array.hpp:83
T *APIENTRY operator[](SIZE_T index) const
Array<T>を配列操作で取得
Definition: Array.hpp:75
SIZE_T APIENTRY Size() const
サイズを取得
Definition: Array.hpp:206
メモリの獲得・解放のインターフェースクラス
Definition: Memory.h:20
virtual LPVOID APIENTRY Allocate(SIZE_T bytes, DWORD dwFlags=MEM_ZERO)=0
メモリの取得
virtual LPVOID APIENTRY Reallocate(LPVOID lpvMem, SIZE_T bytes, DWORD dwFlags=MEM_ZERO)=0
取得メモリの拡大
virtual BOOL APIENTRY Free(LPVOID lpvMem)=0
メモリの返却
Definition: DBLibrary.h:12