-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinput.html
255 lines (255 loc) · 13.6 KB
/
input.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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Input Files</title>
<link rel="stylesheet" type="text/css" href="slides/slides.css"></head>
<body>
<h1>Input Files</h1>
<div class="slides">
<div class="page">
<div class="slide slide-header"><div class="slide-nr">1</div><div class="headers">
<h1>Input Files</h1>
</div></div>
<ul><li>
structure for handling input files
</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="var">iostream</span>><br/>
<span class="in1"></span><span class="keyword">#include</span> <<span class="type">vector</span>><br/>
<span class="in1"></span><span class="keyword">#include</span> <<span class="var">filesystem</span>><br/>
<span class="macro">@End(<span class="name">includes</span>)</span><br/>
</code></div>
<ul><li>
needed includes
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">3</div>
<code>
<span class="macro">@Add(<span class="name">inputs elements</span>)</span><br/>
<span class="in1"></span><span class="type">auto</span> &<span class="fn">cur</span>() {<br/>
<span class="in2"></span><span class="var">ASSERT</span> (! <span class="var">open_</span>.<span class="fn">empty</span>());<br/>
<span class="in2"></span><span class="keyword">return</span> <span class="var">open_</span>.<span class="fn">back</span>();<br/>
<span class="in1"></span>}<br/>
<span class="in1"></span><span class="type">auto</span> &<span class="fn">cur_input</span>() {<br/>
<span class="in2"></span><span class="keyword">return</span> <span class="var">used_</span>.<span class="fn">find</span>(<span class="fn">cur</span>().<span class="fn">path</span>())-><span class="var">second</span>;<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">inputs elements</span>)</span><br/>
</code></div>
<ul><li>
last opened open input file
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">4</div>
<code>
<span class="macro">@Add(<span class="name">inputs elements</span>)</span><br/>
<span class="in1"></span><span class="type">auto</span> <span class="fn">begin</span>() {<br/>
<span class="in2"></span><span class="keyword">return</span> <span class="var">used_</span>.<span class="fn">begin</span>();<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">inputs elements</span>)</span><br/>
</code></div>
<ul><li>
begin iterator for used input files
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">5</div>
<code>
<span class="macro">@Add(<span class="name">inputs elements</span>)</span><br/>
<span class="in1"></span><span class="type">auto</span> <span class="fn">end</span>() {<br/>
<span class="in2"></span><span class="keyword">return</span> <span class="var">used_</span>.<span class="fn">end</span>();<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">inputs elements</span>)</span><br/>
</code></div>
<ul><li>
end iterator for used input files
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">6</div>
<code>
<span class="macro">@Add(<span class="name">inputs elements</span>)</span><br/>
<span class="in1"></span><span class="type">auto</span> <span class="fn">size</span>() <span class="type">const</span> {<br/>
<span class="in2"></span><span class="keyword">return</span> <span class="var">used_</span>.<span class="fn">size</span>();<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">inputs elements</span>)</span><br/>
</code></div>
<ul><li>
number of used input files
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">7</div>
<code>
<span class="macro">@Add(<span class="name">inputs elements</span>)</span><br/>
<span class="in1"></span><span class="type">void</span> <span class="fn">push</span>(<span class="type">const</span> <span class="type">std</span>::<span class="type">string</span> &<span class="var">path</span>) {<br/>
<span class="in2"></span><span class="type">std</span>::<span class="type">string</span> <span class="var">prev</span>;<br/>
<span class="in2"></span><span class="keyword">if</span> (<span class="var">open_</span>.<span class="fn">size</span>()) {<br/>
<span class="in3"></span><span class="type">auto</span> <span class="var">got</span> { <span class="var">used_</span>.<span class="fn">find</span>(<span class="var">open_</span>.<span class="fn">back</span>().<span class="fn">path</span>()) };<br/>
<span class="in3"></span><span class="keyword">if</span> (<span class="var">got</span> != <span class="var">used_</span>.<span class="fn">end</span>()) {<br/>
<span class="in4"></span><span class="var">prev</span> = <span class="var">open_</span>.<span class="fn">back</span>().<span class="fn">path</span>();<br/>
<span class="in3"></span>}<br/>
<span class="in2"></span>}<br/>
<span class="in2"></span><span class="var">used_</span>.<span class="fn">insert</span>(<span class="type">std</span>::<span class="fn">move</span>(<br/>
<span class="in3"></span><span class="type">std</span>::<span class="type">map</span><<span class="type">std</span>::<span class="type">string</span>, <span class="type">Input</span>>::<span class="fn">value_type</span>(<span class="var">path</span>, <span class="fn">Input</span>(<span class="var">prev</span>))<br/>
<span class="in2"></span>));<br/>
<span class="in2"></span><span class="var">open_</span>.<span class="fn">emplace_back</span>(<span class="var">path</span>);<br/>
<span class="in1"></span>}<br/>
<span class="in1"></span><span class="type">const</span> <span class="type">std</span>::<span class="type">string</span> <span class="fn">open_head</span>() <span class="type">const</span> {<br/>
<span class="in2"></span><span class="fn">ASSERT</span>(! <span class="var">open_</span>.<span class="fn">empty</span>());<br/>
<span class="in2"></span><span class="keyword">return</span> <span class="var">open_</span>.<span class="fn">back</span>().<span class="fn">path</span>();<br/>
<span class="in1"></span>}<br/>
<span class="in1"></span><span class="type">Input</span> &<span class="var">operator</span>[](<span class="type">const</span> <span class="type">std</span>::<span class="type">string</span> &<span class="var">name</span>) {<br/>
<span class="in2"></span><span class="keyword">return</span> <span class="var">used_</span>[<span class="var">name</span>];<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">inputs elements</span>)</span><br/>
</code></div>
<ul><li>
open new input file
</li><li>
is recorded as used input file
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">8</div>
<code>
<span class="macro">@Add(<span class="name">inputs elements</span>)</span><br/>
<span class="in1"></span><span class="type">void</span> <span class="fn">add</span>(<span class="type">const</span> <span class="type">std</span>::<span class="type">string</span> &<span class="var">path</span>) {<br/>
<span class="in2"></span><span class="var">roots_</span>.<span class="fn">push_back</span>(<span class="var">path</span>);<br/>
<span class="in2"></span><span class="fn">push</span>(<span class="var">path</span>);<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">inputs elements</span>)</span><br/>
</code></div>
<ul><li>
add a file to be processed
</li></ul>
</div>
</div>
<h1>Get next line</h1>
<div class="slides">
<div class="page">
<div class="slide slide-header"><div class="slide-nr">9</div><div class="headers">
<h1>Get next line</h1>
</div></div>
<ul><li>
reads next line from the current input file
</li><li>
if the end is reached, the current input file in popped
</li><li>
and the line is read from the previous input file
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">10</div>
<code>
<span class="macro">@Add(<span class="name">inputs elements</span>)</span><br/>
<span class="in1"></span><span class="type">bool</span> <span class="fn">has</span>(<span class="type">const</span> <span class="type">std</span>::<span class="type">string</span> &<span class="var">name</span>) <span class="type">const</span> {<br/>
<span class="in2"></span><span class="macro">@put(<span class="name">has checks</span>)</span>;<br/>
<span class="in2"></span><span class="keyword">return</span> <span class="num">false</span>;<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">inputs elements</span>)</span><br/>
</code></div>
<ul><li>
checks if the file is already used
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">11</div>
<code>
<span class="macro">@def(<span class="name">has checks</span>)</span><br/>
<span class="in1"></span><span class="keyword">if</span> (<span class="var">used_</span>.<span class="fn">find</span>(<span class="var">name</span>) != <span class="var">used_</span>.<span class="fn">end</span>()) {<br/>
<span class="in2"></span><span class="keyword">return</span> <span class="num">true</span>;<br/>
<span class="in1"></span>}<br/>
<span class="macro">@end(<span class="name">has checks</span>)</span><br/>
</code></div>
<ul><li>
iterate over <code><span class="var">_used</span></code> collection
</li></ul>
</div>
</div>
<h2>Local <code><span class="type">Frags</span></code></h2>
<div class="slides">
<div class="page">
<div class="slide slide-header"><div class="slide-nr">12</div><div class="headers">
<h2>Local <code><span class="type">Frags</span></code></h2>
</div></div>
<ul><li>
each input file has a <code><span class="type">Frag</span></code> collection
</li></ul>
</div>
</div>
<h2>Line Numbers</h2>
<div class="slides">
<div class="page">
<div class="slide slide-header"><div class="slide-nr">13</div><div class="headers">
<h2>Line Numbers</h2>
</div></div>
<ul><li>
for each open input file the current line number is recorded
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">14</div>
<code>
<span class="macro">@Add(<span class="name">private open input els</span>)</span><br/>
<span class="in1"></span><span class="type">int</span> <span class="var">line_</span> = <span class="num">0</span>;<br/>
<span class="macro">@end(<span class="name">private open input els</span>)</span><br/>
</code></div>
<ul><li>
current line number
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">15</div>
<code>
<span class="macro">@Add(<span class="name">open input elements</span>)</span><br/>
<span class="in1"></span><span class="type">int</span> <span class="fn">line</span>() <span class="type">const</span> {<br/>
<span class="in2"></span><span class="keyword">return</span> <span class="var">line_</span>;<br/>
<span class="in1"></span>}<br/>
<span class="macro">@end(<span class="name">open input elements</span>)</span><br/>
</code></div>
<ul><li>
getter for current line number
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">16</div>
<code>
<span class="macro">@Def(<span class="name">line read</span>)</span><br/>
<span class="in1"></span>++<span class="var">line_</span>;<br/>
<span class="macro">@End(<span class="name">line read</span>)</span><br/>
</code></div>
<ul><li>
increase line number for each line
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">17</div>
<code>
<span class="macro">@Def(<span class="name">clear inputs</span>)</span><br/>
<span class="in1"></span><span class="var">used_</span>.<span class="fn">clear</span>();<br/>
<span class="in1"></span><span class="var">open_</span>.<span class="fn">clear</span>();<br/>
<span class="in1"></span><span class="keyword">if</span> (<span class="var">roots_</span>.<span class="fn">empty</span>()) {<br/>
<span class="in2"></span><span class="macro">@put(<span class="name">populate default file</span>)</span>;<br/>
<span class="in1"></span>}<br/>
<span class="in1"></span><span class="var">current_path_</span> = <span class="var">roots_</span>.<span class="fn">begin</span>();<br/>
<span class="macro">@End(<span class="name">clear inputs</span>)</span><br/>
</code></div>
<ul><li>
resets all open and used files
</li><li>
if the <code><span class="var">_path</span></code>s are empty the default input file names will be used
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">18</div>
<code>
<span class="macro">@def(<span class="name">populate default file</span>)</span><br/>
<span class="in1"></span><span class="keyword">if</span> (<span class="type">std</span>::<span class="var">filesystem</span>::<span class="fn">exists</span>(<span class="str">"index.md"</span>)) {<br/>
<span class="in2"></span><span class="var">roots_</span>.<span class="fn">push_back</span>(<span class="str">"index.md"</span>);<br/>
<span class="in1"></span>} <span class="keyword">else</span> <span class="keyword">if</span> (<span class="type">std</span>::<span class="var">filesystem</span>::<span class="fn">exists</span>(<span class="str">"index.x"</span>)) {<br/>
<span class="in2"></span><span class="var">roots_</span>.<span class="fn">push_back</span>(<span class="str">"index.x"</span>);<br/>
<span class="in1"></span>} <span class="keyword">else</span> {<br/>
<span class="in2"></span><span class="type">std</span>::<span class="var">cerr</span> << <span class="str">"no input paths\n"</span>;<br/>
<span class="in2"></span><span class="var">roots_</span>.<span class="fn">push_back</span>(<span class="str">"index.md"</span>);<br/>
<span class="in1"></span>}<br/>
<span class="macro">@end(<span class="name">populate default file</span>)</span><br/>
</code></div>
<ul><li>
sets a default file
</li></ul>
</div>
</body>
</html>