with Ada.Finalization, Ada.Unchecked_Deallocation; generic type Object is private; package Safe_Pointers.On_Definite_Types is type Safe_Pointer is private; function Null_Pointer return Safe_Pointer; function "=" (Left, Right: Safe_Pointer) return Boolean; procedure Allocate (Pointer: in out Safe_Pointer); procedure Allocate (Pointer: in out Safe_Pointer; Value : in Object); procedure Deallocate (Pointer: in out Safe_Pointer); procedure Alias (Pointer: in out Safe_Pointer; Value : access Object); procedure Assign (Pointer: in Safe_Pointer; Value : in Object); function Value (Pointer: Safe_Pointer) return Object; private type Object_Pointer is access all Object; pragma Controlled (Object_Pointer); procedure Free is new Ada.Unchecked_Deallocation (Object, Object_Pointer); type Track is record Object: Object_Pointer; Count : Natural := 0; Pool_Element: Boolean := True; end record; type Tracker is access Track; pragma Controlled (Tracker); procedure Free is new Ada.Unchecked_Deallocation (Track, Tracker); Null_Track: constant Tracker := new Track; type Safe_Pointer is new Ada.Finalization.Controlled with record Track: Tracker := Null_Track; end record; procedure Adjust (Pointer: in out Safe_Pointer); procedure Finalize (Pointer: in out Safe_Pointer); end Safe_Pointers.On_Definite_Types;
Back to text.