]>
Commit | Line | Data |
---|---|---|
885824d3 | 1 | # include "empset.h" |
2 | ||
3 | static bool initDone = FALSE; | |
4 | ||
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 | ||
17 | void empset_clear (empset s) | |
18 | { | |
19 | erc_clear (s); | |
20 | } | |
21 | ||
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 | ||
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 | ||
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 | ||
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 | ||
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 | ||
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 | ||
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 | ||
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 | } |