14#ifndef __DCL_HASH_MAP_T_H__
15#error "Never include <dcl/__HashMapT-MSC.h> directly; use <dcl/HashMapT.h> instead."
20#if __DCL_HAVE_THIS_FILE__
21 static const char_t __szHashMap_h__[] =
__T(
"dcl/__HashMapT-MSC.h");
23 #define __THIS_FILE__ __szHashMap_h__
26template<
typename KEY,
typename VALUE,
typename HASH_FUN = HashFun<KEY> >
37 Assoc(
const KEY& _key,
const VALUE& _value)
44 struct HashNode :
public Assoc
59 Iterator& operator=(
const Iterator& _it)
61 __pNode = _it.__pNode;
66 Iterator& operator++()
71 const HashNode* pOldNode = __pNode;
72 __pNode = __pNode->pNext;
75 size_t index = __pMap->bucketIndex(pOldNode->key);
76 while((__pNode ==
NULL) && (++index < __pMap->
__buckets.size()))
77 __pNode = (HashNode*)__pMap->__buckets[index];
82 Iterator operator++(
int)
84 Iterator itTemp = *
this;
89 bool operator==(
const Iterator& _it)
const
91 return __pNode != _it.__pNode;
94 bool operator!=(
const Iterator& _it)
const
96 return __pNode != _it.__pNode;
99 Assoc& operator*()
const
107 friend typename ConstIterator;
121 __pNode = _it.__pNode;
127 __pNode = _it.__pNode;
131 ConstIterator& operator=(
const ConstIterator& _it)
133 __pNode = _it.__pNode;
138 ConstIterator& operator++()
143 const HashNode* pOldNode = __pNode;
144 __pNode = __pNode->pNext;
147 size_t index = __pMap->bucketIndex(pOldNode->key);
148 while((__pNode ==
NULL) && (++index < __pMap->
__buckets.size()))
149 __pNode = (HashNode*)__pMap->__buckets[index];
154 ConstIterator operator++(
int)
156 ConstIterator itTemp = *
this;
161 bool operator==(
const ConstIterator& _it)
const
163 return __pNode == _it.__pNode;
166 bool operator!=(
const ConstIterator& _it)
const
168 return __pNode != _it.__pNode;
171 const Assoc& operator*()
const
178 const HashNode* __pNode;
190 ConstIterator
end()
const;
198 Iterator
find(
const KEY& _key);
199 ConstIterator
find(
const KEY& _key)
const;
200 bool lookup(
const KEY& _key, VALUE& _rValue)
const;
216 friend class Iterator;
217 friend class ConstIterator;
222template<
typename KEY,
typename VALUE,
typename HASH_FUN>
224typename HashMap<KEY, VALUE, HASH_FUN>::Iterator
227 return Iterator(
NULL,
this);
230template<
typename KEY,
typename VALUE,
typename HASH_FUN>
232typename HashMap<KEY, VALUE, HASH_FUN>::ConstIterator
235 return ConstIterator(
NULL,
this);
238template<
typename KEY,
typename VALUE,
typename HASH_FUN>
243 return __buckets.size();
246template<
typename KEY,
typename VALUE,
typename HASH_FUN>
254template<
typename KEY,
typename VALUE,
typename HASH_FUN>
266template<
typename KEY,
typename VALUE,
typename HASH_FUN>
269 __DCL_NAMESPACE_STRING __S(
HashMap),
274template<
typename KEY,
typename VALUE,
typename HASH_FUN>
280template<
typename KEY,
typename VALUE,
typename HASH_FUN>
287template<
typename KEY,
typename VALUE,
typename HASH_FUN>
293template<
typename KEY,
typename VALUE,
typename HASH_FUN>
301template<
typename KEY,
typename VALUE,
typename HASH_FUN>
309template<
typename KEY,
typename VALUE,
typename HASH_FUN>
315template<
typename KEY,
typename VALUE,
typename HASH_FUN>
325 for(
size_t index = 0; index < _src.
__buckets.size(); index++)
327 const HashNode* pNode = (HashNode*) _src.
__buckets[index];
331 pNewNode->value = pNode->value;
333 for(pNode = pNode->pNext; pNode !=
NULL; pNode = pNode->pNext)
336 pNewNode = pNewNode->pNext;
337 pNewNode->value = pNode->value;
345template<
typename KEY,
typename VALUE,
typename HASH_FUN>
346typename HashMap<KEY, VALUE, HASH_FUN>::ConstIterator
349 for(
size_t i = 0; i <
__buckets.size(); i++)
357template<
typename KEY,
typename VALUE,
typename HASH_FUN>
358typename HashMap<KEY, VALUE, HASH_FUN>::Iterator
361 for(
size_t i = 0; i <
__buckets.size(); i++)
369template<
typename KEY,
typename VALUE,
typename HASH_FUN>
376 HashNode* pNode = (HashNode*)
__buckets[_index];
377 for(; pNode !=
NULL; pNode = pNode->pNext)
382template<
typename KEY,
typename VALUE,
typename HASH_FUN>
383typename HashMap<KEY, VALUE, HASH_FUN>::Iterator
387 HashNode* pNode = (HashNode*)
__buckets[index];
389 if (pNode->key == _key) {
392 pNode = pNode->pNext;
397template<
typename KEY,
typename VALUE,
typename HASH_FUN>
398typename HashMap<KEY, VALUE, HASH_FUN>::ConstIterator
402 const HashNode* pNode = (HashNode*)
__buckets[index];
404 if (pNode->key == _key) {
407 pNode = pNode->pNext;
412template<
typename KEY,
typename VALUE,
typename HASH_FUN>
417 HashNode* pNode = (HashNode*)
__buckets[index];
418 while(pNode !=
NULL) {
419 if (pNode->key == _key) {
420 _rValue = pNode->value;
423 pNode = pNode->pNext;
428template<
typename KEY,
typename VALUE,
typename HASH_FUN>
433 HashNode* pFirstNode = (HashNode*)
__buckets[index];
434 for(HashNode* pCurrentNode = pFirstNode; pCurrentNode!=
NULL;
435 pCurrentNode = pCurrentNode->pNext)
437 if (pCurrentNode->key == _key)
438 return pCurrentNode->value;
442 pNewNode->pNext = pFirstNode;
445 return pNewNode->value;
448template<
typename KEY,
typename VALUE,
typename HASH_FUN>
456template<
typename KEY,
typename VALUE,
typename HASH_FUN>
457typename HashMap<KEY, VALUE, HASH_FUN>::HashNode*
460 HashNode* pNode = (HashNode*) malloc(
sizeof(HashNode));
466 memset(pNode, 0,
sizeof(HashNode));
468#if __DCL_HAVE_ALLOC_DEBUG
472 new(&(pNode->key)) KEY;
473 new(&(pNode->value)) VALUE;
475#if __DCL_HAVE_ALLOC_DEBUG
476#define new __DCL_DEBUG_NEW
483template<
typename KEY,
typename VALUE,
typename HASH_FUN>
488 _pNode->value.~VALUE();
492template<
typename KEY,
typename VALUE,
typename HASH_FUN>
498 HashNode* pCurrentNode = (HashNode*)
__buckets[index];
499 if (pCurrentNode !=
NULL)
501 if (pCurrentNode->key == _key)
510 HashNode* pNextNode = pCurrentNode->pNext;
511 while(pNextNode !=
NULL)
513 if (pNextNode->key == _key)
515 pCurrentNode->pNext = pNextNode->pNext;
523 pCurrentNode = pNextNode;
524 pNextNode = pCurrentNode->pNext;
532template<
typename KEY,
typename VALUE,
typename HASH_FUN>
536 for(
size_t i = 0; i <
__buckets.size(); i++)
538 HashNode* pNode = (HashNode*)
__buckets[i];
541 HashNode* pNext = pNode->pNext;
550#if __DCL_HAVE_THIS_FILE__
552 #define __THIS_FILE__ __T(__FILE__)
DCLCAPI size_t DCLGetNextPrimNumber(size_t _n)
#define DECLARE_CLASSINFO(class_name)
#define CLASSINFO(class_name)
#define __DCL_ASSERT(expr)
void CharsetConvertException *__fields clear()
ConstIterator end() const
ConstIterator begin() const
ConstIterator end() const
HashNode * createNode(const KEY &_key)
const HashMap & operator=(const HashMap &_src)
const HashMap & operator=(const HashMap &_src)
size_t sizeOfBucket(size_t _index) const
friend class ConstIterator
bool lookup(const KEY &_key, VALUE &_rValue) const
HashMap(size_t _bucketSize=21)
ConstIterator begin() const
VALUE & operator[](const KEY &_key)
void initBuckets(size_t _bucketSize)
size_t sizeOfBucket(size_t index) const
ConstIterator find(const KEY &_key) const
size_t erase(const KEY &_key)
void destroyNode(HashNode *_pNode)
Iterator find(const KEY &_key)
HashMap(const HashMap &_src)
HashNode * createNode(const KEY &_key)
size_t bucketSize() const
Iterator find(const KEY &_key)
size_t erase(const Iterator &_it)
HashFun< String > __hashFun
size_t bucketIndex(const KEY &_key) const
virtual const std::type_info & typeInfo() const