-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlog.html
131 lines (131 loc) · 6.82 KB
/
log.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Logging</title>
<link rel="stylesheet" type="text/css" href="slides/slides.css"></head>
<body>
<h1>Logging</h1>
<div class="slides">
<div class="page">
<div class="slide slide-header"><div class="slide-nr">1</div><div class="headers">
<h1>Logging</h1>
</div></div>
<ul><li>
only if the condition is <code><span class="num">false</span></code> (or <code><span class="num">0</span></code>, or <code><span class="num">NULL</span></code>) something will be logged
</li><li>
there are no log levels
</li><li>
the macro will throw an <code><span class="type">std</span>::<span class="var">exception</span></code> if the condition was not met
</li><li>
this normally terminates the running program
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">2</div>
<code>
<span class="macro">@Add(<span class="name">includes</span>)</span><br/>
<span class="in1"></span><span class="keyword">#include</span> <span class="str"><iostream></span><br/>
<span class="in1"></span><span class="keyword">#include</span> <span class="str"><exception></span><br/>
<span class="macro">@End(<span class="name">includes</span>)</span><br/>
</code></div>
<ul><li>
<code><span class="type">std</span>::<span class="var">cerr</span></code> from <code><span class="str"><iostream></span></code> is used to write log messages
</li><li>
a standard exception from <code><span class="str"><exception></span></code> is used to indicate failed conditions
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">3</div>
<code>
<span class="macro">@Def(<span class="name">frag prereqs</span>)</span><br/>
<span class="in1"></span><span class="keyword">#define</span> <span class="fn">ASSERT</span>(<span class="var">COND</span>) \<br/>
<span class="in2"></span><span class="keyword">if</span> (! (<span class="var">COND</span>)) { \<br/>
<span class="in3"></span><span class="macro">@mul(<span class="name">log preamble</span>)</span> \<br/>
<span class="in3"></span><span class="macro">@mul(<span class="name">log newline</span>)</span> \<br/>
<span class="in3"></span><span class="macro">@mul(<span class="name">throw</span>)</span> \<br/>
<span class="in2"></span>}<br/>
<span class="macro">@End(<span class="name">frag prereqs</span>)</span><br/>
</code></div>
<ul><li>
the plain <code><span class="fn">ASSERT</span></code> macro does nothing if the condition evaluates to <code><span class="num">true</span></code>
</li><li>
otherwise the position of the line with the assertion will be written
</li><li>
and a small message
</li><li>
no details are given and the line is terminated with a newline
</li><li>
then an exception is raised
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">4</div>
<code>
<span class="macro">@Add(<span class="name">frag prereqs</span>)</span><br/>
<span class="in1"></span><span class="keyword">#define</span> <span class="fn">ASSERT_MSG</span>(<span class="var">COND</span>, <span class="var">MSG</span>) \<br/>
<span class="in2"></span><span class="keyword">if</span> (! (<span class="var">COND</span>)) { \<br/>
<span class="in3"></span><span class="macro">@mul(<span class="name">log preamble</span>)</span> \<br/>
<span class="in3"></span><span class="type">std</span>::<span class="var">cerr</span> << <span class="str">": "</span> << <span class="var">MSG</span>; \<br/>
<span class="in3"></span><span class="macro">@mul(<span class="name">log newline</span>)</span> \<br/>
<span class="in3"></span><span class="macro">@mul(<span class="name">throw</span>)</span> \<br/>
<span class="in2"></span>}<br/>
<span class="macro">@End(<span class="name">frag prereqs</span>)</span><br/>
</code></div>
<ul><li>
the macro <code><span class="fn">ASSERT_MSG</span></code> has an additional argument that the macro writes after the preamble
</li><li>
<code><span class="var">MSG</span></code> can be multiple parameters concatenated by <code><<</code>
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">5</div>
<code>
<span class="macro">@Add(<span class="name">frag prereqs</span>)</span><br/>
<span class="in1"></span><span class="keyword">#define</span> <span class="fn">WARN_MSG</span>(<span class="var">MSG</span>) \<br/>
<span class="in2"></span><span class="type">std</span>::<span class="var">cerr</span> << <span class="var">__FILE__</span> << <span class="str">':'</span> << \<br/>
<span class="in3"></span><span class="var">__LINE__</span> << <span class="str">' '</span>; \<br/>
<span class="in2"></span><span class="type">std</span>::<span class="var">cerr</span> << <span class="var">MSG</span>; \<br/>
<span class="in2"></span><span class="macro">@mul(<span class="name">log newline</span>)</span><br/>
<span class="macro">@end(<span class="name">frag prereqs</span>)</span><br/>
</code></div>
<ul><li>
a warning writes the same message, as an assertion
</li><li>
but it will not terminate the program
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">6</div>
<code>
<span class="macro">@def(<span class="name">log preamble</span>)</span> \<br/>
<span class="in1"></span><span class="type">std</span>::<span class="var">cerr</span> << \<br/>
<span class="in2"></span><span class="var">__FILE__</span> << <span class="str">':'</span> << <span class="var">__LINE__</span> << \<br/>
<span class="in2"></span><span class="str">' '</span> << <span class="keyword">#COND</span> << <span class="str">" FAILED"</span>; \<br/>
<span class="macro">@end(<span class="name">log preamble</span>)</span><br/>
</code></div>
<ul><li>
the preamble starts with the position in the format <code><span class="var">filename</span>:<span class="var">line</span></code>
</li><li>
this is recognized by a number of editors
</li><li>
afterwards a short error message is written
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">7</div>
<code>
<span class="macro">@def(<span class="name">log newline</span>)</span> \<br/>
<span class="in1"></span><span class="type">std</span>::<span class="var">cerr</span> << <span class="str">'\n'</span>; \<br/>
<span class="macro">@end(<span class="name">log newline</span>)</span><br/>
</code></div>
<ul><li>
a simple newline terminates an error message
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">8</div>
<code>
<span class="macro">@def(<span class="name">throw</span>)</span> \<br/>
<span class="in1"></span><span class="keyword">throw</span> <span class="type">std</span>::<span class="fn">exception</span>(); \<br/>
<span class="macro">@end(<span class="name">throw</span>)</span><br/>
</code></div>
<ul><li>
the assert macros throw a generic <code><span class="type">std</span>::<span class="var">exception</span></code> if the condition was not met
</li></ul>
</div>
</body>
</html>