33 #ifndef RTPHASHTABLE_H
35 #define RTPHASHTABLE_H
52 template<
class Element,
class GetIndex,
int hashsize>
53 class RTPHashTable :
public RTPMemoryObject
55 JRTPLIB_NO_COPY(RTPHashTable)
58 ~RTPHashTable() { 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 int GotoElement(
const Element &e);
66 bool HasElement(
const Element &e);
67 void GotoNextElement();
68 void GotoPreviousElement();
71 int AddElement(
const Element &elem);
72 int DeleteElement(
const Element &elem);
81 HashElement(
const Element &e,
int index):element(e) { hashprev = 0; hashnext = 0; listnext = 0; listprev = 0; hashindex = index; }
82 int GetHashIndex() {
return hashindex; }
83 Element &GetElement() {
return element; }
85 void Dump() { std::cout <<
"\tHash index " << hashindex <<
" | Element " << element << std::endl; }
91 HashElement *hashprev,*hashnext;
92 HashElement *listprev,*listnext;
95 HashElement *table[hashsize];
96 HashElement *firsthashelem,*lasthashelem;
97 HashElement *curhashelem;
98 #ifdef RTP_SUPPORT_MEMORYMANAGEMENT
103 template<
class Element,
class GetIndex,
int hashsize>
104 inline RTPHashTable<Element,GetIndex,hashsize>::RTPHashTable(RTPMemoryManager *mgr,
int memtype) : RTPMemoryObject(mgr)
106 JRTPLIB_UNUSED(memtype);
108 for (
int i = 0 ; i < hashsize ; i++)
112 #ifdef RTP_SUPPORT_MEMORYMANAGEMENT
113 memorytype = memtype;
117 template<
class Element,
class GetIndex,
int hashsize>
118 inline int RTPHashTable<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_HASHTABLE_NOCURRENTELEMENT;
173 template<
class Element,
class GetIndex,
int hashsize>
174 inline int RTPHashTable<Element,GetIndex,hashsize>::GotoElement(
const Element &e)
179 index = GetIndex::GetIndex(e);
180 if (index >= hashsize)
181 return ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
183 curhashelem = table[index];
185 while(!found && curhashelem != 0)
187 if (curhashelem->GetElement() == e)
190 curhashelem = curhashelem->hashnext;
193 return ERR_RTP_HASHTABLE_ELEMENTNOTFOUND;
197 template<
class Element,
class GetIndex,
int hashsize>
198 inline bool RTPHashTable<Element,GetIndex,hashsize>::HasElement(
const Element &e)
204 index = GetIndex::GetIndex(e);
205 if (index >= hashsize)
210 while(!found && tmp != 0)
212 if (tmp->GetElement() == e)
220 template<
class Element,
class GetIndex,
int hashsize>
221 inline void RTPHashTable<Element,GetIndex,hashsize>::GotoNextElement()
224 curhashelem = curhashelem->listnext;
227 template<
class Element,
class GetIndex,
int hashsize>
228 inline void RTPHashTable<Element,GetIndex,hashsize>::GotoPreviousElement()
231 curhashelem = curhashelem->listprev;
234 template<
class Element,
class GetIndex,
int hashsize>
235 inline void RTPHashTable<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 Element,
class GetIndex,
int hashsize>
254 inline int RTPHashTable<Element,GetIndex,hashsize>::AddElement(
const Element &elem)
258 HashElement *e,*newelem;
260 index = GetIndex::GetIndex(elem);
261 if (index >= hashsize)
262 return ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
266 while(!found && e != 0)
268 if (e->GetElement() == elem)
274 return ERR_RTP_HASHTABLE_ELEMENTALREADYEXISTS;
278 newelem = RTPNew(GetMemoryManager(),memorytype) HashElement(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 Element,
class GetIndex,
int hashsize>
305 inline int RTPHashTable<Element,GetIndex,hashsize>::DeleteElement(
const Element &elem)
309 status = GotoElement(elem);
312 return DeleteCurrentElement();
316 template<
class Element,
class GetIndex,
int hashsize>
317 inline void RTPHashTable<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;
#define RTPMEM_TYPE_OTHER
Used to indicate a general kind of memory block.
Definition: rtpmemorymanager.h:45