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)
{
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);
/*@-mods@*/
for_ercElems (er, it, s2)
empset_insertUnique (result, eref_get (er));
/*@=mods@*/
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);
/*@-mods@*/
for_ercElems (er, it, s1)
if (!empset_member (eref_get (er), s2))
erc_insert (result, er);
/*@=mods@*/
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)
{
eref er;
ercIter it;
/*@-mods@*/
for_ercElems (er, it, s1)
if (!empset_member (eref_get (er), s2))
erc_iterReturn (it, FALSE);
/*@=mods@*/
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