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 JRTPLIB_UNUSED(memtype);
107 for (
int i = 0 ; i < hashsize ; i++)
111 #ifdef RTP_SUPPORT_MEMORYMANAGEMENT 112 memorytype = memtype;
113 #endif // RTP_SUPPORT_MEMORYMANAGEMENT 116 template<
class Element,
class GetIndex,
int hashsize>
117 inline int RTPHashTable<Element,GetIndex,hashsize>::DeleteCurrentElement()
121 HashElement *tmp1,*tmp2;
126 index = curhashelem->GetHashIndex();
127 tmp1 = curhashelem->hashprev;
128 tmp2 = curhashelem->hashnext;
137 tmp1->hashnext = tmp2;
139 tmp2->hashprev = tmp1;
144 tmp1 = curhashelem->listprev;
145 tmp2 = curhashelem->listnext;
148 firsthashelem = tmp2;
156 tmp1->listnext = tmp2;
158 tmp2->listprev = tmp1;
164 RTPDelete(curhashelem,GetMemoryManager());
168 return ERR_RTP_HASHTABLE_NOCURRENTELEMENT;
172 template<
class Element,
class GetIndex,
int hashsize>
173 inline int RTPHashTable<Element,GetIndex,hashsize>::GotoElement(
const Element &e)
178 index = GetIndex::GetIndex(e);
179 if (index >= hashsize)
180 return ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
182 curhashelem = table[index];
184 while(!found && curhashelem != 0)
186 if (curhashelem->GetElement() == e)
189 curhashelem = curhashelem->hashnext;
192 return ERR_RTP_HASHTABLE_ELEMENTNOTFOUND;
196 template<
class Element,
class GetIndex,
int hashsize>
197 inline bool RTPHashTable<Element,GetIndex,hashsize>::HasElement(
const Element &e)
203 index = GetIndex::GetIndex(e);
204 if (index >= hashsize)
209 while(!found && tmp != 0)
211 if (tmp->GetElement() == e)
219 template<
class Element,
class GetIndex,
int hashsize>
220 inline void RTPHashTable<Element,GetIndex,hashsize>::GotoNextElement()
223 curhashelem = curhashelem->listnext;
226 template<
class Element,
class GetIndex,
int hashsize>
227 inline void RTPHashTable<Element,GetIndex,hashsize>::GotoPreviousElement()
230 curhashelem = curhashelem->listprev;
233 template<
class Element,
class GetIndex,
int hashsize>
234 inline void RTPHashTable<Element,GetIndex,hashsize>::Clear()
236 HashElement *tmp1,*tmp2;
238 for (
int i = 0 ; i < hashsize ; i++)
241 tmp1 = firsthashelem;
244 tmp2 = tmp1->listnext;
245 RTPDelete(tmp1,GetMemoryManager());
252 template<
class Element,
class GetIndex,
int hashsize>
253 inline int RTPHashTable<Element,GetIndex,hashsize>::AddElement(
const Element &elem)
257 HashElement *e,*newelem;
259 index = GetIndex::GetIndex(elem);
260 if (index >= hashsize)
261 return ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
265 while(!found && e != 0)
267 if (e->GetElement() == elem)
273 return ERR_RTP_HASHTABLE_ELEMENTALREADYEXISTS;
277 newelem = RTPNew(GetMemoryManager(),memorytype) HashElement(elem,index);
279 return ERR_RTP_OUTOFMEM;
282 table[index] = newelem;
283 newelem->hashnext = e;
285 e->hashprev = newelem;
289 if (firsthashelem == 0)
291 firsthashelem = newelem;
292 lasthashelem = newelem;
296 lasthashelem->listnext = newelem;
297 newelem->listprev = lasthashelem;
298 lasthashelem = newelem;
303 template<
class Element,
class GetIndex,
int hashsize>
304 inline int RTPHashTable<Element,GetIndex,hashsize>::DeleteElement(
const Element &elem)
308 status = GotoElement(elem);
311 return DeleteCurrentElement();
315 template<
class Element,
class GetIndex,
int hashsize>
316 inline void RTPHashTable<Element,GetIndex,hashsize>::Dump()
320 std::cout <<
"DUMPING TABLE CONTENTS:" << std::endl;
321 for (
int i = 0 ; i < hashsize ; i++)
331 std::cout <<
"DUMPING LIST CONTENTS:" << std::endl;
343 #endif // RTPHASHTABLE_H
Definition: rtpfaketransmitter.h:64
#define RTPMEM_TYPE_OTHER
Used to indicate a general kind of memory block.
Definition: rtpmemorymanager.h:45