21 template<
bool HasChoices>
39 static auto test(T *) ->
typename T::is_schema_t;
42 static std::false_type
test(...);
46 inline constexpr
bool is_schema_v = decltype(is_schema::test<T>(
nullptr))::value;
54 template<
typename T,
typename Allocator>
66 if constexpr(is_std_vector_v<T>) {
return is_schema_v<typename T::value_type>; }
91 if constexpr(is_std_map_v<T>) {
return is_schema_v<typename T::value_type>; }
104 template<
typename Scalar,
int Rows,
int Options,
int MaxRows>
105 struct is_eigen_vector<Eigen::Matrix<Scalar, Rows, 1, Options, MaxRows, 1>> :
public std::true_type
126 template<
typename T,
bool IsRequired,
bool IsInteractive,
bool HasChoices = false,
bool IsStatic = false>
128 const std::string & description,
132 template<
bool IsRequired,
bool IsInteractive,
bool HasChoices,
typename... Args>
137 auto get_choice = [&](
size_t idx)
139 if constexpr(HasChoices)
150 (addValueToForm<Args, IsRequired, IsInteractive, false, true>(
Default<Args>::value, get_choice(i++), {}, form), ...);
153 template<
typename T,
bool IsRequired,
bool IsInteractive,
bool HasChoices,
bool IsStatic>
155 const std::string & description,
159 const auto & get_value = [&value]() -> decltype(
auto)
161 if constexpr(IsStatic) {
return value; }
164 return [&value]() ->
const T & {
return value; };
167 if constexpr(details::is_schema_v<T>)
170 value.buildForm(input);
173 else if constexpr(details::is_std_vector_v<T>)
176 using value_type =
typename T::value_type;
177 static value_type default_{};
178 addValueToForm<value_type, true, IsInteractive>(default_, description, {}, input);
181 else if constexpr(details::is_std_map_v<T>)
185 else if constexpr(gui::details::is_variant_v<T>)
188 variantToForm<IsRequired, IsInteractive>(value, input, choices);
191 else if constexpr(std::is_same_v<T, bool>)
193 form.
addElement(mc_rtc::gui::FormCheckbox(description, IsRequired, get_value));
195 else if constexpr(std::is_integral_v<T>)
197 form.
addElement(mc_rtc::gui::FormIntegerInput(description, IsRequired, get_value));
199 else if constexpr(std::is_floating_point_v<T>)
201 form.
addElement(mc_rtc::gui::FormNumberInput(description, IsRequired, get_value));
203 else if constexpr(std::is_same_v<T, std::string>)
205 if constexpr(HasChoices)
207 auto it = std::find(choices.
choices.begin(), choices.
choices.end(), value);
214 form.
addElement(mc_rtc::gui::FormStringInput(description, IsRequired, get_value));
217 else if constexpr(std::is_same_v<T, Eigen::Vector3d>)
219 form.
addElement(mc_rtc::gui::FormPoint3DInput(description, IsRequired, get_value, IsInteractive));
221 else if constexpr(std::is_same_v<T, sva::PTransformd>)
223 form.
addElement(mc_rtc::gui::FormTransformInput(description, IsRequired, get_value, IsInteractive));
225 else if constexpr(std::is_same_v<T, sva::ForceVecd> || details::is_eigen_vector_v<T>)
229 else if constexpr(details::is_eigen_matrixxd_v<T>)
235 static_assert(!std::is_same_v<T, T>,
"addValueToForm must be implemented for this value type");
256 using int_t = std::underlying_type_t<ValueFlag>;
257 return static_cast<ValueFlag>(
static_cast<int_t
>(lhs) |
static_cast<int_t
>(rhs));
262 using int_t = std::underlying_type_t<ValueFlag>;
263 return static_cast<ValueFlag>(
static_cast<int_t
>(lhs) &
static_cast<int_t
>(rhs));
268 using int_t = std::underlying_type_t<ValueFlag>;
269 return (
static_cast<int_t
>(flag) &
static_cast<int_t
>(feature)) != 0;
311 std::function<bool(
const void * lhs,
const void * rhs)>
areEqual = [](
const void *,
const void *) {
return true; };
333 template<
typename T,
typename Schema, T Schema::* ptr, ValueFlag Flags = ValueFlag::All,
bool HasChoices = false>
335 const std::string & name,
336 const std::string & description,
337 const std::integral_constant<ValueFlag, Flags> & = {},
344 const T & value =
static_cast<const Schema *
>(
self)->*ptr;
345 out.add(name, value);
349 write(
self, builder);
350 const T & value =
static_cast<const Schema *
>(
self)->*ptr;
351 builder.write(description);
352 builder.write(value);
358 T & value =
static_cast<Schema *
>(
self)->*ptr;
359 if(in.has(name)) { value = in(name).operator T(); }
366 if(IsRequired || in.has(description))
368 if constexpr(details::is_schema_v<T>)
370 auto out_ = out.add(name);
371 T::formToStd(in(description), out_);
373 else if constexpr(details::is_std_vector_schema_v<T>)
375 using SchemaT =
typename T::value_type;
376 std::vector<Configuration> in_ = in(description);
377 auto out_ = out.array(name, in_.size());
378 for(
size_t i = 0; i < in_.size(); ++i)
380 auto out_i = out_.object();
381 SchemaT::formToStd(in_[i], out_i);
384 else if constexpr(details::is_std_map_schema_v<T>) {}
387 out.add(name, in(description));
396 const T & value =
static_cast<const Schema *
>(
self)->*ptr;
397 details::addValueToForm<T, IsRequired, IsInteractive>(value, description, choices, form);
401 const T & lhs_value =
static_cast<const Schema *
>(lhs)->*ptr;
402 const T & rhs_value =
static_cast<const Schema *
>(rhs)->*ptr;
403 return areEqual(lhs, rhs) && (lhs_value == rhs_value);
416 template<
typename T, ValueFlag Flags = ValueFlag::All,
bool HasChoices = false>
418 const std::integral_constant<ValueFlag, Flags> & = {},
422 if constexpr(IsRequired && HasChoices && std::is_same_v<T, std::string>)
452 struct Default<T,
std::enable_if_t<schema::details::is_schema_v<T>>>
454 inline static const T value = {};
458 struct Default<T,
std::enable_if_t<schema::details::is_std_vector_v<T>>>
460 inline static const T value = {};
464 struct Default<T, typename
std::enable_if_t<schema::details::is_std_map_v<T>>>
466 inline static const T value = {};
std::conditional< std::is_same< std::string, T >::value, const std::string &, std::string >::type to_string(const T &value)
Definition: RobotLoader.h:51
auto Schema(const std::string &name, const std::string &schema, Callback cb)
Definition: Schema.h:48
details::FormArrayInput< T > FormArrayInput(const std::string &name, bool required, bool fixed_size=false)
Definition: Form.h:388
void error_and_throw(Args &&... args)
Definition: logging.h:47
constexpr bool is_std_map_schema_v
Definition: Schema.h:89
constexpr bool is_std_vector_schema_v
Definition: Schema.h:64
void variantToForm(const std::variant< Args... > &, gui::details::FormElements &form, const Choices< HasChoices > &choices)
Definition: Schema.h:133
constexpr bool is_eigen_matrixxd_v
Definition: Schema.h:124
constexpr bool is_std_vector_v
Definition: Schema.h:60
constexpr bool is_eigen_vector_v
Definition: Schema.h:110
const T & get_default(const T &default_, const std::integral_constant< ValueFlag, Flags > &={}, const details::Choices< HasChoices > &choices={})
Definition: Schema.h:417
constexpr bool is_schema_v
Definition: Schema.h:46
void addValueToForm(const T &value, const std::string &description, const details::Choices< HasChoices > &choices, gui::details::FormElements &form)
Definition: Schema.h:154
constexpr bool is_std_map_v
Definition: Schema.h:85
constexpr bool HasFeature(ValueFlag flag, ValueFlag feature) noexcept
Definition: Schema.h:266
constexpr ValueFlag operator|(ValueFlag lhs, ValueFlag rhs) noexcept
Definition: Schema.h:254
ValueFlag
Definition: Schema.h:243
constexpr ValueFlag operator&(ValueFlag lhs, ValueFlag rhs) noexcept
Definition: Schema.h:260
struct MC_RTC_UTILS_DLLAPI Configuration
Definition: Configuration.h:46
MC_RBDYN_DLLAPI double distance(CD_Pair &pair, Eigen::Vector3d &p1, Eigen::Vector3d &p2)
Simplify access to values hold within a JSON file.
Definition: Configuration.h:166
Definition: MessagePackBuilder.h:87
gui::details::FormElements FormElements
Definition: Schema.h:301
std::function< void(const Configuration &in, Configuration &out)> formToStd
Definition: Schema.h:307
std::function< void(const void *self, FormElements &form)> buildForm
Definition: Schema.h:304
bool registerValue(details::MemberPointerWrapper< ptr >, const std::string &name, const std::string &description, const std::integral_constant< ValueFlag, Flags > &={}, const details::Choices< HasChoices > &choices={})
Definition: Schema.h:334
std::function< void(void *self, const Configuration &in)> load
Definition: Schema.h:299
std::function< bool(const void *lhs, const void *rhs)> areEqual
Definition: Schema.h:311
size_t values_count
Definition: Schema.h:289
std::function< void(const void *self, MessagePackBuilder &builder)> write
Definition: Schema.h:295
std::function< void(const void *self, Configuration &out)> save
Definition: Schema.h:292
std::vector< std::string > choices
Definition: Schema.h:26
Choices(const std::vector< std::string > &choices)
Definition: Schema.h:25
static mc_rtc::schema::Operations ops_
Definition: Schema.h:433
static std::false_type test(...)
static auto test(T *) -> typename T::is_schema_t