empset.c
empset.c
#include "empset.h"
static bool initDone = FALSE;
eref _empset_get(employee e, erc s) {
eref er;
ercIter it;
employee e1;
for_ercElems(er, it, s) {
e1 = eref_get(er);
if (employee_equal(&e1, &e))
erc_iterReturn(it, er);
}
return erefNIL;
}
void empset_clear(empset s) {
erc_clear(s);
}
bool empset_insert(empset s, employee e) {
eref er;
if (!eref_equal(_empset_get(e, s), erefNIL)) return FALSE;
empset_insertUnique(s, e);
return TRUE;
}
void empset_insertUnique(empset s, employee e) {
eref er;
er = ereftab_lookup(e, known);
if (eref_equal(er, erefNIL)) {
er = eref_alloc( );
eref_assign(er,e);
ereftab_insert(known, e, er);
}
erc_insert(s, er);
}
bool empset_delete(empset s, employee e) {
eref er;
er = _empset_get(e, s);
if (eref_equal(er, erefNIL)) return FALSE;
return erc_delete(s, er);
}
empset empset_disjointUnion(empset s1, empset s2) {
erc result;
ercIter it;
eref er;
empset tmp;
result = erc_create( );
if (erc_size(s1) > erc_size(s2)) {
tmp = s1;
s1 = s2;
s2 = tmp;
}
erc_join(result, s1);
for_ercElems(er, it, s2)
empset_insertUnique(result, eref_get(er));
return result;
}
empset empset_union(empset s1, empset s2) {
eref er;
ercIter it;
erc result;
empset tmp;
result = erc_create( );
if (erc_size(s1) > erc_size(s2)) {
tmp = s1;
s1 = s2;
s2 = tmp;
}
erc_join(result, s2);
for_ercElems(er, it, s1)
if (!empset_member(eref_get(er), s2))
erc_insert(result, er);
return result;
}
void empset_intersect(empset s1, empset s2) {
eref er;
ercIter it;
erc toDelete;
toDelete = erc_create( );
for_ercElems(er, it, s1)
if (!empset_member(eref_get(er), s2))
erc_insert(toDelete, er);
for_ercElems(er, it, toDelete)
erc_delete(s1, er);
erc_final(toDelete);
}
bool empset_subset(empset s1, empset s2) {
employee e;
eref er;
ercIter it;
for_ercElems(er, it, s1)
if (!empset_member(eref_get(er), s2))
erc_iterReturn(it, FALSE);
return TRUE;
}
void empset_initMod(void) {
if (initDone) return;
bool_initMod();
employee_initMod();
eref_initMod();
erc_initMod();
ereftab_initMod();
known = ereftab_create( );
initDone = TRUE;
}
David Evans
University of Virginia, Computer Science
evans@cs.virginia.edu