12GX_CORE_NAMESPACE_BEGIN()
17template<class K, class V>
26 static constexpr u32 DEFAULT_SPLIT_COUNT = 32;
37 GxMap(
void) : _splitCount(DEFAULT_SPLIT_COUNT), _invalidKey(0), _invalidValue(0)
42 GxMap(K invalidKey, V invalidValue) : _splitCount(DEFAULT_SPLIT_COUNT), _invalidKey(invalidKey), _invalidValue(invalidValue)
47 GxMap(K invalidKey, V invalidValue, u32 splitCount) : _splitCount(splitCount), _invalidKey(invalidKey), _invalidValue(invalidValue)
55 void initialize(
void);
66 K findKey(V pObject)
const;
68 void insert(K key, V pObject);
70 void setObject(K key, V pObject);
74 void eraseObject(
const V pObject);
80 GX_FORCE_INLINE u32 getHashValue(K key)
const {
return key % _splitCount; }
82 GxPair* findPair(K key)
const;
84 GxPair* allocatePair(K key, V pObject);
86 void freePair(GxPair* pPair);
95 GX_FORCE_INLINE V
operator[](K key)
const {
return find(key); }
97 u32 getCount(
void)
const;
127template<
class K,
class V>
145 GX_FORCE_INLINE
void set(K key, V pObject) { _key = key; _pObject = pObject; }
147 GX_FORCE_INLINE K
getKey(
void)
const {
return _key; }
149 GX_FORCE_INLINE V
getObject(
void)
const {
return _pObject; }
166template<
class K,
class V>
169 const u32 INITIAL_PAIR_COUNT = 256;
170 auto* pBuffer = GX_NEW GxPair[INITIAL_PAIR_COUNT];
171 _pairBufferArray.addBottom(pBuffer);
172 for (u32 i = 0; i < INITIAL_PAIR_COUNT; i++)
174 _pairFreeArray.addBottom(&pBuffer[i]);
177 _hashArray.setCount(_splitCount);
178 auto* pArray = GX_NEW
GxArray[_splitCount];
179 for (u32 i = 0; i < _splitCount; i++)
181 _hashArray[i] = &pArray[i];
188template<
class K,
class V>
191 auto* pArray =
static_cast<GxArray*
>(_hashArray[0]);
192 GX_SAFE_DELETE_ARRAY(pArray);
193 for (u32 i = 0; i < _pairBufferArray.getCount(); i++)
195 auto* pBuffer =
static_cast<GxPair*
>(_pairBufferArray[i]);
196 GX_SAFE_DELETE_ARRAY(pBuffer);
205template<
class K,
class V>
208 auto* pPair = findPair(key);
211 return pPair->getObject();
213 return _invalidValue;
221template<
class K,
class V>
224 for (
auto* pPair : _pairArray)
226 if (
static_cast<GxPair*
>(pPair)->getObject() == pObject)
228 return static_cast<GxPair*
>(pPair)->getKey();
239template<
class K,
class V>
242 const auto keyValue = getHashValue(key);
243 auto* pPair = allocatePair(key, pObject);
244 static_cast<GxArray*
>(_hashArray[keyValue])->addBottom(pPair);
252template<
class K,
class V>
255 auto* pPair = findPair(key);
258 pPair->set(pPair->getKey(), pObject);
266template<
class K,
class V>
269 const auto keyValue = getHashValue(key);
270 auto* pArray =
static_cast<GxArray*
>(_hashArray[keyValue]);
271 for (u32 i = 0; i < pArray->getCount(); i++)
273 auto* pPair =
static_cast<GxPair*
>(pArray->getObject(i));
274 if (pPair->getKey() == key)
287template<
class K,
class V>
290 for (u32 i = 0; i < _hashArray.getCount(); i++)
292 auto* pArray =
static_cast<GxArray*
>(_hashArray[i]);
293 for (u32 j = 0; j < pArray->getCount(); j++)
295 auto* pPair =
static_cast<GxPair*
>(pArray->getObject(j));
296 if (pPair->getObject() == pObject)
307template<
class K,
class V>
310 for (u32 i = 0; i < _hashArray.getCount(); i++)
312 auto* pArray =
static_cast<GxArray*
>(_hashArray[i]);
313 for (u32 j = 0; j < pArray->getCount(); j++)
315 auto* pPair =
static_cast<GxPair*
>(pArray->getObject(j));
328template<
class K,
class V>
331 if (_pairFreeArray.getCount() == 0)
334 u32 size = _pairArray.getCount() * 2;
335 auto* pBuffer = GX_NEW GxPair[size];
336 _pairBufferArray.addBottom(pBuffer);
337 for (u32 i = 0; i < size; i++)
339 _pairFreeArray.addBottom(&pBuffer[i]);
342 auto* pPair =
static_cast<GxPair*
>(_pairFreeArray.pop());
343 pPair->set(key, pObject);
344 _pairArray.addBottom(pPair);
352template<
class K,
class V>
355 GX_ASSERT(pPair,
"pPair is nullptr");
356 GX_ASSERT(_pairArray.indexOf(pPair) >= 0,
"pPair is invalid");
358 _pairArray.removeFirst(pPair);
359 _pairFreeArray.addBottom(pPair);
366template<
class K,
class V>
370 for (u32 i = 0; i < _hashArray.getCount(); i++)
372 count +=
static_cast<GxArray*
>(_hashArray[i])->getCount();
382template<
class K,
class V>
385 const auto keyValue = getHashValue(key);
386 auto* pArray =
static_cast<GxArray*
>(_hashArray[keyValue]);
387 for (u32 j = 0; j < pArray->getCount(); j++)
389 auto* pPair =
static_cast<GxPair*
>(pArray->getObject(j));
390 if(pPair->getKey() == key)
398GX_CORE_NAMESPACE_END()
配列クラス
Definition GxArrayClassBase.h:18
配列クラス
Definition GxArray.h:18
GX_FORCE_INLINE void removeAll(void)
全削除
Definition GxArray.h:97
ペア情報
Definition GxMap.h:129
GX_FORCE_INLINE V getObject(void) const
オブジェクトを取得
Definition GxMap.h:149
GX_FORCE_INLINE void set(K key, V pObject)
設定
Definition GxMap.h:145
GxPair(void)
デフォルトコンストラクタ
Definition GxMap.h:136
GX_FORCE_INLINE K getKey(void) const
キーを取得
Definition GxMap.h:147
連想配列クラス
Definition GxMap.h:19
void setObject(K key, V pObject)
オブジェクトを設定
Definition GxMap.h:253
GX_FORCE_INLINE b32 isInvalidKey(K key) const
無効なキーか判定
Definition GxMap.h:103
GX_FORCE_INLINE b32 isInvalidValue(V value) const
無効な値か判定
Definition GxMap.h:105
u32 getCount(void) const
要素数を取得
Definition GxMap.h:367
GxMap(K invalidKey, V invalidValue, u32 splitCount)
コンストラクタ
Definition GxMap.h:47
K findKey(V pObject) const
キーを検索
Definition GxMap.h:222
GX_FORCE_INLINE const GxArray & getPairArray(void) const
ペア配列を取得
Definition GxMap.h:101
GxMap(K invalidKey, V invalidValue)
コンストラクタ
Definition GxMap.h:42
constexpr u32 getSplitCount(void) const
分割数を取得
Definition GxMap.h:99
void eraseAll(void)
全削除
Definition GxMap.h:308
GX_FORCE_INLINE V operator[](K key) const
配列演算子
Definition GxMap.h:95
~GxMap(void)
デストラクタ
Definition GxMap.h:189
void insert(K key, V pObject)
挿入
Definition GxMap.h:240
void erase(K key)
削除
Definition GxMap.h:267
void eraseObject(const V pObject)
削除
Definition GxMap.h:288
V find(K key) const
検索
Definition GxMap.h:206
GxMap(void)
デフォルトコンストラクタ
Definition GxMap.h:37
32bitブーリアン
Definition GxDefine.h:173