23 template <
class Elem>
class Entry {
32 Entry(
void) { _next = 0; used = 0; }
41 if (used)
obj.~Elem();
47 int isUsed(
void)
const {
return used; }
93 void clear(
void) {
delete[] glob; }
98 this->_next = e;
return this;
117 for (; entry != glob+size-1; entry++) {
158 int oldTableLength= tableLength;
162 tableLength = findSize(numElem > size ? numElem : size);
163 if (tableLength == oldTableLength)
167 growSize = tableLength * 4;
171 for (; t != e; *t++ = 0);
174 for (
int i=0; i<oldTableLength; i++) {
190 int add(
const Elem &elem) {
191 int tableSlot = elem.hash() % tableLength;
193 for (
Entry<Elem> *e = table[tableSlot]; e; e=e->next()) {
194 if (e->obj == elem) { doadd = 0;
break; }
199 table[tableSlot] = entry->
setNext(table[tableSlot]);
200 if ( ++numElem > growSize)
209 table[0] = entry->
setNext(table[0]);
216 register Entry<Elem> *e = table[elem.hash() % tableLength];
218 if (elem == e->
obj ) {
226 int del(
const Elem &elem) {
227 int tableSlot = elem.hash() % tableLength;
233 if (e->
obj == elem) {
239 addFree(e); dodel = 1; numElem--;
249 int size(
void)
const {
return(numElem); }
260 for (
int i=0; i < tableLength; i++) {
262 cout <<
"Table entry [" << i <<
"]" << std::endl;
268 cout <<
"Entry is not used" << std::endl;
273 cout <<
"===== COUNT = " << count << std::endl;
287 unsigned int tableLength;
288 unsigned int growSize;
290 unsigned int numElem;
294 int isSafeNoDestruction;
298 int findSize(
unsigned int size) {
301 if ( ( rval = 11 ) <= size )
302 if ( ( rval = 31 ) <= size )
303 if ( ( rval = 101 ) <= size )
304 if ( ( rval = 307 ) <= size )
305 if ( ( rval = 1009 ) <= size )
306 if ( ( rval = 3001 ) <= size )
307 if ( ( rval = 10007 ) <= size )
308 if ( ( rval = 30011 ) <= size )
309 if ( ( rval = 100003 ) <= size )
310 if ( ( rval = 300007 ) <= size )
311 if ( ( rval = 1000003 ) <= size )
312 if ( ( rval = 3000017 ) <= size )
313 if ( ( rval = 10000019 ) <= size )
314 if ( ( rval = 30000023 ) <= size )
315 if ( ( rval = 100000007 ) <= size )
316 if ( ( rval = 300000007 ) <= size )
322 for (
int i=0; i<tableLength; i++)
334 isSafeNoDestruction = us.isSafeNoDestruction;
335 tableLength = findSize(us.numElem);
336 growSize = tableLength * 4;
339 for (
int i=0; i<us.tableLength; i++) {
348 void init(
int size) {
349 tableLength = findSize(size);
350 growSize = tableLength * 4;
354 for (; t != e; *t++ = 0);
361 int tableSlot = e->
obj.hash() % tableLength;
362 table[tableSlot] = e->
setNext(table[tableSlot]);
368 void freeListInit(
void) {
372 void freeListClean(
void) {
387 head = entry->
next();
398 template <
class Elem>
400 table(0), tableLength(0), numElem(0), growable(1) {
401 const int minGlobSize = 32;
402 isSafeNoDestruction = 1;
404 globSize = minGlobSize;
EntryGlob< Elem > * globHead
Entry< Elem > * next(void) const
UniqueSetRaw(int size=101)
Entry< Elem > & operator=(const Elem &e)
int add(const Elem &elem)
void setSafeNoDestruction(int flag)
Elem * find(const Elem &elem)
static void clearChain(EntryGlob< Elem > *e)
int del(const Elem &elem)
EntryGlob< Elem > * next(void)
EntryGlob< Elem > * setNext(EntryGlob< Elem > *e)
Entry< Elem > * setNext(Entry< Elem > *e)
int load(const Elem &elem)
Entry< Elem > * removeSelf(void)
static void clearChain(Entry< Elem > *e)
UniqueSetRaw(const UniqueSetRaw< Elem > &us)
UniqueSetRaw< Elem > & operator=(const UniqueSetRaw< Elem > &us)