1 #include "SimpleHash.h"
5 /* LINKED HASH NODE ****************************************************/
7 LinkedHashNode::LinkedHashNode(int key, int data, LinkedHashNode *next) {
15 LinkedHashNode::LinkedHashNode() {
23 /* SIMPLE LIST ****************************************************/
25 SimpleList::SimpleList() {
30 void SimpleList::reset() {
35 int SimpleList::hasMoreElements() {
37 return (ptr->next != 0);
40 int SimpleList::nextElement() {
44 //int data = ptr->data;
49 void SimpleList::add(int data) {
50 LinkedHashNode *cur = &head;
53 if (cur->data == data) {
54 return; // no duplicates
57 cur->next = new LinkedHashNode(0, data, 0);
61 int SimpleList::contains(int data) {
62 LinkedHashNode *cur = &head;
65 if (cur->data == data) {
72 /* WORK LIST ****************************************************/
74 WorkList::WorkList() {
75 head=(struct ListNode *) malloc(sizeof(struct ListNode));
81 int WorkList::hasMoreElements() {
83 return ((head!=tail)||(headoffset!=tailoffset));
86 int WorkList::getid() {
87 return tail->data[tailoffset];
90 int WorkList::gettype() {
91 return tail->data[tailoffset+1];
94 int WorkList::getlvalue() {
95 return tail->data[tailoffset+2];
98 int WorkList::getrvalue() {
99 return tail->data[tailoffset+3];
102 WorkList::~WorkList() {
103 struct ListNode *ptr=tail;
105 struct ListNode *oldptr=ptr;
111 void WorkList::pop() {
112 int newoffset=tailoffset+4;
113 struct ListNode *ptr=tail;
114 if (newoffset>=WLISTSIZE) {
115 newoffset-=WLISTSIZE;
116 struct ListNode *oldptr=ptr;
121 tailoffset=newoffset;
124 void WorkList::add(int id,int type, int lvalue, int rvalue) {
125 if (headoffset==WLISTSIZE) {
126 head->next=(struct ListNode *)malloc(sizeof(struct ListNode));
130 head->data[headoffset++]=id;
131 head->data[headoffset++]=type;
132 head->data[headoffset++]=lvalue;
133 head->data[headoffset++]=rvalue;
136 /* SIMPLE HASH ********************************************************/
138 SimpleHash::SimpleHash(int size) {
140 throw SimpleHashException();
143 this->bucket = new LinkedHashNode* [size];
144 for (int i=0;i<size;i++)
147 this->numparents = 0;
148 this->numchildren = 0;
149 this->numelements = 0;
152 SimpleHash::SimpleHash() {
154 this->bucket = new LinkedHashNode* [size];
155 for (int i=0;i<size;i++)
158 this->numparents = 0;
159 this->numelements = 0;
160 this->numchildren = 0;
164 SimpleHash::~SimpleHash() {
165 delete [] this->bucket;
166 LinkedHashNode *ptr=nodelist;
168 LinkedHashNode *next=ptr->lnext;
174 void SimpleHash::addParent(SimpleHash* parent) {
175 parents[numparents++] = parent;
176 parent->addChild(this);
179 void SimpleHash::addChild(SimpleHash *child) {
180 children[numchildren++]=child;
183 int SimpleHash::remove(int key, int data) {
184 unsigned int hashkey = (unsigned int)key % size;
186 LinkedHashNode **ptr = &bucket[hashkey];
188 for (int i = 0; i < numchildren; i++) {
189 children[i]->remove(key, data);
193 if ((*ptr)->key == key && (*ptr)->data == data) {
194 LinkedHashNode *toremove=*ptr;
197 toremove->lprev->lnext=toremove->lnext;
199 toremove->lnext->lprev=toremove->lprev;
204 ptr = &((*ptr)->next);
212 int SimpleHash::add(int key, int data) {
213 unsigned int hashkey = (unsigned int)key % size;
215 LinkedHashNode **ptr = &bucket[hashkey];
217 /* check that this key/object pair isn't already here */
218 // TBD can be optimized for set v. relation */
220 if ((*ptr)->key == key && (*ptr)->data == data) {
223 ptr = &((*ptr)->next);
226 *ptr = new LinkedHashNode(key, data, 0);
227 (*ptr)->lnext=nodelist;
229 nodelist->lprev=*ptr;
233 for (int i = 0; i < numparents; i++) {
234 parents[i]->add(key, data);
240 bool SimpleHash::contains(int key) {
241 unsigned int hashkey = (unsigned int)key % size;
243 LinkedHashNode *ptr = bucket[hashkey];
245 if (ptr->key == key) {
246 // we already have this object
247 // stored in the hash so just return
255 bool SimpleHash::contains(int key, int data) {
256 unsigned int hashkey = (unsigned int)key % size;
258 LinkedHashNode *ptr = bucket[hashkey];
260 if (ptr->key == key && ptr->data == data) {
261 // we already have this object
262 // stored in the hash so just return
270 int SimpleHash::count(int key) {
271 unsigned int hashkey = (unsigned int)key % size;
274 LinkedHashNode *ptr = bucket[hashkey];
276 if (ptr->key == key) {
284 int SimpleHash::get(int key, int&data) {
285 unsigned int hashkey = (unsigned int)key % size;
287 LinkedHashNode *ptr = bucket[hashkey];
289 if (ptr->key == key) {
299 int SimpleHash::countdata(int data) {
301 LinkedHashNode *ptr = nodelist;
303 if (ptr->data == data) {
311 SimpleHashException::SimpleHashException() {}
312 // ************************************************************
315 RepairHashNode::RepairHashNode(int setrelation, int rule, int lvalue, int rvalue, int data){
316 this->setrelation = setrelation;
325 // ************************************************************
327 RepairHash::RepairHash(int size) {
329 throw SimpleHashException();
332 this->bucket = new RepairHashNode* [size];
333 for (int i=0;i<size;i++)
336 this->numelements = 0;
339 RepairHash::RepairHash() {
343 RepairHash::~RepairHash() {
344 delete [] this->bucket;
345 RepairHashNode *ptr=nodelist;
347 RepairHashNode *next=ptr->lnext;
353 #define SETFLAG (1<<31)
355 int RepairHash::addset(int setv, int rule, int value, int data) {
356 return addrelation(setv||SETFLAG, rule, value,0,data);
359 int RepairHash::addrelation(int relation, int rule, int lvalue, int rvalue, int data) {
360 unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
362 RepairHashNode **ptr = &bucket[hashkey];
364 /* check that this key/object pair isn't already here */
365 // TBD can be optimized for set v. relation */
367 if ((*ptr)->setrelation == relation &&
368 (*ptr)->rule==rule &&
369 (*ptr)->lvalue==lvalue &&
370 (*ptr)->rvalue==rvalue &&
371 (*ptr)->data == data) {
374 ptr = &((*ptr)->next);
377 *ptr = new RepairHashNode(relation,rule,lvalue,rvalue, data);
378 (*ptr)->lnext=nodelist;
384 bool RepairHash::containsset(int setv, int rule, int value) {
385 return containsrelation(setv||SETFLAG, rule, value,0);
388 bool RepairHash::containsrelation(int relation, int rule, int lvalue, int rvalue) {
389 unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
391 RepairHashNode **ptr = &bucket[hashkey];
393 /* check that this key/object pair isn't already here */
394 // TBD can be optimized for set v. relation */
396 if ((*ptr)->setrelation == relation &&
397 (*ptr)->rule==rule &&
398 (*ptr)->lvalue==lvalue &&
399 (*ptr)->rvalue==rvalue) {
402 ptr = &((*ptr)->next);
407 int RepairHash::getset(int setv, int rule, int value) {
408 return getrelation(setv||SETFLAG, rule, value,0);
411 int RepairHash::getrelation(int relation, int rule, int lvalue,int rvalue) {
412 unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
414 RepairHashNode **ptr = &bucket[hashkey];
416 /* check that this key/object pair isn't already here */
417 // TBD can be optimized for set v. relation */
419 if ((*ptr)->setrelation == relation &&
420 (*ptr)->rule==rule &&
421 (*ptr)->lvalue==lvalue &&
422 (*ptr)->rvalue==rvalue) {
425 ptr = &((*ptr)->next);