Commit | Line | Data |
---|---|---|
acb927d4 CM |
1 | with Ada.Finalization; |
2 | ||
3 | package Smart_Pointers is | |
4 | ||
5 | -- Classes we want to track derrive from Base Class. | |
6 | type Base_Class is abstract tagged private; | |
7 | ||
8 | type Base_Class_Accessor is access Base_Class'Class; | |
9 | ||
10 | ||
11 | type Smart_Pointer is private; | |
12 | ||
13 | function New_Ptr (Base_Class : Base_Class_Accessor) return Smart_Pointer; | |
14 | ||
15 | function Deref (Ptr : Smart_Pointer) return Base_Class_Accessor; | |
16 | ||
17 | Null_Smart_Pointer : constant Smart_Pointer; | |
18 | ||
19 | private | |
20 | ||
21 | type Base_Class is abstract tagged record | |
22 | Ref_Count : Natural := 1; | |
23 | end record; | |
24 | ||
25 | ||
26 | type Smart_Pointer is new Ada.Finalization.Controlled with record | |
27 | Pointer : Base_Class_Accessor; | |
28 | end record; | |
29 | ||
30 | overriding procedure Adjust (Object : in out Smart_Pointer); | |
31 | ||
32 | overriding procedure Finalize (Object : in out Smart_Pointer); | |
33 | ||
34 | Null_Smart_Pointer : constant Smart_Pointer := | |
35 | (Ada.Finalization.Controlled with Pointer => null); | |
36 | ||
37 | end Smart_Pointers; |