with Ada.Finalization;
generic
type Held (<>) is private;
package AAA.Containers.Indefinite_Holders with Preelaborate is
-- Simple holder to work around GNAT holders bug
type Holder is tagged private;
Empty_Holder : constant Holder;
procedure Clear (This : in out Holder);
procedure Hold (This : in out Holder; Elem : Held);
function To_Holder (Elem : Held) return Holder with
Post => To_Holder'Result.Is_Valid;
function Is_Empty (This : Holder) return Boolean;
function Is_Valid (This : Holder) return Boolean is (not This.Is_Empty);
function Element (This : Holder) return Held with
Pre => This.Is_Valid;
type Reference_Value (Element : access Held) is limited null record with
Implicit_Dereference => Element;
function Reference (This : in out Holder) return Reference_Value with
Pre => This.Is_Valid;
function Ref (This : in out Holder) return Reference_Value
renames Reference;
function Unchecked_Reference (This : Holder) return access Held with
Pre => This.Is_Valid;
type Const_Ref_Value (Element : access constant Held) is limited null record
with Implicit_Dereference => Element;
function Get (This : Holder) return Const_Ref_Value with
Pre => This.Is_Valid;
function Constant_Reference (This : Holder) return Const_Ref_Value
renames Get;
private
type Held_Access is access all Held;
type Holder is new Ada.Finalization.Controlled with record
Item : Held_Access;
end record;
overriding
procedure Adjust (This : in out Holder);
overriding
procedure Finalize (This : in out Holder);
Empty_Holder : constant Holder := (Ada.Finalization.Controlled with
Item => null);
end AAA.Containers.Indefinite_Holders;