33 #ifndef RTPHASHTABLE_H
35 #define RTPHASHTABLE_H
52 template<
class Element,
class GetIndex,
int hashsize>
53 class RTPHashTable :
public RTPMemoryObject
57 ~RTPHashTable() { 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 int GotoElement(
const Element &e);
65 bool HasElement(
const Element &e);
66 void GotoNextElement();
67 void GotoPreviousElement();
70 int AddElement(
const Element &elem);
71 int DeleteElement(
const Element &elem);
80 HashElement(
const Element &e,
int index):element(e) { hashprev = 0; hashnext = 0; listnext = 0; listprev = 0; hashindex = index; }
81 int GetHashIndex() {
return hashindex; }
82 Element &GetElement() {
return element; }
84 void Dump() { std::cout <<
"\tHash index " << hashindex <<
" | Element " << element << std::endl; }
90 HashElement *hashprev,*hashnext;
91 HashElement *listprev,*listnext;
94 HashElement *table[hashsize];
95 HashElement *firsthashelem,*lasthashelem;
96 HashElement *curhashelem;
97 #ifdef RTP_SUPPORT_MEMORYMANAGEMENT
99 #endif // RTP_SUPPORT_MEMORYMANAGEMENT
102 template<
class Element,
class GetIndex,
int hashsize>
103 inline RTPHashTable<Element,GetIndex,hashsize>::RTPHashTable(RTPMemoryManager *mgr,
int memtype) : RTPMemoryObject(mgr)
105 for (
int i = 0 ; i < hashsize ; i++)
109 #ifdef RTP_SUPPORT_MEMORYMANAGEMENT
110 memorytype = memtype;
111 #endif // RTP_SUPPORT_MEMORYMANAGEMENT
114 template<
class Element,
class GetIndex,
int hashsize>
115 inline int RTPHashTable<Element,GetIndex,hashsize>::DeleteCurrentElement()
119 HashElement *tmp1,*tmp2;
124 index = curhashelem->GetHashIndex();
125 tmp1 = curhashelem->hashprev;
126 tmp2 = curhashelem->hashnext;
135 tmp1->hashnext = tmp2;
137 tmp2->hashprev = tmp1;
142 tmp1 = curhashelem->listprev;
143 tmp2 = curhashelem->listnext;
146 firsthashelem = tmp2;
154 tmp1->listnext = tmp2;
156 tmp2->listprev = tmp1;
162 RTPDelete(curhashelem,GetMemoryManager());
166 return ERR_RTP_HASHTABLE_NOCURRENTELEMENT;
170 template<
class Element,
class GetIndex,
int hashsize>
171 inline int RTPHashTable<Element,GetIndex,hashsize>::GotoElement(
const Element &e)
176 index = GetIndex::GetIndex(e);
177 if (index >= hashsize)
178 return ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
180 curhashelem = table[index];
182 while(!found && curhashelem != 0)
184 if (curhashelem->GetElement() == e)
187 curhashelem = curhashelem->hashnext;
190 return ERR_RTP_HASHTABLE_ELEMENTNOTFOUND;
194 template<
class Element,
class GetIndex,
int hashsize>
195 inline bool RTPHashTable<Element,GetIndex,hashsize>::HasElement(
const Element &e)
201 index = GetIndex::GetIndex(e);
202 if (index >= hashsize)
207 while(!found && tmp != 0)
209 if (tmp->GetElement() == e)
217 template<
class Element,
class GetIndex,
int hashsize>
218 inline void RTPHashTable<Element,GetIndex,hashsize>::GotoNextElement()
221 curhashelem = curhashelem->listnext;
224 template<
class Element,
class GetIndex,
int hashsize>
225 inline void RTPHashTable<Element,GetIndex,hashsize>::GotoPreviousElement()
228 curhashelem = curhashelem->listprev;
231 template<
class Element,
class GetIndex,
int hashsize>
232 inline void RTPHashTable<Element,GetIndex,hashsize>::Clear()
234 HashElement *tmp1,*tmp2;
236 for (
int i = 0 ; i < hashsize ; i++)
239 tmp1 = firsthashelem;
242 tmp2 = tmp1->listnext;
243 RTPDelete(tmp1,GetMemoryManager());
250 template<
class Element,
class GetIndex,
int hashsize>
251 inline int RTPHashTable<Element,GetIndex,hashsize>::AddElement(
const Element &elem)
255 HashElement *e,*newelem;
257 index = GetIndex::GetIndex(elem);
258 if (index >= hashsize)
259 return ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
263 while(!found && e != 0)
265 if (e->GetElement() == elem)
271 return ERR_RTP_HASHTABLE_ELEMENTALREADYEXISTS;
275 newelem = RTPNew(GetMemoryManager(),memorytype) HashElement(elem,index);
277 return ERR_RTP_OUTOFMEM;
280 table[index] = newelem;
281 newelem->hashnext = e;
283 e->hashprev = newelem;
287 if (firsthashelem == 0)
289 firsthashelem = newelem;
290 lasthashelem = newelem;
294 lasthashelem->listnext = newelem;
295 newelem->listprev = lasthashelem;
296 lasthashelem = newelem;
301 template<
class Element,
class GetIndex,
int hashsize>
302 inline int RTPHashTable<Element,GetIndex,hashsize>::DeleteElement(
const Element &elem)
306 status = GotoElement(elem);
309 return DeleteCurrentElement();
313 template<
class Element,
class GetIndex,
int hashsize>
314 inline void RTPHashTable<Element,GetIndex,hashsize>::Dump()
318 std::cout <<
"DUMPING TABLE CONTENTS:" << std::endl;
319 for (
int i = 0 ; i < hashsize ; i++)
329 std::cout <<
"DUMPING LIST CONTENTS:" << std::endl;
341 #endif // RTPHASHTABLE_H
#define RTPMEM_TYPE_OTHER
Used to indicate a general kind of memory block.
Definition: rtpmemorymanager.h:45