Skip to content

Commit 291e0c4

Browse files
committed
controlled: add logger example
1 parent b700b45 commit 291e0c4

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
======
2+
Logger
3+
======
4+
5+
----------------
6+
Public Interface
7+
----------------
8+
9+
* :ada:`Logger` uses a file for writing
10+
* :ada:`limited` cannot be copied, or compared
11+
* :ada:`procedure Put_Line` for logging
12+
13+
.. code:: Ada
14+
15+
type Logger (Filename : not null access constant String)
16+
is tagged limited private;
17+
18+
procedure Put_Line
19+
(L : Logger; S : String);
20+
21+
----------------------------
22+
Implementation: Private part
23+
----------------------------
24+
25+
.. code:: Ada
26+
27+
type Logger (Filename : not null access constant String)
28+
is new Ada.Finalization.Limited_Controlled with
29+
30+
.. note::
31+
32+
* :ada:`Limited_Controlled`
33+
* Maintains a handle to the log file
34+
35+
.. code:: Ada
36+
37+
record
38+
Logfile : Ada.Text_IO.File_Type;
39+
end record;
40+
41+
procedure Initialize (L : in out Logger);
42+
-- opens the file
43+
procedure Finalize (L : in out Logger);
44+
-- closes the file
45+
46+
--------------------
47+
Implementation: Body
48+
--------------------
49+
50+
* Trivial
51+
52+
.. tip::
53+
54+
Once the hard part of designing the interface is done, implementation is trivial.
55+
56+
.. code:: Ada
57+
58+
with Ada.Text_IO; use Ada.Text_IO;
59+
60+
package body Loggers is
61+
procedure Initialize (L : in out Logger) is
62+
begin
63+
Create (L.Logfile, Out_File, L.Filename.all);
64+
Put_Line (L, "Starting");
65+
end Initialize;
66+
67+
procedure Put_Line (L : Logger; S : String) is
68+
begin
69+
Put_Line ("Logger: " & S);
70+
Put_Line (L.Logfile, S);
71+
end Put_Line;
72+
73+
procedure Finalize
74+
(L : in out Logger) is
75+
begin
76+
Put_Line (L, "Closing");
77+
Close (L.Logfile);
78+
end Finalize;
79+
end Loggers;

courses/fundamentals_of_ada/700_expert_resource_management.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,6 @@ Expert Resource Management
3939
.. include:: 110_private_types/07-limited_private.rst
4040
.. include:: 140_access_types/11-idiom_constant_pointer.rst
4141
.. include:: 260_controlled_types/10-idiom_refcounting.rst
42+
.. include:: 260_controlled_types/11-example_logger.rst
4243
.. include:: 240_tasking/21-gnat_semaphores.rst
4344
.. include:: 240_tasking/22-task_safe_interfaces.rst

0 commit comments

Comments
 (0)