1 # include "empset.h"
2
3 static bool initDone = FALSE;
4
_empset_get(employee e,erc s)5 eref _empset_get (employee e, erc s)
6 {
7 erc_elements(s, er)
8 {
9 employee e1 = eref_get(er);
10 if (employee_equal(&e1, &e))
11 return er;
12 } end_erc_elements ;
13
14 return erefNIL;
15 }
16
empset_clear(empset s)17 void empset_clear (empset s)
18 {
19 erc_clear (s);
20 }
21
empset_insert(empset s,employee e)22 bool /*@alt void@*/ empset_insert (empset s, employee e)
23 {
24 if (!eref_equal (_empset_get (e, s), erefNIL))
25 {
26 return FALSE;
27 }
28
29 empset_insertUnique (s, e);
30 return TRUE;
31 }
32
empset_insertUnique(empset s,employee e)33 void empset_insertUnique (empset s, employee e)
34 {
35 eref er;
36
37 er = ereftab_lookup (e, known);
38
39 if (eref_equal (er, erefNIL))
40 {
41 er = eref_alloc ( );
42 eref_assign (er,e);
43 ereftab_insert (known, e, er);
44 }
45
46 erc_insert (s, er);
47 }
48
empset_delete(empset s,employee e)49 bool /*@alt void@*/ empset_delete (empset s, employee e)
50 {
51 eref er;
52
53 er = _empset_get (e, s);
54
55 if (eref_equal (er, erefNIL))
56 {
57 return FALSE;
58 }
59 return erc_delete (s, er);
60 }
61
empset_disjointUnion(empset s1,empset s2)62 empset empset_disjointUnion (empset s1, empset s2)
63 {
64 erc result;
65 empset tmp;
66
67 result = erc_create ( );
68
69 if (erc_size (s1) > erc_size (s2))
70 {
71 tmp = s1;
72 s1 = s2;
73 s2 = tmp;
74 }
75
76 erc_join (result, s1);
77
78 empset_elements(s2, emp)
79 {
80 empset_insertUnique(result, emp);
81 } end_empset_elements ;
82
83 return result;
84 }
85
empset_union(empset s1,empset s2)86 empset empset_union (empset s1, empset s2)
87 {
88 erc result;
89 empset tmp;
90
91 result = erc_create ();
92
93 if (erc_size (s1) > erc_size (s2))
94 {
95 tmp = s1;
96 s1 = s2;
97 s2 = tmp;
98 }
99 erc_join (result, s2);
100
101 empset_elements (s1, emp)
102 {
103 if (!empset_member(emp, s2))
104 empset_insert(result, emp);
105 } end_empset_elements ;
106
107 return result;
108 }
109
empset_intersect(empset s1,empset s2)110 void empset_intersect (empset s1, empset s2)
111 {
112 erc toDelete = erc_create();
113
114 empset_elements (s2, emp)
115 {
116 if (!empset_member(emp, s2))
117 empset_insert(toDelete, emp);
118 } end_empset_elements ;
119
120 empset_elements (toDelete, emp)
121 {
122 empset_delete(s1, emp);
123 } end_empset_elements;
124
125 erc_final (toDelete);
126 }
127
empset_subset(empset s1,empset s2)128 bool empset_subset (empset s1, empset s2)
129 {
130 empset_elements(s1, emp)
131 {
132 if (!empset_member(emp, s2)) return FALSE;
133 } end_empset_elements ;
134
135 return TRUE;
136 }
137
empset_initMod(void)138 void empset_initMod (void)
139 {
140 if (initDone) return;
141
142 bool_initMod ();
143 employee_initMod ();
144 eref_initMod ();
145 erc_initMod ();
146 ereftab_initMod ();
147 known = ereftab_create ();
148 initDone = TRUE;
149 }
150