1
1
mirror of https://github.com/kanaka/mal.git synced 2024-10-05 18:08:55 +03:00
mal/impls/ada/smart_pointers.adb
Joel Martin 8a19f60386 Move implementations into impls/ dir
- Reorder README to have implementation list after "learning tool"
  bullet.

- This also moves tests/ and libs/ into impls. It would be preferrable
  to have these directories at the top level.  However, this causes
  difficulties with the wasm implementations which need pre-open
  directories and have trouble with paths starting with "../../". So
  in lieu of that, symlink those directories to the top-level.

- Move the run_argv_test.sh script into the tests directory for
  general hygiene.
2020-02-10 23:50:16 -06:00

50 lines
1.2 KiB
Ada

with Ada.Unchecked_Deallocation;
package body Smart_Pointers is
function New_Ptr (Base_Class : Base_Class_Accessor) return Smart_Pointer is
begin
return Smart_Pointer'
(Ada.Finalization.Controlled with Pointer => Base_Class);
end New_Ptr;
function Deref (Ptr : Smart_Pointer) return Base_Class_Accessor is
begin
return Ptr.Pointer;
end Deref;
overriding procedure Adjust (Object : in out Smart_Pointer) is
begin
if Object.Pointer /= null then
Object.Pointer.Ref_Count := Object.Pointer.Ref_Count + 1;
end if;
end Adjust;
procedure Free is
new Ada.Unchecked_Deallocation (Base_Class'Class, Base_Class_Accessor);
overriding procedure Finalize (Object : in out Smart_Pointer) is
begin
if Object.Pointer /= null then
if Object.Pointer.Ref_Count > 0 then
Object.Pointer.Ref_Count := Object.Pointer.Ref_Count - 1;
if Object.Pointer.Ref_Count = 0 then
Free (Object.Pointer);
end if;
end if;
end if;
end Finalize;
function Is_Null (Ptr : Smart_Pointer) return Boolean is
begin
return Ptr = Null_Smart_Pointer;
end Is_Null;
end Smart_Pointers;