44 template<std::
size_t PrimaryIdx>
46 auto&
module = static_cast<ModuleType&>(*this);
48 if (!module.input_mailboxes_) {
52 using PrimaryType = std::tuple_element_t<PrimaryIdx, InputTypesTuple>;
53 auto& primary_mailbox = std::get<PrimaryIdx>(*module.input_mailboxes_);
56 return primary_mailbox.template receive<PrimaryType>();
70 template<std::
size_t PrimaryIdx,
typename PrimaryMsgType>
72 auto&
module = static_cast<ModuleType&>(*this);
74 if (!module.input_mailboxes_) {
79 InputTypesTuple all_inputs{};
82 std::get<PrimaryIdx>(all_inputs) = primary_msg.payload;
86 bool all_synced = sync_secondary_inputs<PrimaryIdx>(primary_msg.header.timestamp, all_inputs);
104 template<
typename O = OutputData,
105 typename = std::enable_if_t<!std::is_void_v<O>>>
107 call_multi_input_process_impl(inputs, output, std::make_index_sequence<InputCount>{});
119 call_multi_input_multi_output_process_impl(inputs, outputs,
120 std::make_index_sequence<InputCount>{},
121 std::make_index_sequence<std::tuple_size_v<OutputTypesTuple>>{});
128 template<std::
size_t PrimaryIdx>
129 bool sync_secondary_inputs(uint64_t primary_timestamp, InputTypesTuple& all_inputs) {
130 return sync_secondary_inputs_impl<PrimaryIdx>(primary_timestamp, all_inputs,
131 std::make_index_sequence<InputCount>{});
137 template<std::size_t PrimaryIdx, std::size_t... Is>
138 bool sync_secondary_inputs_impl(uint64_t primary_timestamp, InputTypesTuple& all_inputs,
139 std::index_sequence<Is...>) {
141 bool all_success =
true;
145 (all_success = sync_input_at_index<Is>(primary_timestamp, all_inputs) && all_success) :
157 template<std::
size_t Index>
158 bool sync_input_at_index(uint64_t primary_timestamp, InputTypesTuple& all_inputs) {
159 auto&
module = static_cast<ModuleType&>(*this);
160 using InputType = std::tuple_element_t<Index, InputTypesTuple>;
161 auto& mailbox = std::get<Index>(*module.input_mailboxes_);
164 auto result = mailbox.template getData<InputType>(
166 module.config_.sync_tolerance(),
170 if (!result.has_value()) {
172 module.mark_input_invalid(Index);
181 module.update_input_metadata(Index, result.value(), true);
184 std::get<Index>(all_inputs) = result->payload;
192 template<std::size_t... Is,
typename O = OutputData,
193 typename = std::enable_if_t<!std::is_void_v<O>>>
194 void call_multi_input_process_impl(
const InputTypesTuple& inputs, O& output, std::index_sequence<Is...>) {
195 auto&
module = static_cast<ModuleType&>(*this);
198 using Base = MultiInputProcessorBase<InputTypesTuple, OutputData, InputCount>;
199 static_cast<Base*
>(&module)->process(std::get<Is>(inputs)..., output);
205 template<std::size_t... InputIs, std::size_t... OutputIs>
206 void call_multi_input_multi_output_process_impl(
const InputTypesTuple& inputs, OutputTypesTuple& outputs,
207 std::index_sequence<InputIs...>,
208 std::index_sequence<OutputIs...>) {
209 auto&
module = static_cast<ModuleType&>(*this);
212 using Base = MultiInputProcessorBase<InputTypesTuple, OutputTypesTuple, InputCount>;
213 static_cast<Base*
>(&module)->process(std::get<InputIs>(inputs)..., std::get<OutputIs>(outputs)...);