New specification for Ada Finalization Controlled (GNAT Reference Manual) (original) (raw)
17.3.8.1 New specification for Ada.Finalization.Controlled
¶
Ada.Finalization.Controlled
is now specified as:
type Controlled is abstract tagged null record with Initialize => Initialize, Adjust => Adjust, Finalize => Finalize, Legacy_Heap_Finalization, Exceptions_In_Finalize;
procedure Initialize (Self : in out Controlled) is abstract;
procedure Adjust (Self : in out Controlled) is abstract;
procedure Finalize (Self : in out Controlled) is abstract;
### Examples
A simple example of a ref-counted type:
type T is record Value : Integer; Ref_Count : Natural := 0; end record;
procedure Inc_Ref (X : in out T); procedure Dec_Ref (X : in out T);
type T_Access is access all T;
type T_Ref is record Value : T_Access; end record with Adjust => Adjust, Finalize => Finalize;
procedure Adjust (Ref : in out T_Ref) is begin Inc_Ref (Ref.Value); end Adjust;
procedure Finalize (Ref : in out T_Ref) is begin Def_Ref (Ref.Value); end Finalize;
A simple file handle that ensures resources are properly released:
package P is type File (<>) is limited private;
function Open (Path : String) return File;
procedure Close (F : in out File); private type File is limited record Handle : ...; end record with Finalize => Close;