package body Safe_Pointers.On_Definite_Types is
function Null_Pointer return Safe_Pointer is
begin
return (Ada.Finalization.Controlled with
Track => Null_Track);
end Null_Pointer;
function "=" (Left, Right: Safe_Pointer) return Boolean is
begin
return Left.Track.Object = Right.Track.Object;
end "=";
procedure Adjust (Pointer: in out Safe_Pointer) is
begin
if Pointer.Track /= Null_Track then
Pointer.Track.Count := Pointer.Track.Count + 1;
end if;
end Adjust;
procedure Finalize (Pointer: in out Safe_Pointer) is
begin
if Pointer.Track /= Null_Track then
Pointer.Track.Count := Pointer.Track.Count - 1;
if Pointer.Track.Count = 0 then -- last pointer
if Pointer.Track.Pool_Element then
Free (Pointer.Track.Object);
end if;
Free (Pointer.Track);
end if;
end if;
end Finalize;
procedure Allocate (Pointer: in out Safe_Pointer) is
begin
Finalize (Pointer);
Pointer.Track := new Track'(new Object, 1, Pool_Element => True);
end Allocate;
procedure Allocate (Pointer: in out Safe_Pointer; Value: in Object) is
begin
Finalize (Pointer);
Pointer.Track := new Track'(new Object'(Value), 1, Pool_Element => True);
end Allocate;
procedure Deallocate (Pointer: in out Safe_Pointer) is
begin
if Pointer.Track = Null_Track then
return;
end if;
if Pointer.Track.Pool_Element then
Free (Pointer.Track.Object);
end if;
Pointer.Track.Count := Pointer.Track.Count - 1;
if Pointer.Track.Count = 0 then -- last pointer
Free (Pointer.Track);
end if;
Pointer.Track := Null_Track;
end Deallocate;
procedure Assign (Pointer: in Safe_Pointer; Value: in Object) is
begin
Pointer.Track.Object.all := Value;
end Assign;
function Value (Pointer: Safe_Pointer) return Object is
begin
return Pointer.Track.Object.all;
end Value;
procedure Alias (Pointer: in out Safe_Pointer; Value : access Object) is
begin
Finalize (Pointer);
Pointer.Track := new Track'(Object_Pointer (Value), 1, Pool_Element => False);
end Alias;
end Safe_Pointers.On_Definite_Types;
Back to text.