abstract class AbsSet{

/******
    Sets of any type of elements built over class SetElement.

  public boolean isMember(SetElement element)
  public void    addElement(SetElement  element)
  public void    deleteElement(SetElement  element)
  public void    union(SetOfG A)
  public void    intersect(SetOfG A)
  public void    print()
  public SetElement      getElement(int i)
  public void    setElement(int i, SetElement  element)
  public int     getsize()
  public void    setsize()
 
 THE FOLLOWING ARE THE ABSTRACT METHODS 
******/
  abstract int findElement(SetElement  element);
  abstract void insert(SetElement  element);
  abstract void deleteAtIndex(int index);

/* ALL DATA IS private: */
  private SetElement[] elements; // array of integers
  private int   size; // current number of elements

  public static final int NOT_FOUND =  -1 ; // code for not found 

  public AbsSet(int capacity)
  {
    elements = new SetElement [capacity];
    size = 0;
  }

  public boolean isMember(SetElement  element){
    return (findElement(element) != NOT_FOUND );
  }

  public void addElement(SetElement  element){
    // add the element to the array of elements
    // unless its already there and if the 
    // representation is not at full capacity

    if (! isMember(element))
      if (getsize() < elements.length)
        insert(element);
      else
        System.out.println("set size overflow");
  }

  public void deleteElement(SetElement  element){
    // delete the element from the 
    // array if it is there

    int index = findElement(element);
    if (index != NOT_FOUND ) deleteAtIndex(index);
  }

  public void union(SetOfG A){
    // union the elements of this set with those of A
    for (int i = 0; i < A.getsize(); i=i+1)
      this.addElement(A.getElement(i));
  }

  public void intersect(SetOfG A){
    // intersect  the elements of this set with those of A 
    int i = 0;
    while (i < this.getsize())
      if (A.isMember(this.getElement(i)))
        i = i+1; // increments i
      else
        this.deleteAtIndex(i); // decrements size (rechecks i)
  }

  public void print(){
    System.out.print("{ ");
    for (int i = 0; i<getsize()-1; i=i+1){
      getElement(i).print();
      System.out.print(", ");
    }
    if (getsize() > 0) getElement(getsize()-1).print();
    System.out.print(" }");
    System.out.println();
  }

  public SetElement  getElement(int i){ return elements[i]; }
  public void setElement(int i, SetElement  e){ elements[i]=e; }
  public int     getsize(){ return size;}
  public void setsize(int i){ size=i;};

}

abstract class SetElement {
          abstract void print() ;
          abstract boolean equals(SetElement s);
          abstract boolean issmaller (SetElement s);
}

