1#ifndef __DCL_HASH_MAP_T_H__
2#error "Never include <dcl/__HashMapT-GCC.h> directly; use <dcl/HashMapT.h> instead."
7#if __DCL_HAVE_THIS_FILE__
8 static const char_t __szHashMap_h__[] =
__T(
"dcl/__HashMapT-GCC.h");
10 #define __THIS_FILE__ __szHashMap_h__
13template<
typename KEY,
typename VALUE,
typename HASH_FUN = HashFun<KEY> >
24 Assoc(
const KEY& _key,
const VALUE& _value)
31 struct HashNode :
public Assoc
42 Iterator& operator++();
43 Iterator operator++(
int);
46 Assoc& operator*()
const;
50 friend class ConstIterator;
59 ConstIterator&
operator=(
const ConstIterator& _it);
60 ConstIterator& operator++();
61 ConstIterator operator++(
int);
62 bool operator==(
const ConstIterator& _it)
const;
63 bool operator!=(
const ConstIterator& _it)
const;
64 const Assoc& operator*()
const;
67 const HashNode* __pNode;
79 ConstIterator
end()
const;
87 Iterator
find(
const KEY& _key);
88 ConstIterator
find(
const KEY& _key)
const;
89 bool lookup(
const KEY& _key, VALUE& _rValue)
const;
104 friend class Iterator;
105 friend class ConstIterator;
110template<
typename KEY,
typename VALUE,
typename HASH_FUN>
122template<
typename KEY,
typename VALUE,
typename HASH_FUN>
124typename HashMap<KEY, VALUE, HASH_FUN>::Iterator&
128 __pNode = _it.__pNode;
133template<
typename KEY,
typename VALUE,
typename HASH_FUN>
139 return __pNode == _it.__pNode;
142template<
typename KEY,
typename VALUE,
typename HASH_FUN>
148 return __pNode != _it.__pNode;
151template<
typename KEY,
typename VALUE,
typename HASH_FUN>
154HashMap<KEY, VALUE, HASH_FUN>::Iterator::operator*()
const
161template<
typename KEY,
typename VALUE,
typename HASH_FUN>
165 const HashNode* _pNode,
173template<
typename KEY,
typename VALUE,
typename HASH_FUN>
178 __pNode = _it.__pNode;
182template<
typename KEY,
typename VALUE,
typename HASH_FUN>
187 __pNode = _it.__pNode;
191template<
typename KEY,
typename VALUE,
typename HASH_FUN>
197 __pNode = _it.__pNode;
202template<
typename KEY,
typename VALUE,
typename HASH_FUN>
208 return __pNode == _it.__pNode;
211template<
typename KEY,
typename VALUE,
typename HASH_FUN>
217 return __pNode != _it.__pNode;
220template<
typename KEY,
typename VALUE,
typename HASH_FUN>
231template<
typename KEY,
typename VALUE,
typename HASH_FUN>
239template<
typename KEY,
typename VALUE,
typename HASH_FUN>
241typename HashMap<KEY, VALUE, HASH_FUN>::ConstIterator
247template<
typename KEY,
typename VALUE,
typename HASH_FUN>
255template<
typename KEY,
typename VALUE,
typename HASH_FUN>
263template<
typename KEY,
typename VALUE,
typename HASH_FUN>
273template<
typename KEY,
typename VALUE,
typename HASH_FUN>
274typename HashMap<KEY, VALUE, HASH_FUN>::Iterator&
275HashMap<KEY, VALUE, HASH_FUN>::Iterator::operator++()
280 const HashNode* pOldNode = __pNode;
281 __pNode = __pNode->pNext;
284 size_t index = __pMap->bucketIndex(pOldNode->key);
285 while((__pNode ==
NULL) && (++index < __pMap->
__buckets.size()))
286 __pNode = (HashNode*)__pMap->__buckets[index];
291template<
typename KEY,
typename VALUE,
typename HASH_FUN>
295 Iterator itTemp = *
this;
304template<
typename KEY,
typename VALUE,
typename HASH_FUN>
307 __DCL_NAMESPACE_STRING __S(
HashMap),
312template<
typename KEY,
typename VALUE,
typename HASH_FUN>
318template<
typename KEY,
typename VALUE,
typename HASH_FUN>
325template<
typename KEY,
typename VALUE,
typename HASH_FUN>
332 const HashNode* pOldNode = __pNode;
333 __pNode = __pNode->pNext;
336 size_t index = __pMap->bucketIndex(pOldNode->key);
337 while((__pNode ==
NULL) && (++index < __pMap->
__buckets.size()))
338 __pNode = (HashNode*)__pMap->__buckets[index];
343template<
typename KEY,
typename VALUE,
typename HASH_FUN>
347 ConstIterator itTemp = *
this;
354template<
typename KEY,
typename VALUE,
typename HASH_FUN>
360template<
typename KEY,
typename VALUE,
typename HASH_FUN>
368template<
typename KEY,
typename VALUE,
typename HASH_FUN>
375template<
typename KEY,
typename VALUE,
typename HASH_FUN>
381template<
typename KEY,
typename VALUE,
typename HASH_FUN>
391 for(
size_t index = 0; index < _src.
__buckets.size(); index++)
393 const HashNode* pNode = (HashNode*) _src.
__buckets[index];
399 for(pNode = pNode->pNext; pNode !=
NULL; pNode = pNode->pNext)
402 pNewNode = pNewNode->pNext;
411template<
typename KEY,
typename VALUE,
typename HASH_FUN>
412typename HashMap<KEY, VALUE, HASH_FUN>::ConstIterator
415 for(
size_t i = 0; i <
__buckets.size(); i++)
423template<
typename KEY,
typename VALUE,
typename HASH_FUN>
424typename HashMap<KEY, VALUE, HASH_FUN>::Iterator
427 for(
size_t i = 0; i <
__buckets.size(); i++)
435template<
typename KEY,
typename VALUE,
typename HASH_FUN>
442 HashNode* pNode = (HashNode*)
__buckets[_index];
443 for(; pNode !=
NULL; pNode = pNode->pNext)
448template<
typename KEY,
typename VALUE,
typename HASH_FUN>
449typename HashMap<KEY, VALUE, HASH_FUN>::Iterator
453 HashNode* pNode = (HashNode*)
__buckets[index];
455 if (pNode->
key == _key) {
458 pNode = pNode->pNext;
463template<
typename KEY,
typename VALUE,
typename HASH_FUN>
464typename HashMap<KEY, VALUE, HASH_FUN>::ConstIterator
468 const HashNode* pNode = (HashNode*)
__buckets[index];
470 if (pNode->
key == _key) {
473 pNode = pNode->pNext;
478template<
typename KEY,
typename VALUE,
typename HASH_FUN>
483 HashNode* pNode = (HashNode*)
__buckets[index];
484 while(pNode !=
NULL) {
485 if (pNode->
key == _key) {
486 _rValue = pNode->
value;
489 pNode = pNode->pNext;
494template<
typename KEY,
typename VALUE,
typename HASH_FUN>
499 HashNode* pFirstNode = (HashNode*)
__buckets[index];
500 for(HashNode* pCurrentNode = pFirstNode; pCurrentNode!=
NULL;
501 pCurrentNode = pCurrentNode->pNext)
503 if (pCurrentNode->key == _key)
504 return pCurrentNode->value;
508 pNewNode->pNext = pFirstNode;
511 return pNewNode->
value;
514template<
typename KEY,
typename VALUE,
typename HASH_FUN>
522template<
typename KEY,
typename VALUE,
typename HASH_FUN>
523typename HashMap<KEY, VALUE, HASH_FUN>::HashNode*
526 HashNode* pNode = (HashNode*) malloc(
sizeof(HashNode));
532 memset((
void*) pNode, 0,
sizeof(HashNode));
534#if __DCL_HAVE_ALLOC_DEBUG
538 new(&(pNode->
key)) KEY;
539 new(&(pNode->
value)) VALUE;
541#if __DCL_HAVE_ALLOC_DEBUG
542#define new __DCL_DEBUG_NEW
549template<
typename KEY,
typename VALUE,
typename HASH_FUN>
554 _pNode->
value.~VALUE();
558template<
typename KEY,
typename VALUE,
typename HASH_FUN>
564 HashNode* pCurrentNode = (HashNode*)
__buckets[index];
565 if (pCurrentNode !=
NULL)
567 if (pCurrentNode->
key == _key)
576 HashNode* pNextNode = pCurrentNode->pNext;
577 while(pNextNode !=
NULL)
579 if (pNextNode->
key == _key)
581 pCurrentNode->pNext = pNextNode->pNext;
589 pCurrentNode = pNextNode;
590 pNextNode = pCurrentNode->pNext;
598template<
typename KEY,
typename VALUE,
typename HASH_FUN>
602 for(
size_t i = 0; i <
__buckets.size(); i++)
604 HashNode* pNode = (HashNode*)
__buckets[i];
607 HashNode* pNext = pNode->pNext;
616#if __DCL_HAVE_THIS_FILE__
618 #define __THIS_FILE__ __T(__FILE__)
DCLCAPI bool operator!=(const STRING_T &_str1, const STRING_T &_str2)
DCLCAPI bool operator==(const STRING_T &_str1, const STRING_T &_str2)
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 begin() const
ConstIterator end() const
HashNode * createNode(const KEY &_key)
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)
VALUE & operator[](const KEY &_key)
ConstIterator find(const KEY &_key) const
void initBuckets(size_t _bucketSize)
size_t erase(const KEY &_key)
void destroyNode(HashNode *_pNode)
Iterator find(const KEY &_key)
HashMap(const HashMap &_src)
size_t bucketSize() const
HashFun< String > __hashFun
size_t bucketIndex(const KEY &_key) const
virtual const std::type_info & typeInfo() const