Section Header
    + name := HASHED_SET[E];
    - comment := "Definition of a mathematical set of hashable objects.";
All common operations on mathematical sets are available.
Section Inherit
    + parent_set:Expanded SET[E];
Section Public
    - default_size:INTEGER :=
        Minimum size for storage in number of items.
Section SET
    + buckets:NATIVE_ARRAY[HASHED_SET_NODE[E]];
        The `buckets' storage area is the primary hash table of `capacity'
        elements. To search some element, the first access is done in
        `buckets' using the remainder of the division of the key `hash_code' by
        `capacity'. In order to try to avoid clashes, `capacity' is always a
        prime number (selected using HASH_TABLE_SIZE).
Internal cache handling:
    + cache_user:INTEGER;
        The last user's external index in range [1 .. `count'] (see `item'
        and `valid_index' for example) may be saved in `cache_user' otherwise
        -1 to indicate that the cache is not active. When the cache is
        active, the corresponding index in `buckets' is save in
        `cache_buckets' and the corresponding node in `cache_node'.
    + cache_node:HASHED_SET_NODE[E];
        Meaningful only when `cache_user' is not -1.
    + cache_buckets:INTEGER;
        Meaningful only when `cache_user' is not -1.
Section Public
    - create:SELF <-
        Create an empty set. Internal storage `capacity' of the set is
        initialized using the `Default_size' value. Then, tuning of needed
        storage size is done automatically according to usage. If you
        are really sure that your set is always really bigger than
        `Default_size', you may use `with_capacity' to save some execution time.
    - make <-
    - create_with_capacity sz:INTEGER :SELF <-
        Create an empty set using `medium_size' as an appropriate value
        to help initialization of `capacity'. Thus, this feature may be used
        in place of `make' to save some execution time if one is sure that
        storage size will rapidly become really bigger than `Default_size' (if
        not sure, simply use `make'). Anyway, the initial `medium_size' value
        is just an indication and never a limit for the possible
        `capacity'. Keep in mind that the `capacity' tuning is done
        automatically according to usage.
    - with_capacity medium_size:INTEGER <-
Counting:
    + capacity:INTEGER;
        Of the `buckets' storage area.
    + count:INTEGER;
Adding and removing:
    - add e:E <-
        Add a new item to the set:the mathematical definition of
        adding in a set is followed.
    - fast_add e:E <-
        Add a new item to the set:the mathematical definition of
        adding in a set is followed.
    - remove e:E <-
        Remove item `e' from the set:the mathematical definition of
        removing from a set is followed.
    - fast_remove e:E <-
        Remove item `e' from the set:the mathematical definition of
        removing from a set is followed.
    - clear <-
        Empty the current set.
Looking and searching:
    - has e:E :BOOLEAN <-
        Is element `e' in the set?
    - fast_has e:E :BOOLEAN <-
        Is element `e' in the set?
    - reference_at e:E :E <-
To provide iterating facilities:
    - item i:INTEGER :E <-
        Return the item indexed by `index'.
Mathematical operations:
    - intersection other:SELF <-
        Make the intersection of the `self' set with `other'.
    - copy other:SELF <-
        Copy 'other' into the current set
    - from_collection model:COLLECTION[E] <-