aGrUM
0.20.3
a C++ library for (probabilistic) graphical models
O3prmReader_tpl.h
Go to the documentation of this file.
1
/**
2
*
3
* Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
4
* info_at_agrum_dot_org
5
*
6
* This library is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU Lesser General Public License as published by
8
* the Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
10
*
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public License
17
* along with this library. If not, see <http://www.gnu.org/licenses/>.
18
*
19
*/
20
21
22
/**
23
* @file
24
* @brief Implementation for the O3prmReader class.
25
*
26
* @author Christophe GONZALES(@AMU) and Pierre-Henri WUILLEMIN(@LIP6)
27
* @author Lionel TORTI
28
*/
29
#
include
<
agrum
/
PRM
/
o3prm
/
O3prmReader
.
h
>
30
31
namespace
gum
{
32
namespace
prm
{
33
namespace
o3prm
{
34
35
template
<
typename
GUM_SCALAR
>
36
INLINE
std
::
string
O3prmReader
<
GUM_SCALAR
>::
_clean_
(
std
::
string
text
)
const
{
37
// This could be way more faster with regex but there are not implemented
38
// with gcc-4.8 !
39
text
=
replace
(
text
,
"Syntax error"
,
"Error"
);
40
41
text
=
replace
(
text
,
"LABEL_OR_STAR_LIST"
,
"declaration"
);
42
43
text
=
replace
(
text
,
"ARRAY_REFERENCE_SLOT"
,
"declaration"
);
44
text
=
replace
(
text
,
"FLOAT_AS_LABEL"
,
"declaration"
);
45
text
=
replace
(
text
,
"FLOAT_OR_INT"
,
"declaration"
);
46
text
=
replace
(
text
,
"INTEGER_AS_FLOAT"
,
"declaration"
);
47
text
=
replace
(
text
,
"INTEGER_AS_LABEL"
,
"declaration"
);
48
text
=
replace
(
text
,
"INT_TYPE_DECLARATION"
,
"declaration"
);
49
text
=
replace
(
text
,
"LABEL_OR_INT"
,
"declaration"
);
50
text
=
replace
(
text
,
"LABEL_OR_STAR"
,
"declaration"
);
51
text
=
replace
(
text
,
"NAMED_CLASS_ELEMENT"
,
"declaration"
);
52
text
=
replace
(
text
,
"REAL_TYPE_DECLARATION"
,
"declaration"
);
53
54
text
=
replace
(
text
,
"AGGREGATE_PARENTS"
,
"declaration"
);
55
text
=
replace
(
text
,
"CLASS_BODY"
,
"declaration"
);
56
text
=
replace
(
text
,
"CLASS_DECLARATION"
,
"declaration"
);
57
text
=
replace
(
text
,
"CLASS_ELEMENT"
,
"declaration"
);
58
text
=
replace
(
text
,
"CLASS_PARAMETER"
,
"declaration"
);
59
text
=
replace
(
text
,
"CLASS_UNIT"
,
"declaration"
);
60
text
=
replace
(
text
,
"FLOAT_LIST"
,
"declaration"
);
61
text
=
replace
(
text
,
"FORMULA_LIST"
,
"declaration"
);
62
text
=
replace
(
text
,
"IDENTIFIER_LIST"
,
"declaration"
);
63
text
=
replace
(
text
,
"IMPORT_BODY"
,
"declaration"
);
64
text
=
replace
(
text
,
"IMPORT_DECLARATION"
,
"declaration"
);
65
text
=
replace
(
text
,
"IMPORT_UNIT"
,
"declaration"
);
66
text
=
replace
(
text
,
"INTERFACE_BODY"
,
"declaration"
);
67
text
=
replace
(
text
,
"INTERFACE_DECLARATION"
,
"declaration"
);
68
text
=
replace
(
text
,
"INTERFACE_UNIT"
,
"declaration"
);
69
text
=
replace
(
text
,
"LABEL_LIST"
,
"declaration"
);
70
text
=
replace
(
text
,
"PARAMETER_LIST"
,
"declaration"
);
71
text
=
replace
(
text
,
"PREFIXED_LABEL"
,
"declaration"
);
72
text
=
replace
(
text
,
"RAW_CPT"
,
"declaration"
);
73
text
=
replace
(
text
,
"REFERENCE_SLOT"
,
"declaration"
);
74
text
=
replace
(
text
,
"RULE_CPT"
,
"declaration"
);
75
text
=
replace
(
text
,
"SYSTEM_BODY"
,
"declaration"
);
76
text
=
replace
(
text
,
"SYSTEM_DECLARATION"
,
"declaration"
);
77
text
=
replace
(
text
,
"SYSTEM_UNIT"
,
"declaration"
);
78
text
=
replace
(
text
,
"TYPE_DECLARATION"
,
"declaration"
);
79
text
=
replace
(
text
,
"TYPE_LABEL"
,
"declaration"
);
80
text
=
replace
(
text
,
"TYPE_UNIT"
,
"declaration"
);
81
text
=
replace
(
text
,
"TYPE_VALUE_LIST"
,
"declaration"
);
82
83
text
=
replace
(
text
,
"AGGREGATE"
,
"declaration"
);
84
text
=
replace
(
text
,
"ARRAY"
,
"declaration"
);
85
text
=
replace
(
text
,
"ATTRIBUTE"
,
"declaration"
);
86
text
=
replace
(
text
,
"CAST"
,
"declaration"
);
87
text
=
replace
(
text
,
"CHAIN"
,
"declaration"
);
88
text
=
replace
(
text
,
"CLASS"
,
"declaration"
);
89
text
=
replace
(
text
,
"FLOAT"
,
"declaration"
);
90
text
=
replace
(
text
,
"FORMULA"
,
"declaration"
);
91
text
=
replace
(
text
,
"IDENTIFIER"
,
"declaration"
);
92
text
=
replace
(
text
,
"INT"
,
"declaration"
);
93
text
=
replace
(
text
,
"INTEGER"
,
"declaration"
);
94
text
=
replace
(
text
,
"INTERFACE"
,
"declaration"
);
95
text
=
replace
(
text
,
"LABEL"
,
"declaration"
);
96
text
=
replace
(
text
,
"LINK"
,
"declaration"
);
97
text
=
replace
(
text
,
"MAP"
,
"declaration"
);
98
text
=
replace
(
text
,
"PARAMETER"
,
"declaration"
);
99
text
=
replace
(
text
,
"REAL"
,
"declaration"
);
100
text
=
replace
(
text
,
"RULE"
,
"declaration"
);
101
text
=
replace
(
text
,
"TYPE"
,
"declaration"
);
102
text
=
replace
(
text
,
"UNIT"
,
"declaration"
);
103
104
return
text
;
105
}
106
107
template
<
typename
GUM_SCALAR
>
108
INLINE
std
::
string
O3prmReader
<
GUM_SCALAR
>::
_print_
(
const
ParseError
&
err
)
const
{
109
std
::
stringstream
s
;
110
s
<<
err
.
filename
<<
"|"
<<
err
.
line
<<
" col "
<<
err
.
column
<<
"| "
<<
_clean_
(
err
.
msg
);
111
return
s
.
str
();
112
}
113
114
template
<
typename
GUM_SCALAR
>
115
INLINE
std
::
string
O3prmReader
<
GUM_SCALAR
>::
_readStream_
(
std
::
istream
&
inputstr
) {
116
if
(
inputstr
) {
117
inputstr
.
seekg
(0,
inputstr
.
end
);
118
int
length
=
int
(
inputstr
.
tellg
());
119
inputstr
.
seekg
(0,
inputstr
.
beg
);
120
121
auto
str
=
std
::
string
();
122
str
.
resize
(
length
,
' '
);
123
auto
begin
= &*
str
.
begin
();
124
125
inputstr
.
read
(
begin
,
length
);
126
127
return
str
;
128
}
129
GUM_ERROR
(
OperationNotAllowed
,
"Could not open file"
)
130
}
131
132
using
o3prm_scanner
=
gum
::
prm
::
o3prm
::
Scanner
;
133
using
o3prm_parser
=
gum
::
prm
::
o3prm
::
Parser
;
134
135
template
<
typename
GUM_SCALAR >
136
INLINE O3prmReader<
GUM_SCALAR
>::
O3prmReader
() :
137
_prm_
(
new
PRM
<
GUM_SCALAR
>()),
_o3_prm_
(
std
::
unique_ptr
<
O3PRM
>(
new
O3PRM
())) {
138
GUM_CONSTRUCTOR
(
O3prmReader
);
139
}
140
141
template
<
typename
GUM_SCALAR
>
142
INLINE
O3prmReader
<
GUM_SCALAR
>::
O3prmReader
(
PRM
<
GUM_SCALAR
>&
prm
) :
143
_prm_
(&
prm
),
_o3_prm_
(
std
::
unique_ptr
<
O3PRM
>(
new
O3PRM
())) {
144
GUM_CONSTRUCTOR
(
O3prmReader
);
145
}
146
147
template
<
typename
GUM_SCALAR
>
148
INLINE
O3prmReader
<
GUM_SCALAR
>::
O3prmReader
(
const
O3prmReader
&
src
) :
149
_prm_
(
src
.
_prm_
),
_o3_prm_
(
std
::
unique_ptr
<
O3PRM
>(
new
O3PRM
(*(
src
.
_o3_prm_
)))),
150
_class_path_
(
src
.
_class_path_
),
_imported_
(
src
.
_imported_
),
_errors_
(
src
.
_errors_
) {
151
GUM_CONS_CPY
(
O3prmReader
);
152
}
153
154
template
<
typename
GUM_SCALAR
>
155
INLINE
O3prmReader
<
GUM_SCALAR
>::
O3prmReader
(
O3prmReader
&&
src
) :
156
_prm_
(
std
::
move
(
src
.
_prm_
)),
_o3_prm_
(
std
::
move
(
src
.
_o3_prm_
)),
157
_class_path_
(
std
::
move
(
src
.
_class_path_
)),
_imported_
(
std
::
move
(
src
.
_imported_
)),
158
_errors_
(
std
::
move
(
src
.
_errors_
)) {
159
GUM_CONS_CPY
(
O3prmReader
);
160
}
161
162
template
<
typename
GUM_SCALAR
>
163
INLINE
O3prmReader
<
GUM_SCALAR
>::~
O3prmReader
() {
164
GUM_DESTRUCTOR
(
O3prmReader
);
165
}
166
167
template
<
typename
GUM_SCALAR
>
168
INLINE
O3prmReader
<
GUM_SCALAR
>&
169
O3prmReader
<
GUM_SCALAR
>::
operator
=(
const
O3prmReader
&
src
) {
170
if
(
this
== &
src
) {
return
*
this
; }
171
_prm_
=
src
.
_prm_
;
172
_o3_prm_
=
std
::
unique_ptr
<
O3PRM
>(
new
O3PRM
(*(
src
.
_o3_prm_
)));
173
_class_path_
=
src
.
_class_path_
;
174
_imported_
=
src
.
_imported_
;
175
_errors_
=
src
.
_errors_
;
176
return
*
this
;
177
}
178
179
template
<
typename
GUM_SCALAR
>
180
INLINE
O3prmReader
<
GUM_SCALAR
>&
O3prmReader
<
GUM_SCALAR
>::
operator
=(
O3prmReader
&&
src
) {
181
if
(
this
== &
src
) {
return
*
this
; }
182
_prm_
=
std
::
move
(
src
.
_prm_
);
183
_o3_prm_
=
std
::
move
(
src
.
_o3_prm_
);
184
_class_path_
=
std
::
move
(
src
.
_class_path_
);
185
_imported_
=
std
::
move
(
src
.
_imported_
);
186
_errors_
=
std
::
move
(
src
.
_errors_
);
187
return
*
this
;
188
}
189
190
template
<
typename
GUM_SCALAR
>
191
void
O3prmReader
<
GUM_SCALAR
>::
setClassPath
(
const
std
::
string
&
class_path
) {
192
_class_path_
=
std
::
vector
<
std
::
string
>();
193
size_t
i
= 0;
194
size_t
j
=
class_path
.
find
(
';'
);
195
196
while
(
j
!=
std
::
string
::
npos
) {
197
addClassPath
(
class_path
.
substr
(
i
,
j
-
i
));
198
i
=
j
+ 1;
199
200
if
(
i
<
class_path
.
size
()) {
201
j
=
class_path
.
find
(
';'
,
i
);
202
}
else
{
203
j
=
std
::
string
::
npos
;
204
}
205
}
206
207
if
(
i
<
class_path
.
size
()) {
addClassPath
(
class_path
.
substr
(
i
,
std
::
string
::
npos
)); }
208
}
209
210
template
<
typename
GUM_SCALAR
>
211
void
O3prmReader
<
GUM_SCALAR
>::
addClassPath
(
const
std
::
string
&
class_path
) {
212
auto
path
=
class_path
;
213
if
(
path
[
path
.
size
() - 1] !=
'/'
) {
path
.
append
(
"/"
); }
214
auto
dir
=
Directory
(
path
);
215
216
if
(!
dir
.
isValid
()) {
217
_errors_
.
addException
(
"could not resolve class path"
,
path
);
218
}
else
{
219
_class_path_
.
push_back
(
std
::
move
(
path
));
220
}
221
}
222
223
template
<
typename
GUM_SCALAR
>
224
INLINE
Idx
O3prmReader
<
GUM_SCALAR
>::
errLine
(
Idx
i
)
const
{
225
return
_errors_
.
error
(
i
).
line
;
226
}
227
228
template
<
typename
GUM_SCALAR
>
229
INLINE
Idx
O3prmReader
<
GUM_SCALAR
>::
errCol
(
Idx
i
)
const
{
230
return
_errors_
.
error
(
i
).
column
;
231
}
232
233
template
<
typename
GUM_SCALAR
>
234
INLINE
std
::
wstring
O3prmReader
<
GUM_SCALAR
>::
errFilename
(
Idx
i
)
const
{
235
return
widen
(
_errors_
.
error
(
i
).
filename
);
236
}
237
238
template
<
typename
GUM_SCALAR
>
239
INLINE
bool
O3prmReader
<
GUM_SCALAR
>::
errIsError
(
Idx
i
)
const
{
240
return
_errors_
.
error
(
i
).
is_error
;
241
}
242
243
template
<
typename
GUM_SCALAR
>
244
INLINE
std
::
string
O3prmReader
<
GUM_SCALAR
>::
errMsg
(
Idx
i
)
const
{
245
return
_errors_
.
error
(
i
).
msg
;
246
}
247
248
template
<
typename
GUM_SCALAR
>
249
INLINE
void
O3prmReader
<
GUM_SCALAR
>::
showElegantErrors
(
std
::
ostream
&
o
)
const
{
250
for
(
Idx
i
= 0;
i
<
_errors_
.
count
(); ++
i
) {
251
auto
err
=
_errors_
.
error
(
i
);
252
if
(
err
.
is_error
) {
o
<<
_print_
(
err
) <<
std
::
endl
; }
253
}
254
}
255
256
template
<
typename
GUM_SCALAR
>
257
INLINE
void
O3prmReader
<
GUM_SCALAR
>::
showElegantErrorsAndWarnings
(
std
::
ostream
&
o
)
const
{
258
for
(
Idx
i
= 0;
i
<
_errors_
.
count
(); ++
i
) {
259
auto
err
=
_errors_
.
error
(
i
);
260
o
<<
_print_
(
err
) <<
std
::
endl
;
261
}
262
}
263
264
template
<
typename
GUM_SCALAR
>
265
INLINE
void
O3prmReader
<
GUM_SCALAR
>::
showErrorCounts
(
std
::
ostream
&
o
)
const
{
266
_errors_
.
syntheticResults
(
o
);
267
}
268
269
template
<
typename
GUM_SCALAR
>
270
INLINE
Size
O3prmReader
<
GUM_SCALAR
>::
errors
()
const
{
271
return
_errors_
.
error_count
;
272
}
273
274
template
<
typename
GUM_SCALAR
>
275
INLINE
Size
O3prmReader
<
GUM_SCALAR
>::
warnings
()
const
{
276
return
_errors_
.
warning_count
;
277
}
278
279
template
<
typename
GUM_SCALAR
>
280
INLINE
const
ErrorsContainer
&
O3prmReader
<
GUM_SCALAR
>::
errorsContainer
()
const
{
281
return
_errors_
;
282
}
283
284
template
<
typename
GUM_SCALAR
>
285
INLINE
Size
O3prmReader
<
GUM_SCALAR
>::
readString
(
const
std
::
string
&
str
) {
286
std
::
stringstream
sBuff
(
str
);
287
_readStream_
(
sBuff
,
""
);
288
return
_errors_
.
count
();
289
}
290
291
template
<
typename
GUM_SCALAR
>
292
INLINE
Size
O3prmReader
<
GUM_SCALAR
>::
readFile
(
const
std
::
string
&
file
,
293
const
std
::
string
&
module
) {
294
try
{
295
auto
lastSlashIndex
=
file
.
find_last_of
(
'/'
);
296
297
auto
dir
=
Directory
(
file
.
substr
(0,
lastSlashIndex
+ 1));
298
299
if
(!
dir
.
isValid
()) {
300
_errors_
.
addException
(
"could not find file"
,
file
);
301
return
_errors_
.
count
();
302
}
303
304
auto
basename
=
file
.
substr
(
lastSlashIndex
+ 1);
305
auto
absFilename
=
dir
.
absolutePath
() +
basename
;
306
307
std
::
ifstream
input
(
absFilename
);
308
if
(
input
.
is_open
()) {
309
_readStream_
(
input
,
file
,
module
);
310
}
else
{
311
_errors_
.
addException
(
"could not open file"
,
file
);
312
}
313
314
return
_errors_
.
count
();
315
316
}
catch
(
gum
::
Exception
&
e
) {
317
GUM_SHOWERROR
(
e
);
318
_errors_
.
addException
(
e
.
errorContent
(),
file
);
319
return
_errors_
.
count
();
320
}
catch
(...) {
321
_errors_
.
addException
(
"unknown error"
,
file
);
322
return
_errors_
.
count
();
323
}
324
}
325
326
template
<
typename
GUM_SCALAR
>
327
INLINE
void
O3prmReader
<
GUM_SCALAR
>::
parseStream
(
std
::
istream
&
input
,
328
std
::
ostream
&
output
,
329
std
::
string
module
) {
330
_readStream_
(
input
,
""
,
module
);
331
332
showElegantErrorsAndWarnings
(
output
);
333
}
334
335
template
<
typename
GUM_SCALAR
>
336
INLINE
void
O3prmReader
<
GUM_SCALAR
>::
_parseStream_
(
std
::
istream
&
input
,
337
const
std
::
string
&
filename
,
338
const
std
::
string
&
module
) {
339
auto
sBuff
=
_readStream_
(
input
);
340
auto
buffer
=
std
::
unique_ptr
<
unsigned
char
[] >(
new
unsigned
char
[
sBuff
.
length
() + 1]);
341
strcpy
((
char
*)
buffer
.
get
(),
sBuff
.
c_str
());
342
auto
s
=
o3prm_scanner
(
buffer
.
get
(),
int
(
sBuff
.
length
() + 1),
filename
);
343
auto
p
=
o3prm_parser
(&
s
);
344
p
.
set_prm
(
_o3_prm_
.
get
());
345
p
.
set_prefix
(
module
);
346
p
.
Parse
();
347
_errors_
+=
p
.
errors
();
348
}
349
350
template
<
typename
GUM_SCALAR
>
351
INLINE
void
O3prmReader
<
GUM_SCALAR
>::
_parseImport_
(
const
O3Import
&
i
,
352
const
std
::
string
&
module
) {
353
if
(!
_imported_
.
exists
(
i
.
import
().
label
())) {
354
_imported_
.
insert
(
i
.
import
().
label
());
355
356
auto
module_path
=
module
;
357
std
::
replace
(
module_path
.
begin
(),
module_path
.
end
(),
'.'
,
'/'
);
358
359
auto
path
=
i
.
import
().
label
();
360
std
::
replace
(
path
.
begin
(),
path
.
end
(),
'.'
,
'/'
);
361
362
auto
imported
=
false
;
363
for
(
const
auto
&
cp
:
_class_path_
) {
364
auto
file_path
=
cp
+
path
+
".o3prm"
;
365
std
::
ifstream
file
(
file_path
);
366
367
if
(
file
.
is_open
()) {
368
_parseStream_
(
file
,
file_path
,
i
.
import
().
label
());
369
imported
=
true
;
370
break
;
371
}
372
373
file_path
=
cp
+
module
+
path
+
".o3prm"
;
374
std
::
ifstream
file2
(
file_path
);
375
376
if
(
file2
.
is_open
()) {
377
_parseStream_
(
file2
,
file_path
,
module
+
"."
+
i
.
import
().
label
());
378
imported
=
true
;
379
break
;
380
}
381
}
382
383
if
(!
imported
) {
384
const
auto
&
pos
=
i
.
import
().
position
();
385
std
::
stringstream
msg
;
386
msg
<<
"Import error: could not resolve import "
<<
i
.
import
().
label
();
387
_errors_
.
addError
(
msg
.
str
(),
pos
.
file
(),
pos
.
line
(),
pos
.
column
());
388
}
389
}
390
}
391
392
template
<
typename
GUM_SCALAR
>
393
INLINE
std
::
vector
<
const
O3Import
* >
O3prmReader
<
GUM_SCALAR
>::
_copyImports_
() {
394
auto
copy
=
std
::
vector
<
const
O3Import
* >();
395
for
(
const
auto
&
i
:
_o3_prm_
->
imports
()) {
396
if
(!
_imported_
.
exists
(
i
->
import
().
label
())) {
copy
.
push_back
(
i
.
get
()); }
397
}
398
return
copy
;
399
}
400
401
template
<
typename
GUM_SCALAR
>
402
INLINE
void
O3prmReader
<
GUM_SCALAR
>::
_readStream_
(
std
::
istream
&
input
,
403
const
std
::
string
&
file
,
404
std
::
string
module
) {
405
if
(
module
.
size
() > 0 &&
module
.
back
() !=
'.'
) {
module
.
append
(
"."
); }
406
407
_parseStream_
(
input
,
file
,
module
);
408
409
auto
imports
=
_copyImports_
();
410
do
{
411
for
(
auto
i
:
imports
) {
412
_parseImport_
(*
i
,
module
);
413
}
414
imports
=
_copyImports_
();
415
}
while
(
imports
.
size
() > 0);
416
417
418
if
(
_errors_
.
error_count
== 0) {
419
auto
solver
=
O3NameSolver
<
GUM_SCALAR
>(*
_prm_
, *
_o3_prm_
,
_errors_
);
420
auto
type_factory
=
O3TypeFactory
<
GUM_SCALAR
>(*
_prm_
, *
_o3_prm_
,
solver
,
_errors_
);
421
422
auto
interface_factory
423
=
O3InterfaceFactory
<
GUM_SCALAR
>(*
_prm_
, *
_o3_prm_
,
solver
,
_errors_
);
424
auto
class_factory
=
O3ClassFactory
<
GUM_SCALAR
>(*
_prm_
, *
_o3_prm_
,
solver
,
_errors_
);
425
426
auto
system_factory
=
O3SystemFactory
<
GUM_SCALAR
>(*
_prm_
, *
_o3_prm_
,
solver
,
_errors_
);
427
428
try
{
429
type_factory
.
build
();
430
interface_factory
.
buildInterfaces
();
431
class_factory
.
buildClasses
();
432
interface_factory
.
buildElements
();
433
class_factory
.
buildImplementations
();
434
class_factory
.
buildParameters
();
435
class_factory
.
buildReferenceSlots
();
436
class_factory
.
declareAttributes
();
437
class_factory
.
declareAggregates
();
438
class_factory
.
completeAggregates
();
439
class_factory
.
completeAttributes
();
440
system_factory
.
build
();
441
}
catch
(
Exception
&) {
442
if
(
_errors_
.
count
() == 0) {
_errors_
.
addException
(
"an unknown error occured"
,
file
); }
443
}
catch
(...) {
_errors_
.
addException
(
"an unknown exception occured"
,
file
); }
444
}
445
}
446
}
// namespace o3prm
447
}
// namespace prm
448
}
// namespace gum
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:643
gum::prm::o3prm
Definition:
O3prm.cpp:34
gum::prm::ParamScopeData::ParamScopeData
ParamScopeData(const std::string &s, const PRMReferenceSlot< GUM_SCALAR > &ref, Idx d)
Definition:
PRMClass_tpl.h:1032