OROCHI
 
Loading...
Searching...
No Matches
GxHashMap.h
Go to the documentation of this file.
1//===========================================================================
9//===========================================================================
10#pragma once
11
12GX_CORE_NAMESPACE_BEGIN()
13
14//===========================================================================
16//===========================================================================
17class GxHashMap : public GxClassBase
18{
19 //-----------------------------------------------------------
21 //-----------------------------------------------------------
23public:
24 GX_RTTI_CLASS(GxHashMap, GxClassBase)
25 // GxClassBase継承クラス用禁止宣言
27
28
29 static constexpr u32 DEFAULT_SPLIT_COUNT = 32;
31 static constexpr u32 BUFFER_SIZE = GxMath::VALUE_2M;
32
34 class GxPair : public GxClassBase
35 {
36 //-----------------------------------------------------------
38 //-----------------------------------------------------------
40 public:
41 // RTTI定義
42 GX_RTTI_CLASS(GxPair, GxClassBase)
43 // GxClassBase継承クラス用禁止宣言
45
46
47 //-------------------------------------------------------------
49 //-------------------------------------------------------------
51 public:
53 GxPair(void) : _key(nullptr), _pObject(nullptr) {}
54
56 //-------------------------------------------------------------
58 //-------------------------------------------------------------
60
62 constexpr void set(GX_CSTR key, void* pObject) { _key = key; _pObject = pObject; }
64 constexpr GX_CSTR getKey(void) const { return _key; }
66 constexpr void* getObject(void) const { return _pObject; }
67
69 //-------------------------------------------------------------
71 //-------------------------------------------------------------
73 private:
74 GX_CSTR _key;
75 void* _pObject;
76
78 };
79
81 //-----------------------------------------------------------
83 //-----------------------------------------------------------
85public:
87 GxHashMap(void);
89 GxHashMap(u32 splitCount, u32 keySize = 0, b32 useKeyBuffer = true, u32 keyBufferSize = BUFFER_SIZE);
91 ~GxHashMap(void) override;
92private:
94 void initialize(b32 useKeyBuffer = true, u32 keyBufferSize = BUFFER_SIZE);
95
97 //-----------------------------------------------------------
99 //-----------------------------------------------------------
101public:
103 void* find(GX_CSTR key) const;
105 void* findFromAddress(void* pKeyAddress) const;
107 GX_CSTR findKey(void* pObject) const;
109 GX_CSTR findKeyFromString(GX_CSTR pText) const;
111 void insert(GX_CSTR key, void* pObject);
113 void insertFromAddress(void* pKeyAddress, void* pObject);
115 void setObject(GX_CSTR key, void* pObject);
117 void setObjectFromAddress(void* pKeyAddress, void* pObject);
119 void erase(GX_CSTR key);
121 void eraseFromAddress(void* pKeyAddress);
123 void erase(const void* pObject);
125 void eraseAll(void);
126
127private:
129 GX_FORCE_INLINE const u32 getHashValue(GX_CSTR key) const { return (_keySize > 0 ? GxMath::getHash32((void*)key, _keySize) : GxMath::getHash32(key)) % _splitCount; }
131 GX_FORCE_INLINE u32 getHashValueFromAddress(void* pKeyAddress) const { return GxMath::getHash32(pKeyAddress, sizeof(void*)) % _splitCount; }
133 GxPair* findPair(GX_CSTR key) const;
135 GxPair* findPairFromAddress(void* pKeyAddress) const;
137 GxPair* allocatePair(GX_CSTR key, void* pObject);
139 void freePair(GxPair* pPair);
140
142 //-----------------------------------------------------------
144 //-----------------------------------------------------------
146public:
148 void* operator[](GX_CSTR key);
150 void* operator[](u32 index);
152 u32 getCount(void) const;
154 constexpr u32 getSplitCount(void) const { return _splitCount; }
156 constexpr u32 getKeySize(void) const { return _keySize; }
158 GX_FORCE_INLINE const GxArrayClassBase& getPairArray(void) const { return _pairArray; }
159
161 //-----------------------------------------------------------
163 //-----------------------------------------------------------
165private:
166 GxArrayClassBase _hashArray;
167 GxArrayClassBase _pairArray;
168 GxArrayClassBase _pairFreeArray;
169 GxArrayClassBase _pairBufferArray;
170 GxMemoryStream _keyStream;
171 u32 _splitCount;
172 u32 _keySize;
173
175};
176
177//===========================================================================
179//===========================================================================
181{
182 //-----------------------------------------------------------
184 //-----------------------------------------------------------
186public:
187 GX_RTTI_CLASS(GxHashMapW, GxClassBase)
188 // GxClassBase継承クラス用禁止宣言
190
191
192 static constexpr u32 DEFAULT_SPLIT_COUNT = 32;
193private:
195 class GxPair : public GxClassBase
196 {
197 //-----------------------------------------------------------
199 //-----------------------------------------------------------
201 public:
202 // RTTI定義
203 GX_RTTI_CLASS(GxPair, GxClassBase)
204 // GxClassBase継承クラス用禁止宣言
206
207
208 //-------------------------------------------------------------
210 //-------------------------------------------------------------
212 private:
214 GxPair(void) : _key(nullptr), _pObject(nullptr){}
215 public:
217 GxPair(GX_CWSTR key, void* pObject) : _key(key), _pObject(pObject){}
218
220 //-------------------------------------------------------------
222 //-------------------------------------------------------------
224
225 GX_CWSTR _key;
226 void* _pObject;
227
229 };
230
232 //-----------------------------------------------------------
234 //-----------------------------------------------------------
236public:
238 GxHashMapW(void);
240 GxHashMapW(u32 splitCount);
242 ~GxHashMapW(void) override;
243
245 //-----------------------------------------------------------
247 //-----------------------------------------------------------
249
251 void* find(GX_CWSTR key) const;
253 void insert(GX_CWSTR key, void* pObject);
255 void erase(GX_CWSTR key);
257 void erase(const void* pObject);
259 void eraseAll(void);
260
261private:
263 GX_FORCE_INLINE u32 getHashValue(GX_CWSTR key) const { return GxMath::getHash32(key) % _splitCount; }
265 GxListClassBase::GxNodeClassBase* findNode(GX_CWSTR key) const;
266
268 //-----------------------------------------------------------
270 //-----------------------------------------------------------
272
274 void* operator[](GX_CWSTR key);
276 GX_FORCE_INLINE u32 getCount(void) const { return _pPairList->getCount(); }
278 constexpr u32 getSplitCount(void) const { return _splitCount; }
279
281 //-----------------------------------------------------------
283 //-----------------------------------------------------------
285private:
286 GxArrayClassBase _hashArray;
287 GxListClassBase* _pPairList;
288 u32 _splitCount;
289
291};
292
293GX_CORE_NAMESPACE_END()
#define GX_PROHIBIT_CLASS_BASE(__CLASS__)
GxClassBase継承の禁止宣言
Definition GxBase.h:240
配列クラス
Definition GxArrayClassBase.h:18
オブジェクト基底クラス
Definition GxBase.h:88
ペア情報
Definition GxHashMap.h:35
GxPair(void)
デフォルトコンストラクタ
Definition GxHashMap.h:53
constexpr GX_CSTR getKey(void) const
キーを取得
Definition GxHashMap.h:64
constexpr void * getObject(void) const
オブジェクトを取得
Definition GxHashMap.h:66
constexpr void set(GX_CSTR key, void *pObject)
設定
Definition GxHashMap.h:62
連想配列クラス
Definition GxHashMap.h:18
constexpr u32 getKeySize(void) const
キーのサイズを取得
Definition GxHashMap.h:156
constexpr u32 getSplitCount(void) const
分割数を取得
Definition GxHashMap.h:154
GX_FORCE_INLINE const GxArrayClassBase & getPairArray(void) const
ペア配列を取得
Definition GxHashMap.h:158
連想配列クラス(ワイド文字列用)
Definition GxHashMap.h:181
~GxHashMapW(void) override
デストラクタ
Definition GxHashMap.cpp:482
void insert(GX_CWSTR key, void *pObject)
挿入
Definition GxHashMap.cpp:508
void * find(GX_CWSTR key) const
検索
Definition GxHashMap.cpp:493
GxHashMapW(void)
デフォルトコンストラクタ
Definition GxHashMap.cpp:462
void erase(GX_CWSTR key)
削除
Definition GxHashMap.cpp:528
static constexpr u32 DEFAULT_SPLIT_COUNT
デフォルト分割数
Definition GxHashMap.h:192
void eraseAll(void)
全削除
Definition GxHashMap.cpp:572
GxClassBase用連結リストノードクラス
Definition GxListClassBase.h:132
GxClassBase用連結リストクラス
Definition GxListClassBase.h:18
constexpr u32 getCount(void) const
要素数を取得
Definition GxListClassBase.h:78
算術演算クラス
Definition GxMath.h:84
static u32 getHash32(void *pData, u32 size)
ハッシュ値取得(32bit、データ、サイズ指定版)
Definition GxMath.cpp:241
メモリストリームクラス
Definition GxStream.h:248
32bitブーリアン
Definition GxDefine.h:173