private with Ada.Finalization;
-- with Ada.Containers.Indefinite_Holders;
-- with Ada.Containers.Indefinite_Doubly_Linked_Lists;
-- This is a workaround for a memory leak in the Indefinite_Holders (as of GPL2016)
-- It turns out Lists are broken too in instantiation from rx-from.adb
-- Rolling out my own holders (probably buggy too, or inefficient, or whatever...)
generic
type Indef (<>) is private;
Id : String := "anonymous holder"; -- Debug purposes only
package Rx.Tools.Holders with Preelaborate is
type Indef_Access is access Indef;
-- for Indef_Access'Storage_Pool use Debug.Debug_Pool;
type Definite is tagged private;
type Reference (Actual : access Indef) is limited null record
with Implicit_Dereference => Actual;
type Const_Ref (Actual : access constant Indef) is limited null record
with Implicit_Dereference => Actual;
function "+" (I : Indef) return Definite;
function "+" (D : Definite) return Indef;
function Get (D : Definite) return Indef renames "+";
procedure Hold (D : in out Definite; I : Indef);
function Hold (I : Indef) return Definite renames "+";
function Ref (D : in out Definite) return Reference; -- bug workaround
function CRef (D : Definite) return Const_Ref;
function Is_Empty (D : Definite) return Boolean;
function Is_Valid (D : Definite) return Boolean is (not Is_Empty (D));
procedure Clear (D : in out Definite);
-- Dispose of the stored definite
private
use Ada.Finalization;
type Definite is new Ada.Finalization.Controlled with record
Actual : Indef_Access;
end record;
overriding procedure Initialize (D : in out Definite);
overriding procedure Adjust (D : in out Definite);
overriding procedure Finalize (D : in out Definite);
procedure Clear (D : in out Definite) renames Finalize;
function "+" (D : Definite) return Indef is (D.Actual.all);
function Is_Empty (D : Definite) return Boolean is (D.Actual = null);
end Rx.Tools.Holders;