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

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