with Monitor;
generic
    type Domain is private;
    type Ranges is private;
    with function Hash_Of (The_Domain : in Domain) return Positive;
package Map_Simple_Noncached_Multiple_Bounded_Managed_Noniterator is

    type Map (The_Size : Positive) is limited private;

    procedure Copy (From_The_Map : in Map; To_The_Map : in out Map);
    procedure Clear (The_Map : in out Map);
    procedure Bind (The_Domain : in Domain;
                    And_The_Range : in Ranges;
                    In_The_Map : in out Map);
    procedure Unbind (The_Domain : in Domain; In_The_Map : in out Map);

    function Is_Equal (Left : in Map; Right : in Map) return Boolean;
    function Extent_Of (The_Map : in Map) return Natural;
    function Is_Empty (The_Map : in Map) return Boolean;
    function Is_Bound
                (The_Domain : in Domain; In_The_Map : in Map) return Boolean;
    function Range_Of
                (The_Domain : in Domain; In_The_Map : in Map) return Ranges;

    Overflow : exception;
    Domain_Is_Not_Bound : exception;
    Multiple_Binding : exception;

private
    type State is (Empty, Deleted, Bound);
    type Node is
        record
            The_State : State := Empty;
            The_Domain : Domain;
            The_Range : Ranges;
        end record;
    type Items is array (Positive range <>) of Node;
    type Map (The_Size : Positive) is
        record
            Guard : Monitor.Kind;
            The_Items : Items (1 .. The_Size);
            The_Count : Natural := 0;
        end record;
end Map_Simple_Noncached_Multiple_Bounded_Managed_Noniterator;