Fixed some bugs...
[repair.git] / Repair / RepairInterpreter / set.cc
1 #include <stdio.h>
2 #include "set.h"
3 #include "GenericHashtable.h"
4 #include "element.h"
5
6
7
8 // class WorkSet
9
10 WorkSet::WorkSet() {
11   ght=genallocatehashtable((unsigned int (*)(void *)) & hashelement,(int (*)(void *,void *)) & elementequals);
12 }
13
14 WorkSet::WorkSet(unsigned int (*hashf)(void *),int (*equals)(void *,void *)) {
15   ght=genallocatehashtable(hashf,equals);
16 }
17
18 WorkSet::WorkSet(bool) {
19   ght=genallocatehashtable(NULL,NULL);
20 }
21
22 WorkSet::~WorkSet() {
23   genfreehashtable(ght);
24 }
25
26 void WorkSet::addobject(void *obj) {
27   if (!contains(obj))
28     {
29       fflush(NULL);
30       genputtable(ght,obj,obj);
31     }
32 }
33
34 void WorkSet::removeobject(void *obj) {
35   genfreekey(ght,obj);
36 }
37
38 bool WorkSet::contains(void *obj) {
39   return (gencontains(ght,obj)==1);
40 }
41
42 void * WorkSet::firstelement() {
43   if (ght->list==NULL)
44     return NULL;
45   else
46     return ght->list->src;
47 }
48
49 Iterator * WorkSet::getiterator() {
50   return new Iterator(ght);
51 }
52
53 void * WorkSet::getnextelement(void *src) {
54   return getnext(ght,src);
55 }
56
57 void * WorkSet::getelement(int i) {
58   void *v=firstelement();
59   while(i>0) {
60     i--;
61     v=getnext(ght,v);
62   }
63   return v;
64 }
65
66 int WorkSet::size() {
67   return hashsize(ght);
68 }
69
70 bool WorkSet::isEmpty() {
71   return (size()==0);
72 }
73
74 void WorkSet::print() 
75 {
76   printf("{");
77   for (int i=0; i<size(); i++)
78     {
79       Element *elem = (Element *) getelement(i);      
80       elem->print();
81       if (i != size()-1)
82         printf(" ");
83     }  
84   printf("}");
85 }
86
87
88
89
90 // class Iterator
91
92 Iterator::Iterator(struct genhashtable *ght) {
93   gi=gengetiterator(ght);
94 }
95   
96 Iterator::~Iterator() {
97   genfreeiterator(gi);
98 }
99   
100 void * Iterator::next() {
101   return gennext(gi);
102 }