29BEGIN_MOOTOOLS_NAMESPACE
32 #if defined(__WINDOWS__) && (_MSC_VER <= 1500)
35 #pragma warning(disable : 4181)
40 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions = CHashMethods<KEY> >
45 Active, Empty, Deleted
53 #ifdef MOOTOOLS_PRIVATE_DEBUG
55 MOOTOOLS_PRIVATE_TRACE(
traceStruct, 1,
"HashMap ratio %f\n", ActiveSize/(
float)ArraySize);
57 xDeleteArray(Array, ArraySize);
72 unsigned int GetCount()
const;
73 HashPos GetFirst()
const;
76 KEY& GetNext(HashPos& pos ,
VALUE& value)
const;
78 KEY *GetNext(HashPos& pos ,
VALUE *&value)
const;
80 unsigned int GetHashTableSize()
const;
86 #ifdef MOOTOOLS_PRIVATE_DEBUG
97 #ifdef MOOTOOLS_PRIVATE_DEBUG
104 HashPos FindActiveElement(HashPos pos)
const;
115 inline HashEntry() : Info(Empty) {}
118 unsigned int DefaultSize;
119 unsigned int ArraySize;
120 unsigned int CurrentSize;
121 unsigned int ActiveSize;
125 void AllocateArray();
127 unsigned int FindPos(
const ARG_KEY K)
const;
131 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
bool IsSameHashMap(
const CHashMap<KEY, ARG_KEY, VALUE, HashFunctions> &
Rhs1,
const CHashMap<KEY, ARG_KEY, VALUE, HashFunctions> &
Rhs2);
133 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
140 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
143 Array = xNewArray(HashEntry, ArraySize);
148 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
151 #ifdef MOOTOOLS_PRIVATE_DEBUG
158 ActiveSize = CurrentSize = 0;
167 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
170#ifdef MOOTOOLS_PRIVATE_DEBUG
178 DefaultSize =
Rhs.DefaultSize;
181 ActiveSize = CurrentSize = 0;
187 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
208 XASSERT(ActiveSize == 0 && CurrentSize == 0);
209 xDeleteArray(Array, ArraySize);
214 ActiveSize = CurrentSize = 0;
219 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
222 #ifdef MOOTOOLS_PRIVATE_DEBUG
224 MOOTOOLS_PRIVATE_TRACE(
traceStruct, 1,
"HashMap ratio %f\n", ActiveSize/(
float)ArraySize);
227 xDeleteArray(Array, ArraySize);
229 ArraySize = DefaultSize = DefaultHashSize;
230 ActiveSize = CurrentSize = 0;
235 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
238 #ifdef MOOTOOLS_PRIVATE_DEBUG
240 MOOTOOLS_PRIVATE_TRACE(
traceStruct, 1,
"HashMap ratio %f\n", ActiveSize/(
float)ArraySize);
243 ActiveSize = CurrentSize = 0;
244 for (
unsigned int i = 0;
i < ArraySize;
i++)
245 Array[
i].Info = Empty;
249 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
263 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
277 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
288 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
294 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
297 HashPos pos = hash.GetFirst();
299 while (pos != HashEnd)
301 KEY *key = hash.GetNext(pos, value);
306 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
309 HashPos pos = hash.GetFirst();
311 while (pos != HashEnd)
313 KEY *key = hash.GetNext(pos, value);
314 Insert(*key, *value);
322 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
326 unsigned int CurrentPos = HashFunctions::HashValue(X) % ArraySize;
333 if (HashFunctions::HashCompare(Array[
CurrentPos].Key, X))
355 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
365 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
373 XASSERT(ActiveSize >= 0);
384 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
389 return Insert(X,
tmp);
393 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
406 newSize = 2*(ActiveSize+1) < MinimalHashSize ? MinimalHashSize : 2*(ActiveSize+1);
410 MOOTOOLS_PRIVATE_ASSERT(CurrentSize < ArraySize/2);
416 if (CurrentSize < ArraySize/2)
419 float ratio = (ActiveSize / (
float)CurrentSize);
432 newSize = ArraySize < 251 ? 4*ArraySize : 2*ArraySize;
444 ActiveSize = CurrentSize = 0;
447 #ifdef MOOTOOLS_PRIVATE_DEBUG
460 #ifdef MOOTOOLS_PRIVATE_DEBUG
473 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
497 if (CurrentSize < ArraySize/2)
500#ifdef MOOTOOLS_PRIVATE_DEBUG
509 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
515 if (ArraySize !=
Rhs.ArraySize)
517 xDeleteArray(Array, ArraySize);
518 ArraySize =
Rhs.ArraySize;
522 for (
unsigned int i = 0;
i < ArraySize;
i++)
524 Array[
i].Info =
Rhs.Array[
i].Info;
525 if (Array[
i].Info == Active)
527 Array[
i].Key =
Rhs.Array[
i].Key;
528 Array[
i].Value =
Rhs.Array[
i].Value;
532 DefaultSize =
Rhs.DefaultSize;
533 CurrentSize =
Rhs.CurrentSize;
534 ActiveSize =
Rhs.ActiveSize;
540 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
543 return (ActiveSize == 0);
547 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
553 #ifdef MOOTOOLS_PRIVATE_DEBUG
554 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
557 if (CurrentSize == 0)
560 unsigned int size1 = 0;
561 unsigned int size2 = 0;
564 for (
unsigned int i = 0;
i < ArraySize;
i++)
566 if (Array[
i].Info == Active)
568 if (Array[
i].Info != Empty)
572 XASSERT(ActiveSize ==
size1);
573 XASSERT(CurrentSize ==
size2);
580 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
583 for (
unsigned int i = pos;
i < ArraySize;
i++)
585 if (Array[
i].Info == Active)
592 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
599 return FindActiveElement(0);
602 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
605 XASSERT(pos < ArraySize);
606 XASSERT(Array[pos].Info == Active);
610 key = Array[pos].Key;
611 value = Array[pos].Value;
612 pos = FindActiveElement(pos + 1);
615 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
618 XASSERT(pos < ArraySize);
619 XASSERT(Array[pos].Info == Active);
623 key = Array[pos].Key;
624 value = &Array[pos].Value;
625 pos = FindActiveElement(pos + 1);
628 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
631 XASSERT(pos < ArraySize);
632 XASSERT(Array[pos].Info == Active);
636 key = &Array[pos].Key;
637 value = &Array[pos].Value;
638 pos = FindActiveElement(pos + 1);
641 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
644 XASSERT(pos < ArraySize);
645 XASSERT(Array[pos].Info == Active);
650 pos = FindActiveElement(pos + 1);
656 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
659 XASSERT(pos < ArraySize);
660 XASSERT(Array[pos].Info == Active);
665 pos = FindActiveElement(pos + 1);
675 #if defined(__WINDOWS__) && (_MSC_VER <= 1500)
679 template<
class KEY,
class ARG_KEY,
class VALUE,
typename HashFunctions>
682 if (
Rhs1.GetCount() !=
Rhs2.GetCount())
687 HashPos pos =
Rhs1.GetFirst();
688 while (pos != HashEnd)
701END_MOOTOOLS_NAMESPACE
The class defines an x, y, z 3D point which can use int, float or double.
Definition 3DPoint.h:27
CHashMap is a template class that associates key to a single value through an hash table.
Definition HashMap.h:42