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