mirror of
https://github.com/kanaka/mal.git
synced 2024-10-05 18:08:55 +03:00
8a19f60386
- 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.
50 lines
1.2 KiB
Ada
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;
|