/// As each HashSet is backed by a
/// Hashtable, all requirements that
/// apply for the Hashtable keys apply for the elements of a HashSet
/// as well.
///
/// The HashSet class overrides the methods
/// GetHashCode and Equals
/// (inherited from Object) in order to provide
/// structural equality:
/// two sets are equal iff they contain the same elements (where the semantics of "same"
/// is defined by the Equals method of those objects). You can put HashSets into
/// HashSets; however, to avoid infinite loops, you should never insert a HashSet
/// into itself.
/// The hashcode of a HashSet is defined as the "xor" of the hashcodes of the set
/// elements.
///
///
/// The GetHashCode function of a HashSet executes in O(1) time:
/// the hashcode is dynamically updated after each operation that modifies the set.
/// If the hashcode functions used for all the other involved objects is good and
/// is computed in O(1) time, one element addition and removal execute in
/// O(1) time; Equals works in time linear to the number of elements of
/// this set.
///
///
public class HashSet: AbstrSet
{
// the Hashtable that backs up the implementation of this HashSet
// an element is in the set if it's a key in the Hashtable
protected Hashtable! hash;
private Hashtable! Hash { get { return this.hash; } }
// all keys are associated with the bogus value VALUE
protected static object VALUE = new object();
///