22 #ifndef FUNCTIONAL_NODE_FACTORY_H
23 #define FUNCTIONAL_NODE_FACTORY_H
27 template<
size_t,
typename,
typename,
size_t>
31 template<
size_t IDX1,
typename... Tpack,
typename Tuple,
size_t IDX2>
32 struct sub_tuple<IDX1, std::tuple<Tpack...>, Tuple, IDX2>
33 :
sub_tuple<IDX1 + 1, std::tuple<Tpack..., std::tuple_element_t<IDX1, Tuple>>, Tuple, IDX2>
37 template<std::size_t IDX,
typename... Tpack,
typename Tuple>
38 struct sub_tuple<IDX, std::tuple<Tpack...>, Tuple, IDX>
39 {
typedef std::tuple<Tpack...>
type; };
51 using is_correct_input = std::conjunction<std::is_pointer<T>,
52 std::is_const<std::remove_pointer_t<T>>>;
56 using is_correct_output = std::conjunction<std::is_lvalue_reference<T>,
57 std::negation<std::is_const<std::remove_reference<T>>>>;
67 template<
size_t in_n,
size_t out_n,
typename...
args>
70 static_assert(in_n + out_n ==
sizeof...(
args),
"Wrong number of input and/or output parameters in Functional Node");
73 using f_params_t = std::tuple<
args...>;
74 using f_params_no_ref_t = std::tuple<std::remove_reference_t<args>...>;
75 using f_params_no_pointer_t = std::tuple<std::remove_const_t<std::remove_pointer_t<args>>...>;
82 FunctionalNodeFactory::checkInputs<0, in_n, inputs_t>();
83 FunctionalNodeFactory::checkOutputs<0, out_n, outputs_t>();
86 using params_t = decltype(std::tuple_cat(std::declval<inputs_t>(), std::declval<outputs_no_ref_t>()));
87 auto f_wrap = [f](params_t &p) {
return std::apply(f, p); };
96 template<
size_t N,
size_t MaxN,
typename tuple_t>
97 static void checkInputs()
99 if constexpr (N < MaxN) {
102 checkInputs<N+1, MaxN, tuple_t>();
109 template<
size_t N,
size_t MaxN,
typename tuple_t>
110 static void checkOutputs()
112 if constexpr (N < MaxN) {
114 checkOutputs<N+1, MaxN, tuple_t>();
120 #endif //FUNCTIONAL_NODE_FACTORY_H