with Monitor;
generic
    type Item is private;
package Set_Simple_Multiple_Bounded_Managed_Iterator is

    type Set (The_Size : Positive) is limited private;

    procedure Copy (From_The_Set : in Set; To_The_Set : in out Set);
    procedure Clear (The_Set : in out Set);
    procedure Add (The_Item : in Item; To_The_Set : in out Set);
    procedure Remove (The_Item : in Item; From_The_Set : in out Set);
    procedure Union (Of_The_Set : in Set;
                     And_The_Set : in Set;
                     To_The_Set : in out Set);
    procedure Intersection (Of_The_Set : in Set;
                            And_The_Set : in Set;
                            To_The_Set : in out Set);
    procedure Difference (Of_The_Set : in Set;
                          And_The_Set : in Set;
                          To_The_Set : in out Set);

    function Is_Equal (Left : in Set; Right : in Set) return Boolean;
    function Extent_Of (The_Set : in Set) return Natural;
    function Is_Empty (The_Set : in Set) return Boolean;
    function Is_A_Member
                (The_Item : in Item; Of_The_Set : in Set) return Boolean;
    function Is_A_Subset (Left : in Set; Right : in Set) return Boolean;
    function Is_A_Proper_Subset (Left : in Set; Right : in Set) return Boolean;

    generic
        with procedure Process (The_Item : in Item; Continue : out Boolean);
    procedure Iterate (Over_The_Set : in Set);

    Overflow : exception;
    Item_Is_In_Set : exception;
    Item_Is_Not_In_Set : exception;

private
    type Items is array (Positive range <>) of Item;
    type Set (The_Size : Positive) is
        record
            Guard : Monitor.Kind;
            The_Back : Natural := 0;
            The_Items : Items (1 .. The_Size);
        end record;
end Set_Simple_Multiple_Bounded_Managed_Iterator;