4 #include <experimental/array>
6 #include <boost/hana/adapt_struct.hpp>
7 #include <boost/preprocessor/seq/for_each.hpp>
8 #include <boost/preprocessor/variadic/to_seq.hpp>
10 #include <SimoxUtility/meta/eigen.h>
16 template <
typename T,
typename =
void>
19 static constexpr
auto value = [](
auto... t)
20 {
return std::experimental::make_array<T>(std::forward<decltype(t)>(t)...); };
26 static constexpr
auto value = [](
auto... t)
27 {
return std::experimental::make_array<float>(std::forward<decltype(t)>(t)...); };
35 #define _detail_AX_MK_CFG_rem_paren(...) __VA_ARGS__
38 #define _detail_AX_MK_CFG_t0(e0, ...) e0
40 #define _detail_AX_MK_CFG_tail(e0, ...) __VA_ARGS__
42 #define _detail_AX_MK_CFG_applicator_i2(m, ...) m(__VA_ARGS__)
43 #define _detail_AX_MK_CFG_applicator_i1(...) _detail_AX_MK_CFG_applicator_i2(__VA_ARGS__)
46 #define _detail_AX_MK_CFG_applicator(r, tup, elem) \
47 _detail_AX_MK_CFG_applicator_i1( \
48 _detail_AX_MK_CFG_t0 tup, r, _detail_AX_MK_CFG_tail tup, _detail_AX_MK_CFG_rem_paren elem)
54 #define _detail_AX_MK_CFG_appl_FOR_EACH(stype, elemmacro, ...) \
55 BOOST_PP_SEQ_FOR_EACH( \
56 _detail_AX_MK_CFG_applicator, (elemmacro, stype), BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
61 #define _detail_AX_MK_CFG_member_def(R, sname, type, vname, ...) type vname;
62 #define _detail_AX_MK_CFG_struct_def(Namespace, Name, ...) \
67 BOOST_PP_EXPAND(_detail_AX_MK_CFG_appl_FOR_EACH(Namespace::Name, \
68 _detail_AX_MK_CFG_member_def, \
71 Name(Name&&) = default; \
72 Name(const Name&) = default; \
73 Name& operator=(Name&&) = default; \
74 Name& operator=(const Name&) = default; \
77 static_assert(true, "force the usage of a trailing semicolon")
79 #define _detail_AX_MK_CFG_ctor_def(Namespace, Name, ...) \
84 armarx::meta::cfg::struct_default<Name>::set(*this); \
87 static_assert(true, "force the usage of a trailing semicolon")
91 #define ARMARX_CONFIG_STRUCT_CONFIGURE(Namespace, Name, ...) \
92 namespace armarx::meta::cfg \
94 BOOST_PP_EXPAND(_detail_AX_MK_CFG_appl_FOR_EACH(Namespace::Name, \
95 _detail_AX_MK_CFG_cfg_elem, \
98 static_assert(true, "force the usage of a trailing semicolon")
101 #define _detail_AX_MK_CFG_cfg_elem_app_i4(sname, type, vname, m, ...) \
102 m(sname, type, vname, __VA_ARGS__)
104 #define _detail_AX_MK_CFG_cfg_elem_app_i3(...) _detail_AX_MK_CFG_cfg_elem_app_i4(__VA_ARGS__)
106 #define _detail_AX_MK_CFG_cfg_elem_app_i2(sname, type, vname, ...) \
107 _detail_AX_MK_CFG_cfg_elem_app_i3( \
108 sname, type, vname, _detail_AX_MK_CFG_cfg_elem_app_##__VA_ARGS__)
110 #define _detail_AX_MK_CFG_cfg_elem_app_i1(...) _detail_AX_MK_CFG_cfg_elem_app_i2(__VA_ARGS__)
113 #define _detail_AX_MK_CFG_cfg_elem_app(r, tup, elem) \
114 _detail_AX_MK_CFG_cfg_elem_app_i1(_detail_AX_MK_CFG_rem_paren tup, elem)
119 #define _detail_AX_MK_CFG_DEFER(x) x BOOST_PP_EMPTY()
120 #define _detail_AX_MK_CFG_SEQ_FOR_EACH_R_ID() BOOST_PP_SEQ_FOR_EACH_R
122 #define _detail_AX_MK_CFG_cfg_elem(R, sname, type, vname, ...) \
123 _detail_AX_MK_CFG_DEFER(_detail_AX_MK_CFG_SEQ_FOR_EACH_R_ID)()( \
125 _detail_AX_MK_CFG_cfg_elem_app, \
126 (sname, type, vname), \
127 BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
130 #define _detail_AX_MK_CFG_cfg_elem_app_AX_DEFAULT(...) \
131 _detail_AX_MK_CFG_cfg_elem_app_AX_DEFAULT_i, __VA_ARGS__
133 #define _detail_AX_MK_CFG_cfg_elem_app_AX_DEFAULT_i(sname, type, vname, ...) \
135 struct element_default<sname, type, &sname::vname> : \
141 return type(__VA_ARGS__); \
151 #define _detail_AX_MK_CFG_cfg_elem_app_(...)
154 #define _detail_AX_MK_CFG_cfg_elem_app_AX_MIN(...) \
155 _detail_AX_MK_CFG_cfg_elem_app_AX_MIN_i, __VA_ARGS__
157 #define _detail_AX_MK_CFG_cfg_elem_app_AX_MIN_i(sname, type, vname, ...) \
159 constexpr auto element_min<sname, type, &sname::vname> = \
160 armarx::meta::detail::make_array<type>::value(__VA_ARGS__);
163 #define _detail_AX_MK_CFG_cfg_elem_app_AX_MAX(...) \
164 _detail_AX_MK_CFG_cfg_elem_app_AX_MAX_i, __VA_ARGS__
166 #define _detail_AX_MK_CFG_cfg_elem_app_AX_MAX_i(sname, type, vname, ...) \
168 constexpr auto element_max<sname, type, &sname::vname> = \
169 armarx::meta::detail::make_array<type>::value(__VA_ARGS__);
172 #define _detail_AX_MK_CFG_cfg_elem_app_AX_DESCRIPTION(...) \
173 _detail_AX_MK_CFG_cfg_elem_app_AX_DESCRIPTION_i, __VA_ARGS__
175 #define _detail_AX_MK_CFG_cfg_elem_app_AX_DESCRIPTION_i(sname, type, vname, ...) \
177 constexpr const char* element_description<sname, type, &sname::vname> = __VA_ARGS__;
180 #define _detail_AX_MK_CFG_cfg_elem_app_AX_PROPERTY_NAME(...) \
181 _detail_AX_MK_CFG_cfg_elem_app_AX_PROP_NAME_i, __VA_ARGS__
183 #define _detail_AX_MK_CFG_cfg_elem_app_AX_PROP_NAME_i(sname, type, vname, ...) \
185 constexpr const char* element_property_name<sname, type, &sname::vname> = __VA_ARGS__;
188 #define _detail_AX_MK_CFG_cfg_elem_app_AX_DECIMALS(...) \
189 _detail_AX_MK_CFG_cfg_elem_app_AX_DECIMALS_i, __VA_ARGS__
191 #define _detail_AX_MK_CFG_cfg_elem_app_AX_DECIMALS_i(sname, type, vname, ...) \
193 constexpr auto element_decimals<sname, type, &sname::vname> = \
194 std::experimental::make_array<int>(__VA_ARGS__);
197 #define _detail_AX_MK_CFG_cfg_elem_app_AX_STEPS(...) \
198 _detail_AX_MK_CFG_cfg_elem_app_AX_STEPS_i, __VA_ARGS__
200 #define _detail_AX_MK_CFG_cfg_elem_app_AX_STEPS_i(sname, type, vname, ...) \
202 constexpr auto element_steps<sname, type, &sname::vname> = \
203 std::experimental::make_array<int>(__VA_ARGS__);
206 #define _detail_AX_MK_CFG_cfg_elem_app_AX_LABEL(...) \
207 _detail_AX_MK_CFG_cfg_elem_app_AX_LABEL_i, __VA_ARGS__
209 #define _detail_AX_MK_CFG_cfg_elem_app_AX_LABEL_i(sname, type, vname, ...) \
211 constexpr const char* element_label<sname, type, &sname::vname> = {__VA_ARGS__};
214 #define _detail_AX_MK_CFG_cfg_elem_app_AX_NO_PROPERTY(...) \
215 _detail_AX_MK_CFG_cfg_elem_app_AX_NO_PROPERTY_i, __VA_ARGS__
217 #define _detail_AX_MK_CFG_cfg_elem_app_AX_NO_PROPERTY_i(sname, type, vname, ...) \
219 constexpr std::true_type element_no_prop<sname, type, &sname::vname> = {};
221 #define _detail_AX_MK_CFG_cfg_elem_app_AX_NO_REMOTE_GUI(...) \
222 _detail_AX_MK_CFG_cfg_elem_app_AX_NO_REMOTE_GUI_i, __VA_ARGS__
224 #define _detail_AX_MK_CFG_cfg_elem_app_AX_NO_REMOTE_GUI_i(sname, type, vname, ...) \
226 constexpr std::true_type element_no_rem_gui<sname, type, &sname::vname> = {};
228 #define _detail_AX_MK_CFG_cfg_elem_app_AX_EXCLUDE_FROM_ALL(...) \
229 _detail_AX_MK_CFG_cfg_elem_app_AX_EXCLUDE_FROM_ALL_i, __VA_ARGS__
231 #define _detail_AX_MK_CFG_cfg_elem_app_AX_EXCLUDE_FROM_ALL_i(sname, type, vname, ...) \
233 constexpr std::true_type element_no_prop<sname, type, &sname::vname> = {}; \
235 constexpr std::true_type element_no_rem_gui<sname, type, &sname::vname> = {}; \
239 #define _detail_AX_MK_CFG_member_names(R, sname, type, name, ...) , name
240 #define ARMARX_CONFIG_STRUCT_ADAPT(Namespace, Name, ...) \
241 BOOST_HANA_ADAPT_STRUCT(Namespace::Name \
242 _detail_AX_MK_CFG_appl_FOR_EACH( \
243 Namespace::Name, _detail_AX_MK_CFG_member_names, __VA_ARGS__))
253 #define ARMARX_CONFIG_STRUCT_DEFINE_ADAPT(Namespace, Name, ...) \
254 _detail_AX_MK_CFG_struct_def(Namespace, Name, __VA_ARGS__); \
255 ARMARX_CONFIG_STRUCT_ADAPT(Namespace, Name, __VA_ARGS__); \
256 _detail_AX_MK_CFG_ctor_def(Namespace, Name, __VA_ARGS__)
265 #define ARMARX_CONFIG_STRUCT_DEFINE_ADAPT_CONFIGURE(Namespace, Name, ...) \
266 ARMARX_CONFIG_STRUCT_DEFINE_ADAPT(Namespace, Name, __VA_ARGS__); \
267 ARMARX_CONFIG_STRUCT_CONFIGURE(Namespace, Name, __VA_ARGS__)
276 #define ARMARX_CONFIG_STRUCT_CONFIGURE_ADAPT(Namespace, Name, ...) \
277 ARMARX_CONFIG_STRUCT_ADAPT(Namespace, Name, __VA_ARGS__); \
278 ARMARX_CONFIG_STRUCT_CONFIGURE(Namespace, Name, __VA_ARGS__)
280 #define ARMARX_CONFIG_STRUCT_ADAPT_CONFIGURE(Namespace, Name, ...) \
281 ARMARX_CONFIG_STRUCT_CONFIGURE_ADAPT(Namespace, Name, __VA_ARGS__)