Repository navigation
Expand file tree
/
Copy pathAppConfig_8cpp_source.html
More file actions
511 lines (509 loc) · 67.7 KB
/
Copy pathAppConfig_8cpp_source.html
File metadata and controls
511 lines (509 loc) · 67.7 KB
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
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ACAV: app/core/AppConfig.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="manual.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">ACAV<span id="projectnumber"> 69797fb42a2b</span>
</div>
<div id="projectbrief">Abstract Syntax Tree (AST) visualization tool for C, C++, and Objective-C</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('AppConfig_8cpp_source.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">AppConfig.cpp</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/*$!{</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">* Aurora Clang AST Viewer (ACAV)</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">* </span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">* Copyright (c) 2026 Min Liu</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">* Copyright (c) 2026 Michael David Adams</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment">* </span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">* SPDX-License-Identifier: GPL-2.0-or-later</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment">* </span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">* This program is free software; you can redistribute it and/or modify</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">* it under the terms of the GNU General Public License as published by</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment">* the Free Software Foundation; either version 2 of the License, or</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment">* (at your option) any later version.</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment">* </span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">* This program is distributed in the hope that it will be useful,</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="comment">* but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="comment">* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="comment">* GNU General Public License for more details.</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="comment">* </span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="comment">* You should have received a copy of the GNU General Public License along</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="comment">* with this program; if not, see <https://www.gnu.org/licenses/>.</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="comment">}$!*/</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> </div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include "<a class="code" href="AppConfig_8h.html">core/AppConfig.h</a>"</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include <QCryptographicHash></span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include <QDateTime></span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#include <QDebug></span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include <QDir></span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include <QFile></span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#include <QFileInfo></span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#include <QFontDatabase></span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#include <QJsonDocument></span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include <QJsonObject></span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#include <QStandardPaths></span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="preprocessor">#include <QTextStream></span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="keyword">namespace </span>acav {</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><a class="code hl_class" href="classacav_1_1AppConfig.html">AppConfig</a> *AppConfig::instance_ = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> </div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span>QString AppConfig::getDefaultConfigPath() {</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> QString homeDir =</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> QStandardPaths::writableLocation(QStandardPaths::HomeLocation);</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <span class="keywordflow">return</span> homeDir + <span class="stringliteral">"/.acav"</span>;</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span>}</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> </div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="keywordtype">void</span> AppConfig::createDefaultConfigFile(<span class="keyword">const</span> QString &path) {</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> QFileInfo fileInfo(path);</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> QDir dir = fileInfo.dir();</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordflow">if</span> (!dir.exists()) {</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> dir.mkpath(<span class="stringliteral">"."</span>);</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> }</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> </div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> QFile file(path);</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <span class="keywordflow">if</span> (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> qWarning(<span class="stringliteral">"Failed to create default config file: %s"</span>,</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> qPrintable(path));</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> }</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> QTextStream out(&file);</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> out << <span class="stringliteral">"# ACAV (Clang AST Viewer) Configuration File\n"</span>;</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> out << <span class="stringliteral">"# Location: ~/.acav\n"</span>;</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> out << <span class="stringliteral">"# Edit this file to customize application behavior\n"</span>;</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> out << <span class="stringliteral">"# Use File > Reload Configuration to apply changes\n"</span>;</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> out << <span class="stringliteral">"\n"</span>;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> out << <span class="stringliteral">"[cache]\n"</span>;</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> out << <span class="stringliteral">"# Directory for storing AST files and dependency analysis results\n"</span>;</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> out << <span class="stringliteral">"# Use absolute path or leave empty to use ~/.cache/acav/\n"</span>;</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> out << <span class="stringliteral">"# Default: (empty, uses ~/.cache/acav/)\n"</span>;</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> out << <span class="stringliteral">"root=\n"</span>;</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> out << <span class="stringliteral">"\n"</span>;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> out << <span class="stringliteral">"[ui]\n"</span>;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> out << <span class="stringliteral">"# Font family for UI (empty = system default)\n"</span>;</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> out << <span class="stringliteral">"# Example: fontFamily=Helvetica Neue\n"</span>;</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> out << <span class="stringliteral">"fontFamily=\n"</span>;</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> out << <span class="stringliteral">"\n"</span>;</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> out << <span class="stringliteral">"# Font size for tree views, source code editor, and logs\n"</span>;</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> out << <span class="stringliteral">"# Valid range: 8-32\n"</span>;</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> out << <span class="stringliteral">"# Default: 11\n"</span>;</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> out << <span class="stringliteral">"fontSize=11\n"</span>;</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> out << <span class="stringliteral">"\n"</span>;</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> out << <span class="stringliteral">"[ast]\n"</span>;</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> out << <span class="stringliteral">"# Extract and display comments as properties on Decl nodes\n"</span>;</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> out << <span class="stringliteral">"# When enabled, documentation comments are stored in the 'comment' property\n"</span>;</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> out << <span class="stringliteral">"# Default: true\n"</span>;</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> out << <span class="stringliteral">"commentExtraction=true\n"</span>;</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> out << <span class="stringliteral">"\n"</span>;</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> out << <span class="stringliteral">"[debug]\n"</span>;</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> out << <span class="stringliteral">"# Enable memory profiling checkpoints\n"</span>;</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> out << <span class="stringliteral">"# Shows peak memory usage at key points during processing\n"</span>;</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> out << <span class="stringliteral">"# Default: false\n"</span>;</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> out << <span class="stringliteral">"enableMemoryProfiling=false\n"</span>;</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> out << <span class="stringliteral">"\n"</span>;</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> out << <span class="stringliteral">"[performance]\n"</span>;</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> out << <span class="stringliteral">"# Number of CPU cores for parallel dependency analysis\n"</span>;</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> out << <span class="stringliteral">"# 0 = auto-detect (use all available cores)\n"</span>;</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> out << <span class="stringliteral">"# Default: 0\n"</span>;</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> out << <span class="stringliteral">"parallelProcessorCount=0\n"</span>;</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> </div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> file.close();</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span>}</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> </div>
<div class="foldopen" id="foldopen00103" data-start="{" data-end="}">
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#ac7ec2bc4a36877e373d07ecd486f7cd4"> 103</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classacav_1_1AppConfig.html#ac7ec2bc4a36877e373d07ecd486f7cd4">AppConfig::initialize</a>(<span class="keyword">const</span> QString &configFilePath) {</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="keywordflow">if</span> (instance_) {</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">return</span>; <span class="comment">// Already initialized</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> }</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> </div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> QString configPath = configFilePath.isEmpty() </div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> ? getDefaultConfigPath() </div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> : configFilePath;</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> </div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="comment">// Create default config file if it doesn't exist</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keywordflow">if</span> (!QFile::exists(configPath)) {</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> createDefaultConfigFile(configPath);</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> }</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> instance_ = <span class="keyword">new</span> AppConfig(configPath);</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span>}</div>
</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> </div>
<div class="foldopen" id="foldopen00120" data-start="{" data-end="}">
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#aace8d9ba003ef782bb7ecf878269c78b"> 120</a></span>AppConfig &<a class="code hl_function" href="classacav_1_1AppConfig.html#aace8d9ba003ef782bb7ecf878269c78b">AppConfig::instance</a>() {</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keywordflow">if</span> (!instance_) {</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> qFatal(<span class="stringliteral">"AppConfig::initialize() must be called before instance()"</span>);</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> }</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keywordflow">return</span> *instance_;</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span>}</div>
</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> </div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span>AppConfig::AppConfig(<span class="keyword">const</span> QString &configFilePath)</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> : configFilePath_(configFilePath),</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> settings_(configFilePath, QSettings::IniFormat) {</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> loadSettings();</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span>}</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> </div>
<div class="foldopen" id="foldopen00133" data-start="{" data-end="}">
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#addc20a4345f0ab88fdbabba8bdd4cd91"> 133</a></span>QString <a class="code hl_function" href="classacav_1_1AppConfig.html#addc20a4345f0ab88fdbabba8bdd4cd91">AppConfig::getConfigFilePath</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="keywordflow">return</span> configFilePath_;</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span>}</div>
</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> </div>
<div class="foldopen" id="foldopen00137" data-start="{" data-end="}">
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#a00cbc2bafb8add5f722d267b9ded57d0"> 137</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classacav_1_1AppConfig.html#a00cbc2bafb8add5f722d267b9ded57d0">AppConfig::reload</a>() {</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keywordflow">if</span> (!QFile::exists(configFilePath_)) {</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> createDefaultConfigFile(configFilePath_);</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> }</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> </div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> settings_.sync();</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> loadSettings();</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordflow">return</span> QFile::exists(configFilePath_);</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span>}</div>
</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> </div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span><span class="keywordtype">void</span> AppConfig::loadSettings() {</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="comment">// Check for config file errors</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keywordflow">if</span> (settings_.status() != QSettings::NoError) {</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> qWarning(<span class="stringliteral">"Error reading config file '%s' (status=%d), using defaults"</span>,</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> qPrintable(configFilePath_), <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(settings_.status()));</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="comment">// Continue with defaults - don't return, as default values are set below</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> }</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> </div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="comment">// Load cache root from settings, or use default</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> cacheRoot_ = settings_.value(<span class="stringliteral">"cache/root"</span>, QString()).toString();</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> commentExtractionEnabled_ =</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> settings_.value(<span class="stringliteral">"ast/commentExtraction"</span>, <span class="keyword">true</span>).toBool();</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> memoryProfilingEnabled_ =</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> settings_.value(<span class="stringliteral">"debug/enableMemoryProfiling"</span>, <span class="keyword">false</span>).toBool();</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> </div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="comment">// Load and validate font family - check if it exists on the system</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> QString requestedFontFamily = settings_.value(<span class="stringliteral">"ui/fontFamily"</span>, QString()).toString();</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="keywordflow">if</span> (!requestedFontFamily.isEmpty()) {</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> QStringList availableFamilies = QFontDatabase::families();</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="keywordflow">if</span> (availableFamilies.contains(requestedFontFamily, Qt::CaseInsensitive)) {</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> fontFamily_ = requestedFontFamily;</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> qWarning(<span class="stringliteral">"Font family '%s' not found on system, using system default. "</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <span class="stringliteral">"Available fonts can be listed with 'fc-list' command."</span>,</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> qPrintable(requestedFontFamily));</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> fontFamily_.clear();</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> }</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> fontFamily_.clear();</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> }</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> </div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="comment">// Load and validate font size (valid range: 8-32)</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="keyword">constexpr</span> <span class="keywordtype">int</span> kDefaultFontSize = 11;</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <span class="keyword">constexpr</span> <span class="keywordtype">int</span> kMinFontSize = 8;</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="keyword">constexpr</span> <span class="keywordtype">int</span> kMaxFontSize = 32;</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> fontSize_ = settings_.value(<span class="stringliteral">"ui/fontSize"</span>, kDefaultFontSize).toInt();</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <span class="keywordflow">if</span> (fontSize_ < kMinFontSize || fontSize_ > kMaxFontSize) {</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> qWarning(<span class="stringliteral">"Invalid fontSize=%d in config, using default %d (valid range: %d-%d)"</span>,</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> fontSize_, kDefaultFontSize, kMinFontSize, kMaxFontSize);</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> fontSize_ = kDefaultFontSize;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> }</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> </div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="comment">// Load and validate parallel processor count (must be >= 0)</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> parallelProcessorCount_ = settings_.value(<span class="stringliteral">"performance/parallelProcessorCount"</span>, 0).toInt();</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keywordflow">if</span> (parallelProcessorCount_ < 0) {</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> qWarning(<span class="stringliteral">"Invalid parallelProcessorCount=%d in config, using 0 (auto-detect)"</span>,</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> parallelProcessorCount_);</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> parallelProcessorCount_ = 0;</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> }</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> </div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="comment">// Validate cache root - if specified, check if it's usable</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> QString defaultCacheRoot = QStandardPaths::writableLocation(QStandardPaths::HomeLocation)</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> + <span class="stringliteral">"/.cache/acav"</span>;</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <span class="keywordflow">if</span> (cacheRoot_.isEmpty()) {</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> cacheRoot_ = defaultCacheRoot;</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="comment">// User specified a custom cache root - verify it's usable</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> QDir dir(cacheRoot_);</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="keywordflow">if</span> (!dir.exists()) {</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="comment">// Try to create it</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="keywordflow">if</span> (!dir.mkpath(<span class="stringliteral">"."</span>)) {</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> qWarning(<span class="stringliteral">"Cannot create cache directory '%s', using default '%s'"</span>,</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> qPrintable(cacheRoot_), qPrintable(defaultCacheRoot));</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> cacheRoot_ = defaultCacheRoot;</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> }</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <span class="comment">// Directory exists, check if writable by trying to create a test file</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> QFile testFile(cacheRoot_ + <span class="stringliteral">"/.acav_write_test"</span>);</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="keywordflow">if</span> (testFile.open(QIODevice::WriteOnly)) {</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> testFile.close();</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> testFile.remove();</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> qWarning(<span class="stringliteral">"Cache directory '%s' is not writable, using default '%s'"</span>,</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> qPrintable(cacheRoot_), qPrintable(defaultCacheRoot));</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> cacheRoot_ = defaultCacheRoot;</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> }</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> }</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> }</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span>}</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> </div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#ae768fce6ba1ed0e55bdc564bca0eca5e"> 227</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classacav_1_1AppConfig.html#ae768fce6ba1ed0e55bdc564bca0eca5e">AppConfig::getFontSize</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> fontSize_; }</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> </div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#ad1c04b0fde8890a19d3cc9064f7ca623"> 229</a></span>QString <a class="code hl_function" href="classacav_1_1AppConfig.html#ad1c04b0fde8890a19d3cc9064f7ca623">AppConfig::getFontFamily</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> fontFamily_; }</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> </div>
<div class="foldopen" id="foldopen00231" data-start="{" data-end="}">
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#ad5689a5529043fbce03ff9ab2608c25e"> 231</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classacav_1_1AppConfig.html#ad5689a5529043fbce03ff9ab2608c25e">AppConfig::getParallelProcessorCount</a>()<span class="keyword"> const </span>{ </div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> <span class="keywordflow">return</span> parallelProcessorCount_; </div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span>}</div>
</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> </div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span>QString AppConfig::hashPath(<span class="keyword">const</span> QString &path)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="comment">// Create a hash of the absolute path to use as directory name</span></div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> QFileInfo fileInfo(path);</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> QString absolutePath = fileInfo.absoluteFilePath();</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> </div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> QCryptographicHash hash(QCryptographicHash::Sha256);</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> hash.addData(absolutePath.toUtf8());</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> QString hashStr = QString::fromLatin1(hash.result().toHex());</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> </div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="comment">// Use first 16 characters of hash for reasonable directory name</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> <span class="keywordflow">return</span> hashStr.left(16);</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span>}</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> </div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span>QString</div>
<div class="foldopen" id="foldopen00249" data-start="{" data-end="}">
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#a2c8dd469537ac2d67369032c4af30bb9"> 249</a></span><a class="code hl_function" href="classacav_1_1AppConfig.html#a2c8dd469537ac2d67369032c4af30bb9">AppConfig::getCacheDirectory</a>(<span class="keyword">const</span> QString &compilationDatabasePath)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> <span class="comment">// Create a subdirectory based on the compilation database path</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <span class="comment">// Structure: <cache_root>/<hash>/</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> QString pathHash = hashPath(compilationDatabasePath);</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> QString cacheDir = cacheRoot_ + <span class="stringliteral">"/"</span> + pathHash;</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> </div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="comment">// Ensure directory exists and write metadata</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> ensureCacheDirectory(compilationDatabasePath);</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> </div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordflow">return</span> cacheDir;</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span>}</div>
</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> </div>
<div class="foldopen" id="foldopen00261" data-start="{" data-end="}">
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#a23eb374b07ef998d7d0eed41ed039022"> 261</a></span>QString <a class="code hl_function" href="classacav_1_1AppConfig.html#a23eb374b07ef998d7d0eed41ed039022">AppConfig::getDependenciesFilePath</a>(</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> <span class="keyword">const</span> QString &compilationDatabasePath)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> QString cacheDir = <a class="code hl_function" href="classacav_1_1AppConfig.html#a2c8dd469537ac2d67369032c4af30bb9">getCacheDirectory</a>(compilationDatabasePath);</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> <span class="keywordflow">return</span> cacheDir + <span class="stringliteral">"/dependencies.json"</span>;</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span>}</div>
</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> </div>
<div class="foldopen" id="foldopen00267" data-start="{" data-end="}">
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#a3ea0d14f075eae2b0b1527f890024647"> 267</a></span>QString <a class="code hl_function" href="classacav_1_1AppConfig.html#a3ea0d14f075eae2b0b1527f890024647">AppConfig::getMetadataFilePath</a>(</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> <span class="keyword">const</span> QString &compilationDatabasePath)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> QString cacheDir = <a class="code hl_function" href="classacav_1_1AppConfig.html#a2c8dd469537ac2d67369032c4af30bb9">getCacheDirectory</a>(compilationDatabasePath);</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <span class="keywordflow">return</span> cacheDir + <span class="stringliteral">"/metadata.json"</span>;</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span>}</div>
</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> </div>
<div class="foldopen" id="foldopen00273" data-start="{" data-end="}">
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#a86a2c8e8aab6a460dc254b21576ef8f4"> 273</a></span>QString <a class="code hl_function" href="classacav_1_1AppConfig.html#a86a2c8e8aab6a460dc254b21576ef8f4">AppConfig::getBuildDirectory</a>(</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> <span class="keyword">const</span> QString &compilationDatabasePath)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> QString metadataPath = <a class="code hl_function" href="classacav_1_1AppConfig.html#a3ea0d14f075eae2b0b1527f890024647">getMetadataFilePath</a>(compilationDatabasePath);</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> QFile metadataFile(metadataPath);</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> </div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="keywordflow">if</span> (!metadataFile.exists() || </div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> !metadataFile.open(QIODevice::ReadOnly | QIODevice::Text)) {</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> <span class="comment">// Fallback: derive from compilation database path</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> QFileInfo info(compilationDatabasePath);</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> <span class="keywordflow">return</span> info.absolutePath();</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> }</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> </div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> QByteArray data = metadataFile.readAll();</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> metadataFile.close();</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> </div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> QJsonDocument doc = QJsonDocument::fromJson(data);</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> <span class="keywordflow">if</span> (doc.isNull() || !doc.isObject()) {</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> QFileInfo info(compilationDatabasePath);</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> <span class="keywordflow">return</span> info.absolutePath();</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> }</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> </div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> QJsonObject metadata = doc.object();</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> <span class="keywordflow">return</span> metadata[<span class="stringliteral">"buildDirectory"</span>].toString();</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span>}</div>
</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> </div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span><span class="keywordtype">void</span> AppConfig::ensureCacheDirectory(</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> <span class="keyword">const</span> QString &compilationDatabasePath)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> QString cacheDir = cacheRoot_ + <span class="stringliteral">"/"</span> + hashPath(compilationDatabasePath);</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> QDir dir;</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> </div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> <span class="keywordflow">if</span> (!dir.exists(cacheDir)) {</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <span class="keywordflow">if</span> (!dir.mkpath(cacheDir)) {</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> }</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> }</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> </div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> <span class="comment">// Also create a metadata file to remember which compilation database this is</span></div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> QString metadataPath = cacheDir + <span class="stringliteral">"/metadata.json"</span>;</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> QFile metadataFile(metadataPath);</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> <span class="keywordflow">if</span> (!metadataFile.exists()) {</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keywordflow">if</span> (metadataFile.open(QIODevice::WriteOnly | QIODevice::Text)) {</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> QFileInfo info(compilationDatabasePath);</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> QJsonObject metadata;</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> metadata[<span class="stringliteral">"compilationDatabasePath"</span>] = info.absoluteFilePath();</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> metadata[<span class="stringliteral">"buildDirectory"</span>] = info.absolutePath();</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> metadata[<span class="stringliteral">"createdAt"</span>] = QDateTime::currentDateTime().toString(Qt::ISODate);</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> </div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> QJsonDocument doc(metadata);</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> metadataFile.write(doc.toJson(QJsonDocument::Indented));</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> metadataFile.close();</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> }</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> }</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span>}</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> </div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span>QString</div>
<div class="foldopen" id="foldopen00328" data-start="{" data-end="}">
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#a0bbe7b5e7dd87cf0b34400f9ae2c79f4"> 328</a></span><a class="code hl_function" href="classacav_1_1AppConfig.html#a0bbe7b5e7dd87cf0b34400f9ae2c79f4">AppConfig::getAstCacheDirectory</a>(<span class="keyword">const</span> QString &compilationDatabasePath)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> QString cacheDir = <a class="code hl_function" href="classacav_1_1AppConfig.html#a2c8dd469537ac2d67369032c4af30bb9">getCacheDirectory</a>(compilationDatabasePath);</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> QString astDir = cacheDir + <span class="stringliteral">"/ast"</span>;</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> </div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <span class="comment">// Create directory if doesn't exist</span></div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> QDir dir;</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> <span class="keywordflow">if</span> (!dir.exists(astDir)) {</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> dir.mkpath(astDir);</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> }</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> </div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> <span class="keywordflow">return</span> astDir;</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span>}</div>
</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> </div>
<div class="foldopen" id="foldopen00341" data-start="{" data-end="}">
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#a5359a71d6c0b29360cc0cf125675d080"> 341</a></span>QString <a class="code hl_function" href="classacav_1_1AppConfig.html#a5359a71d6c0b29360cc0cf125675d080">AppConfig::getAstFilePath</a>(<span class="keyword">const</span> QString &compilationDatabasePath,</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> <span class="keyword">const</span> QString &sourceFilePath)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> QString astDir = <a class="code hl_function" href="classacav_1_1AppConfig.html#a0bbe7b5e7dd87cf0b34400f9ae2c79f4">getAstCacheDirectory</a>(compilationDatabasePath);</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> QFileInfo sourceInfo(sourceFilePath);</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> QString fileName = sourceInfo.fileName(); <span class="comment">// e.g., "main.cpp"</span></div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> </div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> <span class="keywordflow">return</span> astDir + <span class="stringliteral">"/"</span> + fileName + <span class="stringliteral">".ast"</span>;</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span>}</div>
</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> </div>
<div class="foldopen" id="foldopen00350" data-start="{" data-end="}">
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#acddbb9862a933316a58ca5a4bb4793ae"> 350</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classacav_1_1AppConfig.html#acddbb9862a933316a58ca5a4bb4793ae">AppConfig::getCommentExtractionEnabled</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> <span class="keywordflow">return</span> commentExtractionEnabled_;</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span>}</div>
</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> </div>
<div class="foldopen" id="foldopen00354" data-start="{" data-end="}">
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#acede6947dec794c70c7505b303054a5b"> 354</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classacav_1_1AppConfig.html#acede6947dec794c70c7505b303054a5b">AppConfig::getMemoryProfilingEnabled</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="keywordflow">return</span> memoryProfilingEnabled_;</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span>}</div>
</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> </div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"><a class="line" href="classacav_1_1AppConfig.html#a5a11d42f3a2bd8c3b1c3e0cadfcdc0d8"> 358</a></span>QString <a class="code hl_function" href="classacav_1_1AppConfig.html#a5a11d42f3a2bd8c3b1c3e0cadfcdc0d8">AppConfig::getCacheRoot</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cacheRoot_; }</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> </div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span>} <span class="comment">// namespace acav</span></div>
<div class="ttc" id="aAppConfig_8h_html"><div class="ttname"><a href="AppConfig_8h.html">AppConfig.h</a></div><div class="ttdoc">Application configuration and settings.</div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html"><div class="ttname"><a href="classacav_1_1AppConfig.html">acav::AppConfig</a></div><div class="ttdoc">Application configuration manager.</div><div class="ttdef"><b>Definition</b> <a href="AppConfig_8h_source.html#l00042">AppConfig.h:42</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_a00cbc2bafb8add5f722d267b9ded57d0"><div class="ttname"><a href="classacav_1_1AppConfig.html#a00cbc2bafb8add5f722d267b9ded57d0">acav::AppConfig::reload</a></div><div class="ttdeci">bool reload()</div><div class="ttdoc">Reload settings from the config file on disk.</div><div class="ttdef"><b>Definition</b> <a href="#l00137">AppConfig.cpp:137</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_a0bbe7b5e7dd87cf0b34400f9ae2c79f4"><div class="ttname"><a href="classacav_1_1AppConfig.html#a0bbe7b5e7dd87cf0b34400f9ae2c79f4">acav::AppConfig::getAstCacheDirectory</a></div><div class="ttdeci">QString getAstCacheDirectory(const QString &compilationDatabasePath) const</div><div class="ttdoc">Get the AST cache directory for a compilation database.</div><div class="ttdef"><b>Definition</b> <a href="#l00328">AppConfig.cpp:328</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_a23eb374b07ef998d7d0eed41ed039022"><div class="ttname"><a href="classacav_1_1AppConfig.html#a23eb374b07ef998d7d0eed41ed039022">acav::AppConfig::getDependenciesFilePath</a></div><div class="ttdeci">QString getDependenciesFilePath(const QString &compilationDatabasePath) const</div><div class="ttdoc">Get the dependencies JSON file path for a compilation database.</div><div class="ttdef"><b>Definition</b> <a href="#l00261">AppConfig.cpp:261</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_a2c8dd469537ac2d67369032c4af30bb9"><div class="ttname"><a href="classacav_1_1AppConfig.html#a2c8dd469537ac2d67369032c4af30bb9">acav::AppConfig::getCacheDirectory</a></div><div class="ttdeci">QString getCacheDirectory(const QString &compilationDatabasePath) const</div><div class="ttdoc">Get the cache directory for a compilation database.</div><div class="ttdef"><b>Definition</b> <a href="#l00249">AppConfig.cpp:249</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_a3ea0d14f075eae2b0b1527f890024647"><div class="ttname"><a href="classacav_1_1AppConfig.html#a3ea0d14f075eae2b0b1527f890024647">acav::AppConfig::getMetadataFilePath</a></div><div class="ttdeci">QString getMetadataFilePath(const QString &compilationDatabasePath) const</div><div class="ttdoc">Get the metadata JSON file path for a compilation database.</div><div class="ttdef"><b>Definition</b> <a href="#l00267">AppConfig.cpp:267</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_a5359a71d6c0b29360cc0cf125675d080"><div class="ttname"><a href="classacav_1_1AppConfig.html#a5359a71d6c0b29360cc0cf125675d080">acav::AppConfig::getAstFilePath</a></div><div class="ttdeci">QString getAstFilePath(const QString &compilationDatabasePath, const QString &sourceFilePath) const</div><div class="ttdoc">Get the AST cache file path for a source file.</div><div class="ttdef"><b>Definition</b> <a href="#l00341">AppConfig.cpp:341</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_a5a11d42f3a2bd8c3b1c3e0cadfcdc0d8"><div class="ttname"><a href="classacav_1_1AppConfig.html#a5a11d42f3a2bd8c3b1c3e0cadfcdc0d8">acav::AppConfig::getCacheRoot</a></div><div class="ttdeci">QString getCacheRoot() const</div><div class="ttdoc">Custom cache root directory (default: ~/.cache/acav/).</div><div class="ttdef"><b>Definition</b> <a href="#l00358">AppConfig.cpp:358</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_a86a2c8e8aab6a460dc254b21576ef8f4"><div class="ttname"><a href="classacav_1_1AppConfig.html#a86a2c8e8aab6a460dc254b21576ef8f4">acav::AppConfig::getBuildDirectory</a></div><div class="ttdeci">QString getBuildDirectory(const QString &compilationDatabasePath) const</div><div class="ttdoc">Get the build directory from cached metadata.</div><div class="ttdef"><b>Definition</b> <a href="#l00273">AppConfig.cpp:273</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_aace8d9ba003ef782bb7ecf878269c78b"><div class="ttname"><a href="classacav_1_1AppConfig.html#aace8d9ba003ef782bb7ecf878269c78b">acav::AppConfig::instance</a></div><div class="ttdeci">static AppConfig & instance()</div><div class="ttdoc">Get the singleton instance.</div><div class="ttdef"><b>Definition</b> <a href="#l00120">AppConfig.cpp:120</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_ac7ec2bc4a36877e373d07ecd486f7cd4"><div class="ttname"><a href="classacav_1_1AppConfig.html#ac7ec2bc4a36877e373d07ecd486f7cd4">acav::AppConfig::initialize</a></div><div class="ttdeci">static void initialize(const QString &configFilePath=QString())</div><div class="ttdoc">Initialize the singleton with a custom config file path.</div><div class="ttdef"><b>Definition</b> <a href="#l00103">AppConfig.cpp:103</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_acddbb9862a933316a58ca5a4bb4793ae"><div class="ttname"><a href="classacav_1_1AppConfig.html#acddbb9862a933316a58ca5a4bb4793ae">acav::AppConfig::getCommentExtractionEnabled</a></div><div class="ttdeci">bool getCommentExtractionEnabled() const</div><div class="ttdoc">Whether to extract and display comments in AST (default: false).</div><div class="ttdef"><b>Definition</b> <a href="#l00350">AppConfig.cpp:350</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_acede6947dec794c70c7505b303054a5b"><div class="ttname"><a href="classacav_1_1AppConfig.html#acede6947dec794c70c7505b303054a5b">acav::AppConfig::getMemoryProfilingEnabled</a></div><div class="ttdeci">bool getMemoryProfilingEnabled() const</div><div class="ttdoc">Whether memory profiling checkpoints are enabled (default: false).</div><div class="ttdef"><b>Definition</b> <a href="#l00354">AppConfig.cpp:354</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_ad1c04b0fde8890a19d3cc9064f7ca623"><div class="ttname"><a href="classacav_1_1AppConfig.html#ad1c04b0fde8890a19d3cc9064f7ca623">acav::AppConfig::getFontFamily</a></div><div class="ttdeci">QString getFontFamily() const</div><div class="ttdoc">Editor/UI font family (default: empty = system default).</div><div class="ttdef"><b>Definition</b> <a href="#l00229">AppConfig.cpp:229</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_ad5689a5529043fbce03ff9ab2608c25e"><div class="ttname"><a href="classacav_1_1AppConfig.html#ad5689a5529043fbce03ff9ab2608c25e">acav::AppConfig::getParallelProcessorCount</a></div><div class="ttdeci">int getParallelProcessorCount() const</div><div class="ttdoc">Number of parallel processors for query-dependencies (default: 0 = auto) 0 means use all available CP...</div><div class="ttdef"><b>Definition</b> <a href="#l00231">AppConfig.cpp:231</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_addc20a4345f0ab88fdbabba8bdd4cd91"><div class="ttname"><a href="classacav_1_1AppConfig.html#addc20a4345f0ab88fdbabba8bdd4cd91">acav::AppConfig::getConfigFilePath</a></div><div class="ttdeci">QString getConfigFilePath() const</div><div class="ttdoc">Get the path to the currently loaded configuration file.</div><div class="ttdef"><b>Definition</b> <a href="#l00133">AppConfig.cpp:133</a></div></div>
<div class="ttc" id="aclassacav_1_1AppConfig_html_ae768fce6ba1ed0e55bdc564bca0eca5e"><div class="ttname"><a href="classacav_1_1AppConfig.html#ae768fce6ba1ed0e55bdc564bca0eca5e">acav::AppConfig::getFontSize</a></div><div class="ttdeci">int getFontSize() const</div><div class="ttdoc">Editor/UI font size, including log views (default: 11).</div><div class="ttdef"><b>Definition</b> <a href="#l00227">AppConfig.cpp:227</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><b>app</b></li><li class="navelem"><b>core</b></li><li class="navelem"><b>AppConfig.cpp</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>
</body>
</html>