private with Ada.Finalization;
generic
type Element_Type is limited private;
type Element_Type_Access is access Element_Type;
with procedure Initialize (item : in out Element_Type) is <>;
with procedure Copy (target : in out Element_Type; source : in Element_Type) is <>;
with procedure Finalize (item : in out Element_Type) is <>;
package DDS.Limited_Holders_Generic is
-- This is a suport package intended to wrap limited DDS-datatypes
-- in such a way that they coud be used as non limited types.
-- The interface is modeled after Ada.Containers.Holders.
--
-- declare
-- use DDS;
-- package String_Holders is new DDS.Limited_Holders_Generic
-- (Element_Type => DDS.String,
-- Element_Type_Access => DDS.String_Ptr);
--
-- H1 : String_Holders.Holder;
-- Data : aliased DDS.String := DDS.To_DDS_String("Test Data");
-- H0 : String_Holders.Holder := String_Holders."+"(Data);
-- begin
-- H1 := H0; -- H1 will now contain a copy of the DDS.string Data;
-- end;
-- -- The content of the Holders H0 and H1 will be freed when the
-- -- declare block gous out of scope.
--
-- Note the the holder contains a full copy of the object and an assignment
-- implies a deep copy of the object, it could result in hevy CPU usage:
type Holder is tagged private;
function To_Holder (New_Item : Element_Type) return Holder;
function "+" (New_Item : Element_Type) return Holder renames To_Holder;
-- Create a new holder the contains a copy of the object.
function Get (Container : Holder) return Element_Type_Access;
-- Returns a reference to the stored object.
procedure Set (Container : in out Holder; New_Item : Element_Type);
-- Makes a new copy of the object and stores it in the Holder.
procedure References (Container : in out Holder; New_Item : Element_Type_Access);
-- Sets the holder to reference the object without copy.
private
type Holder is new Ada.Finalization.Controlled with record
impl : Element_Type_Access;
Is_Reference : Boolean := False;
end record;
procedure Initialize (Object : in out Holder);
procedure Adjust (Object : in out Holder);
procedure Finalize (Object : in out Holder);
end DDS.Limited_Holders_Generic;