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;