empset.c

empset.c

#include "empset.h"
 
static bool initDone = FALSE;
static /*@only@*/ ereftab known;
 
static eref empset_get (employee e, erc s) 
{
  erc_elements(s, er)
    {
      employee e1 = eref_get(er);
      if (employee_equal(&e1, &e))
	return er;
    } end_erc_elements ;
  
  return erefNIL;
}
 
bool empset_member (employee e, erc s)
{
  return (!eref_equal(empset_get (e, s), erefNIL));
}
 
void empset_clear (empset s) 
{
  erc_clear (s);
}
 
bool /*@alt void@*/ 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) 
   /*@globals known@*/
   /*@modifies known@*/
{
  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 /*@alt void@*/ 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) 
   /*@globals known@*/
   /*@modifies known@*/
{
  erc result;
  empset tmp;
  
  result = erc_create ( );
 
  if (erc_size (s1) > erc_size (s2)) 
    {
      tmp = s1;
      s1 = s2;
      s2 = tmp;
    }
  
  erc_join (result, s1);
 
  empset_elements(s2, emp)
    {
      empset_insertUnique(result, emp);
    } end_empset_elements ;
 
  return result;
}
 
empset empset_union (empset s1, empset s2) 
{
  erc result;
  empset tmp;
 
  result = erc_create ();
 
  if (erc_size (s1) > erc_size (s2)) 
    {
      tmp = s1;
      s1 = s2;
      s2 = tmp;
    }
  erc_join (result, s2);
 
  empset_elements (s1, emp)
    {
      if (!empset_member(emp, s2))
	empset_insert(result, emp);
    } end_empset_elements ;
 
  return result;
}
 
void empset_intersect (empset s1, empset s2) 
{
  erc toDelete = erc_create();
 
  empset_elements (s2, emp)
    {
      if (!empset_member(emp, s2))
	empset_insert(toDelete, emp);
    } end_empset_elements ;
 
  empset_elements (toDelete, emp)
    {
      empset_delete(s1, emp);
    } end_empset_elements;
 
  erc_final (toDelete);
}
 
bool empset_subset (empset s1, empset s2) 
{
  empset_elements(s1, emp)
    {
      if (!empset_member(emp, s2)) return FALSE;
    } end_empset_elements ;
 
  return TRUE;
}
 
void empset_initMod (void) 
  /*@globals initDone, undef known@*/
  /*@modifies initDone, known@*/
{
  if (initDone) 
    {
      /*@-globstate@*/ return; /*@=globstate@*/
    }
 
  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