Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
Map.hpp
[詳解]
1// ----------------------------------------------------------------------------
6
7#pragma once
8
9#include "Utility.h"
10
11namespace alt
12{
13 namespace skeleton
14 {
18 template<class T>
19 class MapNode
20 {
21 public:
23 MapNode<T> ()
24 {
25 _prev = nullptr;
26 _next = nullptr;
27 _value = nullptr;
28 ZeroMemory (_byMD5, sizeof (_byMD5));
29 };
30
33 MapNode<T> (T& value)
34 :MapNode<T> ()
35 {
36 _value = new T (value);
37 alt::Utility::CreateMD5 ((LPBYTE)_value, sizeof (T), _byMD5);
38 };
39
41 APIENTRY ~MapNode<T> ()
42 {
43 delete _value;
44 };
45
48
51
54
56 BYTE _byMD5[32];
57 };
58
61 template<class T>
63 {
64 public:
67 {
68 _node = node;
69 };
70
72 APIENTRY ~MapIterator<T> ()
73 {
74 _node = nullptr;
75 };
76
79 T& APIENTRY operator * ()
80 {
81 return *(_node->_value);
82 };
83
87 {
88 _node = _node->_next;
89 return *this;
90 };
91
97 bool APIENTRY operator != (const MapIterator<T>& comp)
98 {
99 return _node != comp._node;
100 };
101
102 private:
103 MapIterator<T> () = delete;
105 };
106
109 template<class T>
110 class Map
111 {
112 public:
114 Map<T> ()
115 {
116 _node = new MapNode<T> ();
117 _index = nullptr;
118 _size = 0;
119 };
120
123 Map<T> (const Map<T>& base)
124 : Map<T> ()
125 {
126 operator =(base);
127 };
128
130 virtual APIENTRY ~Map<T> ()
131 {
132 Clear ();
133 delete _node;
134 };
135
139 VOID APIENTRY Add (T& item)
140 {
141 MapNode<T>* newNode = new MapNode<T> (item);
142
143 if (_size == 0)
144 {
145 _node->_prev = newNode;
146 _node->_next = newNode;
147 }
148 else
149 {
150 MapNode<T>* current = _node;
151
152 while(current != NULL)
153 {
154 MapNode<T>* next = current->_next;
155
156 if (next == NULL || ::memcmp (newNode->_byMD5, next->_byMD5, 32) < 0)
157 {
158 if (next) next->_prev = newNode;
159 current->_next = newNode;
160 if (current) newNode->_prev = current;
161 if (next) newNode->_next = next;
162 break;
163 }
164
165 if (current->_next == NULL) break;
166
167 current = current->_next;
168 }
169 }
170
171 _size += 1;
172 };
173
176 VOID APIENTRY Remove (T& item)
177 {
178 MapNode<T>* current = _node->_next;
179
180 for (;current != NULL;)
181 {
182 if (*(current->_value) == item)
183 {
184 break;
185 }
186 current = current->_next;
187 }
188
189 if (current != NULL)
190 {
191 MapNode<T>* before = current->_prev;
192 MapNode<T>* after = current->_next;
193 if (before != NULL && before->_next != NULL) before->_next = after;
194 if (after != NULL && after->_prev != NULL) after->_prev = before;
195
196 delete current;
197 _size--;
198 }
199 };
200
201 // for DEBUG
202 MapNode<T>* GetNode (SIZE_T index)
203 {
204 MapNode<T>* current = _node->_next;
205
206 for (INT i = 0; i < index; i++)
207 {
208 if (current == nullptr)
209 {
210 break;
211 }
212 current = current->_next;
213 }
214
215 return current;
216 };
217
221 T* APIENTRY Get (SIZE_T index) const
222 {
223 MapNode<T>* current = _node->_next;
224
225 for (INT i = 0; i < index; i++)
226 {
227 if (current == nullptr)
228 {
229 break;
230 }
231 current = current->_next;
232 }
233
234 return current != nullptr ? current->_value : nullptr;
235 };
236
240 T* APIENTRY operator[](SIZE_T index) const
241 {
242 return Get (index);
243 };
244
247 VOID APIENTRY operator = (const Map<T>& base)
248 {
249 Clear ();
250
251 for (auto& itr : base)
252 {
253 Add (itr);
254 }
255 }
256
260 SIZE_T APIENTRY Size () const
261 {
262 return _size;
263 };
264
266 VOID APIENTRY Clear ()
267 {
268 while (_size > 0)
269 {
270 MapNode<T>* node = _node->_next;
271 delete _node;
272 _node = node;
273 _size--;
274 }
275 };
276
279 MapIterator<T> APIENTRY begin () const
280 {
281 return MapIterator<T> (_node->_next);
282 };
283
286 MapIterator<T> APIENTRY end () const
287 {
288 return MapIterator<T> (nullptr);
289 };
290
293
294 private:
295 void Balance (int left, int center, int right, MapNode<T> balance)
296 {
297
298 };
299
301 {
302 SIZE_T center;
303
304 if (_size % 2 == 0)
305 {
306 // even
307 center = (_size + 1) / 2;
308 }
309 else
310 {
311 // odd
312 center = _size / 2;
313 }
314
315 for (MapNode<T>* item = _node->_next; item != nullptr; _node = _node->_next)
316 {
317 center--;
318
319 if (center == 0)
320 {
321 _index = item;
322 break;
323 }
324 }
325 };
326
329 SIZE_T _size;
330 };
331 }
332}
汎用的に使えるユーティリティクラス
static BOOL APIENTRY CreateMD5(LPBYTE lpbyData, DWORD dwSize, LPBYTE lpbyMD5)
データからMD5を計算
Definition: Utility.cpp:218
ポインタによるマップを具現したクラス
Definition: Map.hpp:111
T *APIENTRY operator[](SIZE_T index) const
Map<T>を配列操作で取得
Definition: Map.hpp:240
T *APIENTRY Get(SIZE_T index) const
指定したインデックスの値を取得
Definition: Map.hpp:221
MapNode< T > * GetNode(SIZE_T index)
Definition: Map.hpp:202
MapIterator< T > APIENTRY end() const
for(auto n : list){}を使用できるようにするインターフェース
Definition: Map.hpp:286
VOID APIENTRY Clear()
領域の開放
Definition: Map.hpp:266
VOID APIENTRY Remove(T &item)
Map<T>から値を削除
Definition: Map.hpp:176
VOID APIENTRY Add(T &item)
Map<T>へ値を追加
Definition: Map.hpp:139
SIZE_T _size
Definition: Map.hpp:329
VOID APIENTRY operator=(const Map< T > &base)
同じ型のMap<T>をコピー
Definition: Map.hpp:247
SIZE_T APIENTRY Size() const
サイズを取得
Definition: Map.hpp:260
void CreateIndex()
Definition: Map.hpp:300
friend MapIterator< T >
Iteratorからのアクセス権を解放
Definition: Map.hpp:292
MapNode< T > * _node
Definition: Map.hpp:327
MapNode< T > * _index
Definition: Map.hpp:328
MapIterator< T > APIENTRY begin() const
for(auto n : map){}を使用できるようにするインターフェース
Definition: Map.hpp:279
void Balance(int left, int center, int right, MapNode< T > balance)
Definition: Map.hpp:295
Node先頭〜末尾までをサーチするイテレータ
Definition: Map.hpp:63
bool APIENTRY operator!=(const MapIterator< T > &comp)
ノード末尾確認用オペレータ
Definition: Map.hpp:97
MapNode< T > * _node
Definition: Map.hpp:104
MapIterator< T > &APIENTRY operator++()
ノード移動用オペレータ
Definition: Map.hpp:86
T &APIENTRY operator*()
データアクセス用オペレータ
Definition: Map.hpp:79
双方向連結用ノードクラス
Definition: Map.hpp:20
T * _value
管理するデータ
Definition: Map.hpp:53
MapNode< T > * _prev
先頭を保持するノード
Definition: Map.hpp:47
BYTE _byMD5[32]
データのMD5
Definition: Map.hpp:56
MapNode< T > * _next
末尾を保持するノード
Definition: Map.hpp:50
Definition: DBLibrary.h:12