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 JRTPLIB_UNUSED(memtype);
110 for (
int i = 0 ; i < hashsize ; i++)
114 #ifdef RTP_SUPPORT_MEMORYMANAGEMENT 115 memorytype = memtype;
116 #endif // RTP_SUPPORT_MEMORYMANAGEMENT 119 template<
class Key,
class Element,
class GetIndex,
int hashsize>
120 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::DeleteCurrentElement()
124 HashElement *tmp1,*tmp2;
129 index = curhashelem->GetHashIndex();
130 tmp1 = curhashelem->hashprev;
131 tmp2 = curhashelem->hashnext;
140 tmp1->hashnext = tmp2;
142 tmp2->hashprev = tmp1;
147 tmp1 = curhashelem->listprev;
148 tmp2 = curhashelem->listnext;
151 firsthashelem = tmp2;
159 tmp1->listnext = tmp2;
161 tmp2->listprev = tmp1;
167 RTPDelete(curhashelem,GetMemoryManager());
171 return ERR_RTP_KEYHASHTABLE_NOCURRENTELEMENT;
175 template<
class Key,
class Element,
class GetIndex,
int hashsize>
176 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoElement(
const Key &k)
181 index = GetIndex::GetIndex(k);
182 if (index >= hashsize)
183 return ERR_RTP_KEYHASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
185 curhashelem = table[index];
187 while(!found && curhashelem != 0)
189 if (curhashelem->GetKey() == k)
192 curhashelem = curhashelem->hashnext;
195 return ERR_RTP_KEYHASHTABLE_KEYNOTFOUND;
199 template<
class Key,
class Element,
class GetIndex,
int hashsize>
200 inline bool RTPKeyHashTable<Key,Element,GetIndex,hashsize>::HasElement(
const Key &k)
206 index = GetIndex::GetIndex(k);
207 if (index >= hashsize)
212 while(!found && tmp != 0)
214 if (tmp->GetKey() == k)
222 template<
class Key,
class Element,
class GetIndex,
int hashsize>
223 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoNextElement()
226 curhashelem = curhashelem->listnext;
229 template<
class Key,
class Element,
class GetIndex,
int hashsize>
230 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoPreviousElement()
233 curhashelem = curhashelem->listprev;
236 template<
class Key,
class Element,
class GetIndex,
int hashsize>
237 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::Clear()
239 HashElement *tmp1,*tmp2;
241 for (
int i = 0 ; i < hashsize ; i++)
244 tmp1 = firsthashelem;
247 tmp2 = tmp1->listnext;
248 RTPDelete(tmp1,GetMemoryManager());
255 template<
class Key,
class Element,
class GetIndex,
int hashsize>
256 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::AddElement(
const Key &k,
const Element &elem)
260 HashElement *e,*newelem;
262 index = GetIndex::GetIndex(k);
263 if (index >= hashsize)
264 return ERR_RTP_KEYHASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
268 while(!found && e != 0)
270 if (e->GetKey() == k)
276 return ERR_RTP_KEYHASHTABLE_KEYALREADYEXISTS;
280 newelem = RTPNew(GetMemoryManager(),memorytype) HashElement(k,elem,index);
282 return ERR_RTP_OUTOFMEM;
285 table[index] = newelem;
286 newelem->hashnext = e;
288 e->hashprev = newelem;
292 if (firsthashelem == 0)
294 firsthashelem = newelem;
295 lasthashelem = newelem;
299 lasthashelem->listnext = newelem;
300 newelem->listprev = lasthashelem;
301 lasthashelem = newelem;
306 template<
class Key,
class Element,
class GetIndex,
int hashsize>
307 inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::DeleteElement(
const Key &k)
311 status = GotoElement(k);
314 return DeleteCurrentElement();
318 template<
class Key,
class Element,
class GetIndex,
int hashsize>
319 inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::Dump()
323 std::cout <<
"DUMPING TABLE CONTENTS:" << std::endl;
324 for (
int i = 0 ; i < hashsize ; i++)
334 std::cout <<
"DUMPING LIST CONTENTS:" << std::endl;
346 #endif // RTPKEYHASHTABLE_H
Definition: rtpfaketransmitter.h:64
#define RTPMEM_TYPE_OTHER
Used to indicate a general kind of memory block.
Definition: rtpmemorymanager.h:45