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
55 JRTPLIB_NO_COPY(RTPKeyHashTable)
58 ~RTPKeyHashTable() { Clear(); }
60 void GotoFirstElement() { curhashelem = firsthashelem; }
61 void GotoLastElement() { curhashelem = lasthashelem; }
62 bool HasCurrentElement() {
return (curhashelem == 0)?
false:
true; }
63 int DeleteCurrentElement();
64 Element &GetCurrentElement() {
return curhashelem->GetElement(); }
65 Key &GetCurrentKey() {
return curhashelem->GetKey(); }
66 int GotoElement(
const Key &k);
67 bool HasElement(
const Key &k);
68 void GotoNextElement();
69 void GotoPreviousElement();
72 int AddElement(
const Key &k,
const Element &elem);
73 int DeleteElement(
const Key &k);
82 HashElement(
const Key &k,
const Element &e,
int index):key(k),element(e) { hashprev = 0; hashnext = 0; listnext = 0; listprev = 0; hashindex = index; }
83 int GetHashIndex() {
return hashindex; }
84 Key &GetKey() {
return key; }
85 Element &GetElement() {
return element; }
87 void Dump() { std::cout <<
"\tHash index " << hashindex <<
" | Key " << key <<
" | Element " << element << std::endl; }
94 HashElement *hashprev,*hashnext;
95 HashElement *listprev,*listnext;
98 HashElement *table[hashsize];
99 HashElement *firsthashelem,*lasthashelem;
100 HashElement *curhashelem;
101 #ifdef RTP_SUPPORT_MEMORYMANAGEMENT
106 template<
class Key,
class Element,
class GetIndex,
int hashsize>
107 inline RTPKeyHashTable<Key,Element,GetIndex,hashsize>::RTPKeyHashTable(RTPMemoryManager *mgr,
int memtype) : RTPMemoryObject(mgr)
109 JRTPLIB_UNUSED(memtype);
111 for (
int i = 0 ; i < hashsize ; i++)
115 #ifdef RTP_SUPPORT_MEMORYMANAGEMENT
116 memorytype = memtype;
120 template<
class Key,
class Element,
class GetIndex,
int hashsize>
121 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::DeleteCurrentElement()
125 HashElement *tmp1,*tmp2;
130 index = curhashelem->GetHashIndex();
131 tmp1 = curhashelem->hashprev;
132 tmp2 = curhashelem->hashnext;
141 tmp1->hashnext = tmp2;
143 tmp2->hashprev = tmp1;
148 tmp1 = curhashelem->listprev;
149 tmp2 = curhashelem->listnext;
152 firsthashelem = tmp2;
160 tmp1->listnext = tmp2;
162 tmp2->listprev = tmp1;
168 RTPDelete(curhashelem,GetMemoryManager());
172 return ERR_RTP_KEYHASHTABLE_NOCURRENTELEMENT;
176 template<
class Key,
class Element,
class GetIndex,
int hashsize>
177 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoElement(
const Key &k)
182 index = GetIndex::GetIndex(k);
183 if (index >= hashsize)
184 return ERR_RTP_KEYHASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
186 curhashelem = table[index];
188 while(!found && curhashelem != 0)
190 if (curhashelem->GetKey() == k)
193 curhashelem = curhashelem->hashnext;
196 return ERR_RTP_KEYHASHTABLE_KEYNOTFOUND;
200 template<
class Key,
class Element,
class GetIndex,
int hashsize>
201 inline bool RTPKeyHashTable<Key,Element,GetIndex,hashsize>::HasElement(
const Key &k)
207 index = GetIndex::GetIndex(k);
208 if (index >= hashsize)
213 while(!found && tmp != 0)
215 if (tmp->GetKey() == k)
223 template<
class Key,
class Element,
class GetIndex,
int hashsize>
224 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoNextElement()
227 curhashelem = curhashelem->listnext;
230 template<
class Key,
class Element,
class GetIndex,
int hashsize>
231 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoPreviousElement()
234 curhashelem = curhashelem->listprev;
237 template<
class Key,
class Element,
class GetIndex,
int hashsize>
238 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::Clear()
240 HashElement *tmp1,*tmp2;
242 for (
int i = 0 ; i < hashsize ; i++)
245 tmp1 = firsthashelem;
248 tmp2 = tmp1->listnext;
249 RTPDelete(tmp1,GetMemoryManager());
256 template<
class Key,
class Element,
class GetIndex,
int hashsize>
257 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::AddElement(
const Key &k,
const Element &elem)
261 HashElement *e,*newelem;
263 index = GetIndex::GetIndex(k);
264 if (index >= hashsize)
265 return ERR_RTP_KEYHASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
269 while(!found && e != 0)
271 if (e->GetKey() == k)
277 return ERR_RTP_KEYHASHTABLE_KEYALREADYEXISTS;
281 newelem = RTPNew(GetMemoryManager(),memorytype) HashElement(k,elem,index);
283 return ERR_RTP_OUTOFMEM;
286 table[index] = newelem;
287 newelem->hashnext = e;
289 e->hashprev = newelem;
293 if (firsthashelem == 0)
295 firsthashelem = newelem;
296 lasthashelem = newelem;
300 lasthashelem->listnext = newelem;
301 newelem->listprev = lasthashelem;
302 lasthashelem = newelem;
307 template<
class Key,
class Element,
class GetIndex,
int hashsize>
308 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::DeleteElement(
const Key &k)
312 status = GotoElement(k);
315 return DeleteCurrentElement();
319 template<
class Key,
class Element,
class GetIndex,
int hashsize>
320 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::Dump()
324 std::cout <<
"DUMPING TABLE CONTENTS:" << std::endl;
325 for (
int i = 0 ; i < hashsize ; i++)
335 std::cout <<
"DUMPING LIST CONTENTS:" << std::endl;
#define RTPMEM_TYPE_OTHER
Used to indicate a general kind of memory block.
Definition: rtpmemorymanager.h:45