34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
+
+
+
+
+
+
+
+
+
+
+
+
+
|
pragma Preelaborate (References);
type Accessor (Data : not null access constant Held_Data) is
limited private;
type Mutator (Data : not null access Held_Data) is
limited private;
type Data_Access is access Held_Data;
for Data_Access'Storage_Pool use Data_Pool;
type Immutable_Reference is new Ada.Finalization.Controlled with private;
function Create
(Constructor : not null access function return Held_Data)
return Immutable_Reference;
-- Create a new held object and return a reference to it
procedure Replace
(Ref : in out Immutable_Reference;
Constructor : not null access function return Held_Data);
-- Replace the object held in Ref with a newly created object
function Create
(Constructor : not null access function return Data_Access)
return Immutable_Reference;
-- Create a new held object and return a reference to it
procedure Replace
(Ref : in out Immutable_Reference;
Constructor : not null access function return Data_Access);
-- Replace the object held in Ref with a newly created object
procedure Reset (Ref : in out Immutable_Reference);
-- Empty Ref
function Is_Empty (Ref : Immutable_Reference) return Boolean;
-- Check whether Ref refers to an actual object
function "=" (Left, Right : Immutable_Reference) return Boolean;
|
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
-
-
-
|
private
type Counter is new Natural;
type Counter_Access is access Counter;
for Counter_Access'Storage_Pool use Counter_Pool;
type Data_Access is access Held_Data;
for Data_Access'Storage_Pool use Data_Pool;
type Immutable_Reference is new Ada.Finalization.Controlled with record
Count : Counter_Access := null;
Data : Data_Access := null;
end record;
overriding procedure Adjust (Object : in out Immutable_Reference);
-- Increate reference counter
|