37 #ifndef RTPKEYHASHTABLE_H
39 #define RTPKEYHASHTABLE_H
41 #include "rtpconfig.h"
52 template<
class Key,
class Element,
class GetIndex,
int hashsize>
53 class RTPKeyHashTable :
public RTPMemoryObject
57 ~RTPKeyHashTable() { Clear(); }
59 void GotoFirstElement() { curhashelem = firsthashelem; }
60 void GotoLastElement() { curhashelem = lasthashelem; }
61 bool HasCurrentElement() {
return (curhashelem == 0)?
false:
true; }
62 int DeleteCurrentElement();
63 Element &GetCurrentElement() {
return curhashelem->GetElement(); }
64 Key &GetCurrentKey() {
return curhashelem->GetKey(); }
65 int GotoElement(
const Key &k);
66 bool HasElement(
const Key &k);
67 void GotoNextElement();
68 void GotoPreviousElement();
71 int AddElement(
const Key &k,
const Element &elem);
72 int DeleteElement(
const Key &k);
81 HashElement(
const Key &k,
const Element &e,
int index):key(k),element(e) { hashprev = 0; hashnext = 0; listnext = 0; listprev = 0; hashindex = index; }
82 int GetHashIndex() {
return hashindex; }
83 Key &GetKey() {
return key; }
84 Element &GetElement() {
return element; }
86 void Dump() { std::cout <<
"\tHash index " << hashindex <<
" | Key " << key <<
" | Element " << element << std::endl; }
93 HashElement *hashprev,*hashnext;
94 HashElement *listprev,*listnext;
97 HashElement *table[hashsize];
98 HashElement *firsthashelem,*lasthashelem;
99 HashElement *curhashelem;
100 #ifdef RTP_SUPPORT_MEMORYMANAGEMENT
102 #endif // RTP_SUPPORT_MEMORYMANAGEMENT
105 template<
class Key,
class Element,
class GetIndex,
int hashsize>
106 inline RTPKeyHashTable<Key,Element,GetIndex,hashsize>::RTPKeyHashTable(RTPMemoryManager *mgr,
int memtype) : RTPMemoryObject(mgr)
108 for (
int i = 0 ; i < hashsize ; i++)
112 #ifdef RTP_SUPPORT_MEMORYMANAGEMENT
113 memorytype = memtype;
114 #endif // RTP_SUPPORT_MEMORYMANAGEMENT
117 template<
class Key,
class Element,
class GetIndex,
int hashsize>
118 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::DeleteCurrentElement()
122 HashElement *tmp1,*tmp2;
127 index = curhashelem->GetHashIndex();
128 tmp1 = curhashelem->hashprev;
129 tmp2 = curhashelem->hashnext;
138 tmp1->hashnext = tmp2;
140 tmp2->hashprev = tmp1;
145 tmp1 = curhashelem->listprev;
146 tmp2 = curhashelem->listnext;
149 firsthashelem = tmp2;
157 tmp1->listnext = tmp2;
159 tmp2->listprev = tmp1;
165 RTPDelete(curhashelem,GetMemoryManager());
169 return ERR_RTP_KEYHASHTABLE_NOCURRENTELEMENT;
173 template<
class Key,
class Element,
class GetIndex,
int hashsize>
174 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoElement(
const Key &k)
179 index = GetIndex::GetIndex(k);
180 if (index >= hashsize)
181 return ERR_RTP_KEYHASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
183 curhashelem = table[index];
185 while(!found && curhashelem != 0)
187 if (curhashelem->GetKey() == k)
190 curhashelem = curhashelem->hashnext;
193 return ERR_RTP_KEYHASHTABLE_KEYNOTFOUND;
197 template<
class Key,
class Element,
class GetIndex,
int hashsize>
198 inline bool RTPKeyHashTable<Key,Element,GetIndex,hashsize>::HasElement(
const Key &k)
204 index = GetIndex::GetIndex(k);
205 if (index >= hashsize)
210 while(!found && tmp != 0)
212 if (tmp->GetKey() == k)
220 template<
class Key,
class Element,
class GetIndex,
int hashsize>
221 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoNextElement()
224 curhashelem = curhashelem->listnext;
227 template<
class Key,
class Element,
class GetIndex,
int hashsize>
228 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoPreviousElement()
231 curhashelem = curhashelem->listprev;
234 template<
class Key,
class Element,
class GetIndex,
int hashsize>
235 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::Clear()
237 HashElement *tmp1,*tmp2;
239 for (
int i = 0 ; i < hashsize ; i++)
242 tmp1 = firsthashelem;
245 tmp2 = tmp1->listnext;
246 RTPDelete(tmp1,GetMemoryManager());
253 template<
class Key,
class Element,
class GetIndex,
int hashsize>
254 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::AddElement(
const Key &k,
const Element &elem)
258 HashElement *e,*newelem;
260 index = GetIndex::GetIndex(k);
261 if (index >= hashsize)
262 return ERR_RTP_KEYHASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
266 while(!found && e != 0)
268 if (e->GetKey() == k)
274 return ERR_RTP_KEYHASHTABLE_KEYALREADYEXISTS;
278 newelem = RTPNew(GetMemoryManager(),memorytype) HashElement(k,elem,index);
280 return ERR_RTP_OUTOFMEM;
283 table[index] = newelem;
284 newelem->hashnext = e;
286 e->hashprev = newelem;
290 if (firsthashelem == 0)
292 firsthashelem = newelem;
293 lasthashelem = newelem;
297 lasthashelem->listnext = newelem;
298 newelem->listprev = lasthashelem;
299 lasthashelem = newelem;
304 template<
class Key,
class Element,
class GetIndex,
int hashsize>
305 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::DeleteElement(
const Key &k)
309 status = GotoElement(k);
312 return DeleteCurrentElement();
316 template<
class Key,
class Element,
class GetIndex,
int hashsize>
317 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::Dump()
321 std::cout <<
"DUMPING TABLE CONTENTS:" << std::endl;
322 for (
int i = 0 ; i < hashsize ; i++)
332 std::cout <<
"DUMPING LIST CONTENTS:" << std::endl;
344 #endif // RTPKEYHASHTABLE_H
#define RTPMEM_TYPE_OTHER
Used to indicate a general kind of memory block.
Definition: rtpmemorymanager.h:45