with Ada.Finalization; use Ada.Finalization;
with Interfaces; use Interfaces;
package Reference_Counting is
type Reference_Counted is abstract tagged private;
type A_Reference_Counted is access all Reference_Counted'Class;
procedure Delete( this : in out Reference_Counted ) is null;
generic
type Encapsulated is abstract new Reference_Counted with private;
package Smart_Pointers is
type A_Encapsulated is access all Encapsulated'Class;
type Ref is tagged private;
function Get( this : Ref ) return A_Encapsulated;
pragma Inline( Get );
function Get_Refcount( this : Ref ) return Natural;
procedure Set( this : in out Ref; target : Encapsulated'Class );
procedure Set( this : in out Ref; target : access Encapsulated'Class );
overriding
function "="( l, r : Ref ) return Boolean;
Nul : constant Ref;
Null_Ref : constant Ref;
private
type Ref is new Ada.Finalization.Controlled with
record
target : A_Reference_Counted := null;
end record;
overriding
procedure Adjust( this : in out Ref );
overriding
procedure Finalize( this : in out Ref );
Nul : constant Ref := (Controlled with target => null);
Null_Ref : constant Ref := (Controlled with target => null);
end Smart_Pointers;
package Atomic is
function Add( ptr : access Integer_32;
val : Integer_32 ) return Integer_32;
end Atomic;
private
type Reference_Counted is abstract tagged
record
refs : aliased Integer_32 := 0;
end record;
end Reference_Counting;