with Ada.Unchecked_Deallocation; package body AAA.Containers.Indefinite_Holders is ----------- -- Clear -- ----------- procedure Clear (This : in out Holder) is begin This.Finalize; end Clear; --------- -- Get -- --------- function Get (This : Holder) return Const_Ref_Value is (Element => This.Item); ---------- -- Hold -- ---------- procedure Hold (This : in out Holder; Elem : Held) is begin This := To_Holder (Elem); end Hold; --------------- -- To_Holder -- --------------- function To_Holder (Elem : Held) return Holder is (Ada.Finalization.Controlled with Item => new Held'(Elem)); -------------- -- Is_Empty -- -------------- function Is_Empty (This : Holder) return Boolean is (This.Item = null); --------------- -- Reference -- --------------- function Reference (This : in out Holder) return Reference_Value is (Element => This.Item); ------------ -- Adjust -- ------------ overriding procedure Adjust (This : in out Holder) is begin if This.Item /= null then This.Item := new Held'(This.Item.all); end if; end Adjust; ------------- -- Element -- ------------- function Element (This : Holder) return Held is (This.Item.all); -------------- -- Finalize -- -------------- overriding procedure Finalize (This : in out Holder) is procedure Free is new Ada.Unchecked_Deallocation (Held, Held_Access); begin Free (This.Item); end Finalize; ------------------------- -- Unchecked_Reference -- ------------------------- function Unchecked_Reference (This : Holder) return access Held is (This.Item); end AAA.Containers.Indefinite_Holders;