8#ifndef __CO_MULTI_HASH_BASE_H
9#define __CO_MULTI_HASH_BASE_H
18template <
class KEY,
class DATA>
20template <
class KEY,
class DATA>
40template <
class KEY,
class DATA>
117 virtual int insert(
const KEY &key,
const DATA &inData);
135 virtual unsigned long nextHash(
unsigned long hashIndex)
const;
141 virtual unsigned long hash1(
const KEY &)
const = 0;
144 virtual unsigned long hash2(
const KEY &)
const = 0;
147 virtual bool equal(
const KEY &,
const KEY &)
const = 0;
152template <
class KEY,
class DATA>
155 static unsigned long primeList[NUMPRIMES] = {
156 53ul, 97ul, 193ul, 389ul, 769ul,
157 1543ul, 3079ul, 6151ul, 12289ul, 24593ul,
158 49157ul, 98317ul, 196613ul, 393241ul, 786433ul,
159 1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul,
160 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,
161 1610612741ul, 3221225473ul, 4294967291ul
166 prime = primeList[primeIndex];
170 maxEntries = (
unsigned int)(((
float)
size) * 0.75);
173 this->keys =
new KEY[
size];
175 entryFlags =
new unsigned char[
size];
179 for (i = 0; i <
size; i++)
180 entryFlags[i] = ((
unsigned char)
EMPTY);
188template <
class KEY,
class DATA>
191 static unsigned long primeList[NUMPRIMES] = {
192 53ul, 97ul, 193ul, 389ul, 769ul,
193 1543ul, 3079ul, 6151ul, 12289ul, 24593ul,
194 49157ul, 98317ul, 196613ul, 393241ul, 786433ul,
195 1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul,
196 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,
197 1610612741ul, 3221225473ul, 4294967291ul
201 prime = primeList[primeIndex];
204 d_nullElem = nullelem;
206 maxEntries = (
unsigned int)(((
float)
size) * 0.75);
209 this->keys =
new KEY[
size];
211 entryFlags =
new unsigned char[
size];
215 for (i = 0; i <
size; i++)
217 entryFlags[i] = ((
unsigned char)
EMPTY);
218 this->
data[i] = d_nullElem;
227template <
class KEY,
class DATA>
232 for (i = 0; i <
size; i++)
234 entryFlags[i] = ((
unsigned char)
EMPTY);
235 this->
data[i] = d_nullElem;
244template <
class KEY,
class DATA>
257template <
class KEY,
class DATA>
261 KEY *oldKeys = this->keys;
262 DATA *oldData = this->
data;
263 unsigned int oldSize =
size;
264 unsigned char *oldFlags = entryFlags;
266 static unsigned long primeList[NUMPRIMES] = {
267 53ul, 97ul, 193ul, 389ul, 769ul,
268 1543ul, 3079ul, 6151ul, 12289ul, 24593ul,
269 49157ul, 98317ul, 196613ul, 393241ul, 786433ul,
270 1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul,
271 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,
272 1610612741ul, 3221225473ul, 4294967291ul
276 prime = primeList[primeIndex];
280 maxEntries = (
unsigned int)(((
float)
size) * 0.75);
281 this->keys =
new KEY[
size];
283 entryFlags =
new unsigned char[
size];
285 for (i = 0; i <
size; i++)
286 entryFlags[i] = ((
unsigned char)
EMPTY);
289 for (i = 0L; i < oldSize; i++)
290 if (oldFlags[i] == USED)
291 insert(oldKeys[i], oldData[i]);
304template <
class KEY,
class DATA>
308 unsigned int x = 0, u = 0;
312 while (entryFlags[
x] == USED)
325 this->
data[
x] = inData;
326 entryFlags[
x] = (
unsigned char)USED;
329 if (entries > maxEntries)
338template <
class KEY,
class DATA>
342 if ((idx) && (idx <=
size))
345 if (entryFlags[idx] == USED)
347 entryFlags[idx] = PREVIOUS;
357template <
class KEY,
class DATA>
361 unsigned int idx, u = 0;
363 while (((entryFlags[idx] == USED) && (!equal(this->keys[idx], key)))
364 || (entryFlags[idx] == PREVIOUS))
371 idx = (idx + u) %
size;
374 if (entryFlags[idx] != USED)
384template <
class KEY,
class DATA>
388 assert((idx) && (idx <=
size));
389 return this->
data[idx - 1];
393template <
class KEY,
class DATA>
397 assert((idx) && (idx <=
size));
398 return this->
data[idx - 1];
402template <
class KEY,
class DATA>
406 assert((idx) && (idx <=
size) && (entryFlags[idx - 1] == USED));
412 const KEY &myKey = this->keys[idx];
413 unsigned long u = hash2(myKey);
416 idx = (idx + u) %
size;
418 while (((entryFlags[idx] == USED) && (!equal(this->keys[idx], myKey)))
419 || (entryFlags[idx] == PREVIOUS))
421 idx = (idx + u) %
size;
425 if (entryFlags[idx] != USED)
433template <
class KEY,
class DATA>
GLuint res
Definition: khronos-glext.h:10588
GLsizeiptr size
Definition: khronos-glext.h:6610
GLsizei GLsizei GLenum GLenum const GLvoid * data
Definition: khronos-glext.h:6354
GLint GLint GLint GLint GLint x
Definition: khronos-glext.h:6346
list of all chemical elements
Definition: coConfig.h:27
@ EMPTY
Definition: udp_message_types.h:39
Definition: coHashBase.h:28
Definition: coHashIter.h:35
Definition: coMultiHashBase.h:42
DATA & operator[](unsigned long hashIndex)
access element by hash index: assert() correct index !!
Definition: coMultiHashBase.h:385
KEY * keys
Definition: coMultiHashBase.h:88
unsigned long getHash(const KEY &key) const
get hash index, 0 if no element found
Definition: coMultiHashBase.h:358
int remove(unsigned long hashIndex)
remove an entry by hashIndex
Definition: coMultiHashBase.h:339
coMultiHashBase()
constructor
Definition: coMultiHashBase.h:153
virtual ~coMultiHashBase()
destructor
Definition: coMultiHashBase.h:245
unsigned char * entryFlags
Definition: coMultiHashBase.h:92
DATA d_nullElem
Definition: coMultiHashBase.h:49
void resize(void)
Definition: coMultiHashBase.h:258
virtual unsigned long nextHash(unsigned long hashIndex) const
get next hashIndex to given hashIndex
Definition: coMultiHashBase.h:403
const DATA & getNullElem() const
get the NULL element
Definition: coMultiHashBase.h:108
unsigned int maxEntries
Definition: coMultiHashBase.h:58
void removeAll()
remove an entry by hashIndex
Definition: coMultiHashBase.h:228
virtual bool equal(const KEY &, const KEY &) const =0
KEY1 == KEY2 operation (pure virtual)
int getNumEntries() const
get number of entries currently in hash
Definition: coMultiHashBase.h:434
virtual unsigned long hash1(const KEY &) const =0
first hash function (pure virtual)
@ NUMPRIMES
Definition: coMultiHashBase.h:72
DATA * data
Definition: coMultiHashBase.h:52
@ EMPTY
Definition: coMultiHashBase.h:82
@ PREVIOUS
Definition: coMultiHashBase.h:83
@ USED
Definition: coMultiHashBase.h:84
coMultiHashBase(DATA nullelem)
constructor
Definition: coMultiHashBase.h:189
virtual int insert(const KEY &key, const DATA &inData)
insert an entry (virtual for non-multi hash)
Definition: coMultiHashBase.h:305
virtual unsigned long hash2(const KEY &) const =0
second hash function (pure virtual)
unsigned int entries
Definition: coMultiHashBase.h:55
const DATA & operator[](unsigned long hashIndex) const
access element by hash index: assert() correct index !!
Definition: coMultiHashBase.h:394
unsigned int size
size of the list
Definition: coMultiHashBase.h:95
int primeIndex
Definition: coMultiHashBase.h:61
unsigned int prime
the prime currently used as the length of the list
Definition: coMultiHashBase.h:98