3 #include "GenericHashtable.h"
10 Tuple::Tuple(void *l,void *r) {
19 bool Tuple::isnull() {
20 if (left==NULL&&right==NULL)
29 WorkRelation::WorkRelation() {
30 forward=genallocatehashtable((unsigned int (*)(void *)) & hashelement,(int (*)(void *,void *)) & elementequals);
31 inverse=genallocatehashtable((unsigned int (*)(void *)) & hashelement,(int (*)(void *,void *)) & elementequals);
35 WorkRelation::WorkRelation(bool flag) {
36 forward=genallocatehashtable(NULL,NULL);
37 inverse=genallocatehashtable(NULL,NULL);
41 Tuple WorkRelation::firstelement() {
42 if (forward->list==NULL)
44 void * forwardfirst=forward->list->src;
45 WorkSet *ws=getset(forwardfirst);
46 return Tuple(forwardfirst,ws->firstelement());
49 Tuple WorkRelation::getnextelement(void *left,void *right) {
50 WorkSet *ws=getset(left);
51 if (ws->getnextelement(right)!=NULL) {
52 return Tuple(left, ws->getnextelement(right));
54 void *leftnext=getnext(forward,left);
56 return Tuple(leftnext,getset(leftnext)->firstelement());
57 } else return Tuple();
60 bool WorkRelation::contains(void *key, void*object) {
61 /*Set up forward reference*/
62 if(!gencontains(forward,key))
64 WorkSet *w=(WorkSet *)gengettable(forward,key);
65 return w->contains(object);
68 void WorkRelation::put(void *key, void*object) {
69 { /*Set up forward reference*/
70 if(!gencontains(forward,key)) {
71 WorkSet *w=flag?new WorkSet(true):new WorkSet();
72 genputtable(forward,key,w);
74 WorkSet *w=(WorkSet *)gengettable(forward,key);
77 {/*Set up backwars reference*/
78 if(!gencontains(inverse,object)) {
79 WorkSet *w=flag?new WorkSet(true):new WorkSet();
80 genputtable(inverse,object,w);
82 WorkSet *w=(WorkSet *) gengettable(inverse,object);
87 void WorkRelation::remove(void *key, void *object) {
88 { /*Set up forward reference*/
89 WorkSet *w=(WorkSet *)gengettable(forward,key);
90 w->removeobject(object);
92 genfreekey(forward,key);
96 { /*Set up backwards reference*/
97 WorkSet *w=(WorkSet *)gengettable(inverse,object);
100 genfreekey(inverse,object);
106 WorkSet* WorkRelation::getset(void *key) {
107 if (gencontains(forward,key))
108 return (WorkSet *) gengettable(forward,key);
112 void* WorkRelation::getobj(void *key) {
113 WorkSet *ws=getset(key);
116 return ws->firstelement();
119 WorkSet* WorkRelation::invgetset(void *key) {
120 if (gencontains(inverse,key))
121 return (WorkSet *) gengettable(inverse,key);
126 void* WorkRelation::invgetobj(void *key) {
127 WorkSet *ws=invgetset(key);
130 return ws->firstelement();
133 WorkRelation::~WorkRelation() {
138 void WorkRelation::destroyer(struct genhashtable *d) {
139 struct geniterator *it=gengetiterator(d);
141 void *key=gennext(it);
144 WorkSet *ws=(WorkSet *)gengettable(d,key);
151 void WorkRelation::print()
154 Tuple tuple = firstelement();
155 while (!tuple.isnull())
157 Element *l = (Element *) tuple.left;
158 Element *r = (Element *) tuple.right;
159 printf("("); l->print(); printf(", "); r->print(); printf(")\n");
160 tuple = getnextelement(tuple.left, tuple.right);