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;
}

Return LCLint Home Page David Evans
University of Virginia, Computer Science
evans@cs.virginia.edu