2 #ifndef __SFI_VISITORS_HH__
3 #define __SFI_VISITORS_HH__
9 template<
class Visitable>
void sfi_rec_to_visitable (SfiRec *rec, Visitable &visitable);
10 template<
class Visitable> SfiRec* sfi_rec_new_from_visitable (Visitable &visitable);
11 template<
class Visitable>
void sfi_seq_to_visitable (SfiSeq *seq, Visitable &visitable);
12 template<
class Visitable> SfiSeq* sfi_seq_new_from_visitable (Visitable &visitable);
13 template<
class Visitable>
SfiRecFields sfi_pspecs_rec_fields_from_visitable (Visitable &visitable);
14 template<
class Visitable> GParamSpec* sfi_pspec_seq_field_from_visitable (Visitable &visitable);
15 template<
class Visitable>
const std::vector<GParamSpec*>& sfi_pspecs_fields_from_accessor_visitable (Visitable &visitable);
17 bool sfi_pspecs_seq_field_cache (
const std::type_info &type_info, GParamSpec **pp,
bool assign =
false);
23 String get_min (Name name, Name fallback) {
return get_aux (name,
"min", fallback); }
24 String get_max (Name name, Name fallback) {
return get_aux (name,
"max", fallback); }
25 String get_step (Name name) {
return get_aux (name,
"step"); }
26 String get_dflt (Name name) {
return get_aux (name,
"default"); }
27 String get_label (Name name) {
return get_aux (name,
"label"); }
28 String get_blurb (Name name) {
return get_aux (name,
"blurb"); }
29 String get_hints (Name name) {
return get_aux (name,
"hints"); }
30 String get_aux (
const char *field,
const char *key,
const char *fallback =
"")
33 for (
const String &kv : aux_)
39 add_group (Name name, GParamSpec *pspec)
41 const String group = get_aux (name,
"group");
43 sfi_pspec_set_group (pspec, group.
c_str());
47 template<
class A>
void
48 visit_bool (A &a, Name name)
50 const bool dfl = string_to_bool (get_dflt (name));
51 GParamSpec *pspec = sfi_pspec_bool (name, get_label (name).c_str(), get_blurb (name).c_str(), dfl, get_hints (name).c_str());
52 add_group (name, pspec);
55 template<
class A>
void
56 visit_integral (A &a, Name name)
58 const int64 dfl = string_to_int (get_dflt (name));
59 const int64 mi = string_to_int (get_min (name,
"-9223372036854775808"));
60 const int64 ma = string_to_int (get_max (name,
"+9223372036854775807"));
61 const int64 ms = string_to_int (get_step (name));
62 GParamSpec *pspec = sfi_pspec_num (name, get_label (name).c_str(), get_blurb (name).c_str(), dfl, mi, ma, ms, get_hints (name).c_str());
63 add_group (name, pspec);
66 template<
class A>
void
67 visit_float (A &a, Name name)
69 const double dfl = string_to_double (get_dflt (name));
70 const double mi = string_to_double (get_min (name,
"-1.79769313486231570815e+308"));
71 const double ma = string_to_double (get_max (name,
"+1.79769313486231570815e+308"));
72 const double ms = string_to_double (get_step (name));
73 GParamSpec *pspec = sfi_pspec_real (name, get_label (name).c_str(), get_blurb (name).c_str(), dfl, mi, ma, ms, get_hints (name).c_str());
74 add_group (name, pspec);
80 GParamSpec *pspec = sfi_pspec_string (name, get_label (name).c_str(), get_blurb (name).c_str(),
81 get_dflt (name).c_str(), get_hints (name).c_str());
82 add_group (name, pspec);
85 template<
class A>
void
86 visit_enum (A &a, Name name)
88 GParamSpec *pspec = sfi_pspec_choice (name, get_label (name).c_str(), get_blurb (name).c_str(), get_dflt (name).c_str(),
89 Bse::choice_values_from_enum<A>(), get_hints (name).c_str());
90 add_group (name, pspec);
93 template<
class A>
void
94 visit_visitable (A &a, Name name)
96 SfiRecFields recfields = sfi_pspecs_rec_fields_from_visitable (a);
97 GParamSpec *pspec = sfi_pspec_rec (name, get_label (name).c_str(), get_blurb (name).c_str(), recfields, get_hints (name).c_str());
98 add_group (name, pspec);
101 template<
class SeqA>
void
102 visit_vector (SeqA &a, Name name)
104 GParamSpec *pspec = sfi_pspec_seq_field_from_visitable (a);
107 GParamSpec *seq_pspec = sfi_pspec_seq (name, get_label (name).c_str(), get_blurb (name).c_str(), pspec, get_hints (name).c_str());
108 add_group (name, seq_pspec);
112 template<
class A>
void
113 visit_class (A &a, Name name)
115 GParamSpec *pspec = sfi_pspec_proxy (name, get_label (name).c_str(), get_blurb (name).c_str(), get_hints (name).c_str());
116 add_group (name, pspec);
125 template<
class A>
void
126 visit_bool (A &a, Name name)
128 sfi_rec_set_bool (rec_, name, a);
130 template<
class A>
void
131 visit_integral (A &a, Name name)
133 sfi_rec_set_num (rec_, name, a);
135 template<
class A>
void
136 visit_float (A &a, Name name)
138 sfi_rec_set_real (rec_, name, a);
143 sfi_rec_set_string (rec_, name, a.
c_str());
145 template<
class A>
void
146 visit_enum (A &a, Name name)
148 sfi_rec_set_choice (rec_, name, Rapicorn::Aida::enum_info<A>().value_to_string (a).c_str());
150 template<
class SeqA>
void
151 visit_vector (SeqA &a, Name name)
153 SfiSeq *field_seq = sfi_seq_new_from_visitable (a);
154 sfi_rec_set_seq (rec_, name, field_seq);
155 sfi_seq_unref (field_seq);
157 template<
class A>
void
158 visit_visitable (A &a, Name name)
160 SfiRec *field_rec = sfi_rec_new();
162 a.__accept__ (rec_visitor);
163 sfi_rec_set_rec (rec_, name, field_rec);
164 sfi_rec_unref (field_rec);
166 template<
class A>
void
167 visit_class (A &a, Name name)
169 sfi_rec_set_proxy (rec_, name, a);
177 template<
class A>
void
178 visit_bool (A &a, Name name)
180 a = sfi_rec_get_bool (rec_, name);
182 template<
class A>
void
183 visit_integral (A &a, Name name)
185 a = sfi_rec_get_num (rec_, name);
187 template<
class A>
void
188 visit_float (A &a, Name name)
190 a = sfi_rec_get_real (rec_, name);
195 const char *s = sfi_rec_get_string (rec_, name);
198 template<
class A>
void
199 visit_enum (A &a, Name name)
201 const char *c = sfi_rec_get_choice (rec_, name);
202 a = !c ? (A) 0 : Rapicorn::Aida::enum_value_from_string<A>(c);
204 template<
class SeqA>
void
205 visit_vector (SeqA &a, Name name)
207 SfiSeq *field_seq = sfi_rec_get_seq (rec_, name);
208 sfi_seq_to_visitable (field_seq, a);
210 template<
class A>
void
211 visit_visitable (A &a, Name name)
213 SfiRec *field_rec = sfi_rec_get_rec (rec_, name);
217 a.__accept__ (rec_visitor);
220 template<
class A>
void
221 visit_class (A &a, Name name)
223 a = sfi_rec_get_proxy (rec_, name);
227 template<
class Visitable>
void
228 sfi_seq_to_visitable (SfiSeq *seq, Visitable &visitable)
232 visitable.resize (0);
235 const size_t n = sfi_seq_length (seq);
236 visitable.resize (n);
237 SfiRec *tmp_rec = sfi_rec_new();
238 for (
size_t i = 0; i < n; i++)
240 sfi_rec_set (tmp_rec,
"seqelement", sfi_seq_get (seq, i));
241 FromRecVisitor rec_visitor (tmp_rec);
242 typedef typename Visitable::value_type A;
243 typename StdVectorValueHandle<::std::vector<A>>::type value_handle = visitable[i];
244 rec_visitor (value_handle,
"seqelement");
246 visitable[i] = value_handle;
248 sfi_rec_unref (tmp_rec);
251 template<
class Visitable> SfiSeq*
252 sfi_seq_new_from_visitable (Visitable &visitable)
254 SfiSeq *seq = sfi_seq_new();
255 SfiRec *tmp_rec = sfi_rec_new();
256 for (
size_t i = 0; i < visitable.size(); i++)
258 ToRecVisitor rec_visitor (tmp_rec);
259 typedef typename Visitable::value_type A;
260 typename StdVectorValueHandle<::std::vector<A>>::type value_handle = visitable[i];
261 rec_visitor (value_handle,
"seqelement");
263 visitable[i] = value_handle;
264 GValue *element = sfi_rec_get (tmp_rec,
"seqelement");
267 sfi_seq_append (seq, element);
268 sfi_rec_clear (tmp_rec);
273 sfi_rec_unref (tmp_rec);
277 template<
class Visitable> SfiRec*
278 sfi_rec_new_from_visitable (Visitable &visitable)
280 SfiRec *rec = sfi_rec_new();
281 ToRecVisitor rec_visitor (rec);
282 visitable.__accept__ (rec_visitor);
286 template<
class Visitable>
void
287 sfi_rec_to_visitable (SfiRec *rec, Visitable &visitable)
289 FromRecVisitor rec_visitor (rec);
290 visitable.__accept__ (rec_visitor);
294 sfi_pspecs_rec_fields_from_visitable (Visitable &visitable)
297 if (sfi_pspecs_rec_fields_cache (
typeid (Visitable), &rec_fields))
300 PspecVisitor pspec_visitor (pspecs, visitable.__aida_aux_data__());
301 visitable.__accept__ (pspec_visitor);
302 rec_fields.n_fields = pspecs.
size();
303 rec_fields.fields = g_new0 (GParamSpec*, rec_fields.n_fields);
304 for (
size_t i = 0; i < rec_fields.n_fields; i++)
306 g_param_spec_ref (pspecs[i]);
307 g_param_spec_sink (pspecs[i]);
308 rec_fields.fields[i] = pspecs[i];
310 sfi_pspecs_rec_fields_cache (
typeid (Visitable), &rec_fields,
true);
314 template<
class Visitable> GParamSpec*
315 sfi_pspec_seq_field_from_visitable (Visitable &visitable)
317 GParamSpec *pspec = NULL;
318 if (sfi_pspecs_seq_field_cache (
typeid (Visitable), &pspec))
321 PspecVisitor pspec_visitor (pspecs, visitable.__aida_aux_data__());
322 typedef typename Visitable::value_type A;
323 A example_element = A();
324 pspec_visitor (example_element,
"seqelement");
325 if (pspecs.
size() == 1)
328 g_param_spec_ref (pspec);
329 g_param_spec_sink (pspec);
330 sfi_pspecs_seq_field_cache (
typeid (Visitable), &pspec,
true);
332 for (
size_t i = 0; i < pspecs.
size(); i++)
334 g_param_spec_ref (pspecs[i]);
335 g_param_spec_sink (pspecs[i]);
336 g_param_spec_unref (pspecs[i]);
342 sfi_pspecs_fields_from_accessor_visitable (Visitable &visitable)
345 if (sfi_pspecs_acs_fields_cache (
typeid (Visitable), &pspecsp))
348 PspecVisitor pspec_visitor (pspecs, visitable.__aida_aux_data__());
349 visitable.__accept_accessor__ (pspec_visitor);
350 for (
size_t i = 0; i < pspecs.
size(); i++)
352 g_param_spec_ref (pspecs[i]);
353 g_param_spec_sink (pspecs[i]);
356 sfi_pspecs_acs_fields_cache (
typeid (Visitable), &pspecsp,
true);
358 bool success = sfi_pspecs_acs_fields_cache (
typeid (Visitable), &pspecsp);
359 RAPICORN_ASSERT (success && pspecsp);
365 #endif // __SFI_VISITORS_HH__
Definition: sfivisitors.hh:173
The Bse namespace contains all functions of the synthesis engine.
Definition: bstbseutils.cc:88
Definition: sfivisitors.hh:121
Definition: sfitypes.hh:31
Definition: sfivisitors.hh:20