Mercurial > LightClone
view LightClone/Source/HashMap.h @ 71:bc8afcf7e1ec
Refactor world into game screen
author | koryspansel <koryspansel@bendbroadband.com> |
---|---|
date | Tue, 11 Oct 2011 13:20:43 -0700 |
parents | efd2b1ca5b77 |
children |
line wrap: on
line source
/* * HashMap */ #ifndef __HASHMAP_H__ #define __HASHMAP_H__ #include "Types.h" #include "HashMapIterator.h" /* * DefaultHash */ template<typename Key> struct DefaultHash { /* * operator() */ uint32 operator()(const Key& kKey) { return (uint32)(&kKey); } }; /* * HashMap */ template<typename Key, typename Value, typename HashFunction = DefaultHash<Key>, uint32 Size = 97> class HashMap { /* * Iterator */ friend class HashMapIterator<HashMap<Key, Value, HashFunction, Size>, Key, Value>; /* * Node */ struct Node { /* * kKey */ Key kKey; /* * kValue */ Value kValue; /* * pNext */ Node* pNext; /* * Node */ Node(const Key& kNodeKey) : kKey(kNodeKey), pNext(NULL) { uint8* pData = (uint8*)&kValue; for(uint32 i = 0; i < sizeof(kValue); ++i) *pData++ = 0; } }; public: /* * KeyType */ typedef Key KeyType; /* * ValueType */ typedef Value ValueType; /* * Iterator */ typedef HashMapIterator<HashMap<Key, Value, HashFunction, Size>, Key, Value> Iterator; private: /* * pTable */ Node* pTable[Size]; /* * kHash */ HashFunction kHash; public: /* * HashMap */ HashMap() { for(uint32 i = 0; i < Size; ++i) { pTable[i] = 0; } } /* * ~HashMap */ ~HashMap() { Clear(); } /* * Add */ Value* Add(const Key& kKey) { const uint32 nSlot = GetSlot(kKey); Node* pNode = new Node(kKey); pNode->pNext = pTable[nSlot]; pTable[nSlot] = pNode; return &pNode->kValue; } /* * Remove */ void Remove(const Key& kKey) { const uint32 nSlot = GetSlot(kKey); Node* pNode = pTable[nSlot]; Node* pLast = NULL; while(pNode) { if(pNode->kKey == kKey) break; pLast = pNode; pNode = pNode->pNext; } if(pNode) { if(pLast) { pLast->pNext = pNode->pNext; } else { pTable[nSlot] = pNode->pNext; } delete pNode; } } /* * Clear */ void Clear() { for(uint32 i = 0; i < Size; ++i) { Node* pNode = pTable[i]; while(pNode) { Node* pItem = pNode; pNode = pNode->pNext; delete pItem; } pTable[i] = NULL; } } /* * Find */ Value* Find(const Key& kKey) { uint32 nSlot = GetSlot(kKey); Node* pNode = pTable[nSlot]; while(pNode) { if(pNode->kKey == kKey) { return &pNode->kValue; } pNode = pNode->pNext; } return NULL; } /* * Begin */ Iterator Begin() { return Iterator(this, Size); } /* * End */ Iterator End() { return Iterator(this, Size, Size); } private: /* * GetSlot */ uint32 GetSlot(const Key& kKey) { return kHash(kKey) % Size; } }; #endif //__HASHMAP_H__