@@ -94,23 +94,25 @@ struct CallableWrapTTUnwrapTuple<funcT, keyT, output_terminalsT, std::tuple<inpu
9494// case 1 (keyT != void): void op(auto&& key, input_valuesT&&..., std::tuple<output_terminalsT...>&)
9595// case 2 (keyT == void): void op(input_valuesT&&..., std::tuple<output_terminalsT...>&)
9696//
97- template <typename funcT, typename keyT, typename output_terminalsT, typename ... input_valuesT>
97+ template <typename funcT, typename keyT, typename output_terminalsT,
98+ typename terminal_input_values_tupleT, typename args_input_values_tupleT>
9899class CallableWrapTTArgs
99- : public TT<keyT, output_terminalsT, CallableWrapTTArgs<funcT, keyT, output_terminalsT, input_valuesT...>,
100- std::tuple<input_valuesT...>,
101- typename ttg::meta::drop_last_n<
102- typename ttg::meta::drop_first_n<boost::callable_traits::args_t <funcT>,
103- ttg::meta::is_void_v<keyT> ? 0 : 1 >::type,
104- 1 >::type> {
105- using baseT = TT<keyT, output_terminalsT, CallableWrapTTArgs<funcT, keyT, output_terminalsT, input_valuesT...>,
106- std::tuple<input_valuesT...>,
107- typename ttg::meta::drop_last_n<
108- typename ttg::meta::drop_first_n<boost::callable_traits::args_t <funcT>,
109- ttg::meta::is_void_v<keyT> ? 0 : 1 >::type,
110- 1 >::type>;
100+ : public TT<keyT, output_terminalsT,
101+ CallableWrapTTArgs<funcT, keyT, output_terminalsT,
102+ terminal_input_values_tupleT,
103+ args_input_values_tupleT>,
104+ terminal_input_values_tupleT,
105+ args_input_values_tupleT>
106+ {
107+ using baseT = TT<keyT, output_terminalsT,
108+ CallableWrapTTArgs<funcT, keyT, output_terminalsT,
109+ terminal_input_values_tupleT,
110+ args_input_values_tupleT>,
111+ terminal_input_values_tupleT,
112+ args_input_values_tupleT>;
111113
112114 using input_values_tuple_type = typename baseT::input_values_tuple_type;
113- using input_refs_tuple_type = typename baseT::input_refs_tuple_type ;
115+ using args_refs_tuple_type = typename baseT::args_refs_tuple_type ;
114116 using input_edges_type = typename baseT::input_edges_type;
115117 using output_edges_type = typename baseT::output_edges_type;
116118
@@ -152,41 +154,40 @@ class CallableWrapTTArgs
152154 : baseT(name, innames, outnames), func(std::forward<funcT_>(f)) {}
153155
154156 template <typename Key, typename ArgsTuple>
155- std::enable_if_t <std::is_same_v<ArgsTuple, input_refs_tuple_type > &&
156- !ttg::meta::is_empty_tuple_v<input_refs_tuple_type > && !ttg::meta::is_void_v<Key>,
157+ std::enable_if_t <std::is_same_v<ArgsTuple, args_refs_tuple_type > &&
158+ !ttg::meta::is_empty_tuple_v<args_refs_tuple_type > && !ttg::meta::is_void_v<Key>,
157159 void >
158160 op (Key &&key, ArgsTuple &&args_tuple, output_terminalsT &out) {
159161 call_func (std::forward<Key>(key), std::forward<ArgsTuple>(args_tuple), out,
160162 std::make_index_sequence<std::tuple_size<ArgsTuple>::value>{});
161163 };
162164
163165 template <typename ArgsTuple, typename Key = keyT>
164- std::enable_if_t <std::is_same_v<ArgsTuple, input_refs_tuple_type > &&
165- !ttg::meta::is_empty_tuple_v<input_refs_tuple_type > && ttg::meta::is_void_v<Key>,
166+ std::enable_if_t <std::is_same_v<ArgsTuple, args_refs_tuple_type > &&
167+ !ttg::meta::is_empty_tuple_v<args_refs_tuple_type > && ttg::meta::is_void_v<Key>,
166168 void >
167169 op (ArgsTuple &&args_tuple, output_terminalsT &out) {
168170 call_func (std::forward<ArgsTuple>(args_tuple), out, std::make_index_sequence<std::tuple_size<ArgsTuple>::value>{});
169171 };
170172
171- template <typename Key, typename ArgsTuple = input_refs_tuple_type >
173+ template <typename Key, typename ArgsTuple = args_refs_tuple_type >
172174 std::enable_if_t <ttg::meta::is_empty_tuple_v<ArgsTuple> && !ttg::meta::is_void_v<Key>, void >
173175 op (Key &&key, output_terminalsT &out) {
174176 call_func (std::forward<Key>(key), out);
175177 };
176178
177- template <typename Key = keyT, typename ArgsTuple = input_refs_tuple_type >
179+ template <typename Key = keyT, typename ArgsTuple = args_refs_tuple_type >
178180 std::enable_if_t <ttg::meta::is_empty_tuple_v<ArgsTuple> && ttg::meta::is_void_v<Key>, void >
179181 op (output_terminalsT &out) {
180182 call_func (out);
181183 };
182184};
183185
184- template <typename funcT, typename keyT, typename output_terminalsT, typename input_values_tupleT>
185- struct CallableWrapTTArgsUnwrapTuple ;
186-
187- template <typename funcT, typename keyT, typename output_terminalsT, typename ... input_valuesT>
188- struct CallableWrapTTArgsUnwrapTuple <funcT, keyT, output_terminalsT, std::tuple<input_valuesT...>> {
189- using type = CallableWrapTTArgs<funcT, keyT, output_terminalsT, std::remove_reference_t <input_valuesT>...>;
186+ template <typename funcT, typename keyT, typename output_terminalsT,
187+ typename terminal_input_values_tupleT, typename args_input_values_tupleT>
188+ struct CallableWrapTTArgsUnwrapTuple {
189+ using type = CallableWrapTTArgs<funcT, keyT, output_terminalsT,
190+ terminal_input_values_tupleT, args_input_values_tupleT>;
190191};
191192
192193// Factory function to assist in wrapping a callable with signature
@@ -272,19 +273,20 @@ auto make_tt(funcT &&func, const std::tuple<ttg::Edge<keyT, input_edge_valuesT>.
272273 typename ttg::meta::drop_first_n<func_args_t , std::size_t (void_key ? 0 : 1 )>::type,
273274 std::tuple_size_v<func_args_t > - (void_key ? 1 : 2 )>::type;
274275 using decayed_input_args_t = ttg::meta::decayed_tuple_t <input_args_t >;
276+ using noref_input_args_t = ttg::meta::nonref_tuple_t <input_args_t >;
275277 // 3. full_input_args_t = !have_void_datum ? input_args_t : input_args_t+void
276278 using full_input_args_t =
277- std::conditional_t <!have_void_datum, input_args_t , ttg::meta::tuple_concat_t <input_args_t , std::tuple<void >>>;
278- using wrapT = typename CallableWrapTTArgsUnwrapTuple<funcT, keyT, output_terminals_type, full_input_args_t >::type;
279+ std::conditional_t <!have_void_datum, noref_input_args_t , ttg::meta::tuple_concat_t <noref_input_args_t , std::tuple<void >>>;
280+ using wrapT = typename CallableWrapTTArgsUnwrapTuple<funcT, keyT, output_terminals_type, input_values_tuple_type, full_input_args_t >::type;
279281 // not sure if we need this level of type checking ...
280282 // TODO determine the generic signature of func
281283 if constexpr (!void_key) {
282284 static_assert (
283285 std::is_same_v<typename std::tuple_element<0 , func_args_t >::type, const keyT &>,
284286 " ttg::make_tt(func, inedges, outedges): first argument of func must be const keyT& (unless keyT = void)" );
285287 }
286- static_assert (std::is_same_v<decayed_input_args_t , input_values_tuple_type>,
287- " ttg::make_tt(func, inedges, outedges): inedges value types do not match argument types of func" );
288+ // static_assert(std::is_same_v<decayed_input_args_t, input_values_tuple_type>,
289+ // "ttg::make_tt(func, inedges, outedges): inedges value types do not match argument types of func");
288290 static_assert (
289291 std::is_same_v<typename std::tuple_element<num_args - 1 , func_args_t >::type, output_terminals_type &>,
290292 " ttg::make_tt(func, inedges, outedges): last argument of func must be std::tuple<output_terminals_type>&" );
0 commit comments