with Monitor;
generic
    type Domain is (<>);
    type Ranges is private;
package Map_Discrete_Noncached_Multiple_Bounded_Managed_Noniterator is

    type Map 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;

    Domain_Is_Not_Bound : exception;
    Multiple_Binding : exception;

private
    type Node is
        record
            Is_Bound : Boolean := False;
            The_Range : Ranges;
        end record;
    type Items is array (Domain) of Node;
    type Map is
        record
            Guard : Monitor.Kind;
            The_Items : Items;
        end record;
end Map_Discrete_Noncached_Multiple_Bounded_Managed_Noniterator;