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] <-