private with Ada.Containers.Indefinite_Holders;
private with Ada.Containers.Vectors;
generic
type Key_Type is private;
type Element_Type (<>) is private;
with function "<" (Left, Right : Key_Type) return Boolean is <>;
with function "=" (Left, Right : Element_Type) return Boolean is <>;
package WL.Indefinite_Heaps is
type Heap is tagged private;
function Is_Empty
(Container : Heap)
return Boolean;
procedure Clear (Container : in out Heap);
procedure Insert
(Container : in out Heap;
Key : Key_Type;
Element : Element_Type);
procedure Replace
(Container : in out Heap;
Key : Key_Type;
Element : Element_Type);
function First_Element
(Container : Heap)
return Element_Type;
function First_Key
(Container : Heap)
return Key_Type;
procedure Delete_First
(Container : in out Heap);
procedure Iterate
(Container : Heap;
Process : not null access
procedure (Key : Key_Type;
Element : Element_Type));
private
package Element_Holders is
new Ada.Containers.Indefinite_Holders (Element_Type);
type Heap_Element is
record
Key : Key_Type;
Element : Element_Holders.Holder;
end record;
package Heap_Vectors is
new Ada.Containers.Vectors (Positive, Heap_Element);
type Heap is tagged
record
Vector : Heap_Vectors.Vector;
end record;
function First_Element
(Container : Heap)
return Element_Type
is (Container.Vector.First_Element.Element.Element);
function First_Key
(Container : Heap)
return Key_Type
is (Container.Vector.First_Element.Key);
end WL.Indefinite_Heaps;