3 static bool initDone = FALSE;
4 static /*@only@*/ ereftab known;
6 static eref empset_get (employee e, erc s) /*@*/
10 employee e1 = eref_get(er);
12 if (employee_equal(&e1, &e))
18 return eref_undefined;
21 bool empset_member (employee e, erc s)
23 return (eref_isDefined (empset_get (e, s)));
26 void empset_clear (empset s)
31 bool /*@alt void@*/ empset_insert (empset s, employee e)
32 /*@globals internalState@*/
33 /*@modifies internalState@*/
35 if (eref_isDefined (empset_get (e, s)))
40 empset_insertUnique (s, e);
44 void empset_insertUnique (empset s, employee e)
50 er = ereftab_lookup (e, known);
52 if (!eref_isDefined (er))
56 ereftab_insert (known, e, er);
62 bool /*@alt void@*/ empset_delete (empset s, employee e)
66 er = empset_get (e, s);
68 if (!eref_isDefined (er))
73 return erc_delete (s, er);
76 empset empset_disjointUnion (empset s1, empset s2)
83 result = erc_create ( );
85 if (erc_size (s1) > erc_size (s2))
92 erc_join (result, s1);
94 empset_elements(s2, emp)
96 empset_insertUnique(result, emp);
97 } end_empset_elements ;
102 empset empset_union (empset s1, empset s2)
107 result = erc_create ();
109 if (erc_size (s1) > erc_size (s2))
115 erc_join (result, s2);
117 empset_elements (s1, emp)
119 if (!empset_member(emp, s2))
121 empset_insert(result, emp);
123 } end_empset_elements ;
128 void empset_intersect (empset s1, empset s2)
130 erc toDelete = erc_create();
132 empset_elements (s2, emp)
134 if (!empset_member(emp, s2))
136 empset_insert(toDelete, emp);
138 } end_empset_elements ;
140 empset_elements (toDelete, emp)
142 empset_delete(s1, emp);
143 } end_empset_elements;
145 erc_final (toDelete);
148 bool empset_subset (empset s1, empset s2)
150 empset_elements(s1, emp)
152 if (!empset_member(emp, s2))
156 } end_empset_elements ;
161 void empset_initMod (void)
162 /*@globals initDone, undef known@*/
163 /*@modifies initDone, known@*/
167 /*@-globstate@*/ return; /*@=globstate@*/
175 known = ereftab_create ();