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