21#ifndef HEDGEHOG_TRAITS_H
22#define HEDGEHOG_TRAITS_H
28#include "../core/implementors/concrete_implementor/default_multi_senders.h"
35#ifndef DOXYGEN_SHOULD_SKIP_THIS
37namespace abstraction {
40template<
class ...Inputs>
41class TaskInputsManagementAbstraction;
44template<
class ...Inputs>
45class GraphInputsManagementAbstraction;
48template<
class ...Outputs>
49class GraphOutputsManagementAbstraction;
52template<
class ...Outputs>
53class TaskOutputsManagementAbstraction;
56template<
class ...Inputs>
57class ExecutionPipelineInputsManagementAbstraction;
60template<
class ...Outputs>
61class ExecutionPipelineOutputsManagementAbstraction;
65namespace implementor {
68template<
class ...Inputs>
69class DefaultMultiExecutes;
73template<
class ...Inputs>
74class MultiQueueReceivers;
82template<
class ...Inputs>
86template<
class ...Inputs>
90template<
class ...Inputs>
91class MultiSwitchRules;
94template<
class ...Outputs>
98template<
class ...Outputs>
99class TaskMultiSenders;
102template<
class ...Outputs>
103class StateMultiSenders;
114template<
class Inputs>
115struct TaskInputsManagementAbstractionTypeDeducer;
119template<
class ...Inputs>
120struct TaskInputsManagementAbstractionTypeDeducer<std::tuple<Inputs...>> {
121 using type = core::abstraction::TaskInputsManagementAbstraction<
Inputs...>;
125template<
class TupleInputs>
126using TaskInputsManagementAbstractionTypeDeducer_t =
127 typename TaskInputsManagementAbstractionTypeDeducer<TupleInputs>::type;
131template<
class Outputs>
132struct TaskOutputsManagementAbstractionTypeDeducer;
136template<
class ...Outputs>
137struct TaskOutputsManagementAbstractionTypeDeducer<std::tuple<Outputs...>> {
138 using type = core::abstraction::TaskOutputsManagementAbstraction<
Outputs...>;
142template<
class TupleOutputs>
143using TaskOutputsManagementAbstractionTypeDeducer_t =
144 typename TaskOutputsManagementAbstractionTypeDeducer<TupleOutputs>::type;
148template<
class Inputs>
149struct GraphInputsManagementAbstractionTypeDeducer;
153template<
class ...Inputs>
154struct GraphInputsManagementAbstractionTypeDeducer<std::tuple<Inputs...>> {
155 using type = core::abstraction::GraphInputsManagementAbstraction<
Inputs...>;
159template<
class TupleInputs>
160using GraphInputsManagementAbstractionTypeDeducer_t =
161 typename GraphInputsManagementAbstractionTypeDeducer<TupleInputs>::type;
165template<
class Outputs>
166struct GraphOutputsManagementAbstractionTypeDeducer;
170template<
class ...Outputs>
171struct GraphOutputsManagementAbstractionTypeDeducer<std::tuple<Outputs...>> {
172 using type = core::abstraction::GraphOutputsManagementAbstraction<
Outputs...>;
176template<
class TupleOutputs>
177using GraphOutputsManagementAbstractionTypeDeducer_t =
178 typename GraphOutputsManagementAbstractionTypeDeducer<TupleOutputs>::type;
182template<
class Inputs>
183struct ExecutionPipelineInputsManagementAbstractionTypeDeducer;
187template<
class ...Inputs>
188struct ExecutionPipelineInputsManagementAbstractionTypeDeducer<std::tuple<Inputs...>> {
189 using type = core::abstraction::ExecutionPipelineInputsManagementAbstraction<
Inputs...>;
193template<
class TupleInputs>
194using ExecutionPipelineInputsManagementAbstractionTypeDeducer_t =
195 typename ExecutionPipelineInputsManagementAbstractionTypeDeducer<TupleInputs>::type;
199template<
class Outputs>
200struct ExecutionPipelineOutputsManagementAbstractionTypeDeducer;
204template<
class ...Outputs>
205struct ExecutionPipelineOutputsManagementAbstractionTypeDeducer<std::tuple<Outputs...>> {
206 using type = core::abstraction::ExecutionPipelineOutputsManagementAbstraction<
Outputs...>;
210template<
class TupleOutputs>
211using ExecutionPipelineOutputsManagementAbstractionTypeDeducer_t =
212 typename ExecutionPipelineOutputsManagementAbstractionTypeDeducer<TupleOutputs>::type;
218template<
class Inputs>
219struct DefaultMultiExecutesTypeDeducer;
223template<
class ...Inputs>
224struct DefaultMultiExecutesTypeDeducer<std::tuple<Inputs...>> {
225 using type = core::implementor::DefaultMultiExecutes<
Inputs...>;
230template<
class TupleInputs>
231using DefaultMultiExecutesTypeDeducer_t =
typename DefaultMultiExecutesTypeDeducer<TupleInputs>::type;
236template<
size_t Separator,
class ...AllTypes>
237using DME = DefaultMultiExecutesTypeDeducer_t<
hh::tool::Inputs<Separator, AllTypes...>>;
241template<
class Outputs>
242struct MultiDefaultSendersTypeDeducer;
246template<
class ...Outputs>
247struct MultiDefaultSendersTypeDeducer<std::tuple<Outputs...>> {
253template<
class TupleOutputs>
254using MultiDefaultSendersTypeDeducer_t =
typename MultiDefaultSendersTypeDeducer<TupleOutputs>::type;
259template<
size_t Separator,
class ...AllTypes>
260using MDS = MultiDefaultSendersTypeDeducer_t<
hh::tool::Outputs<Separator, AllTypes...>>;
264template<
class Inputs>
265struct MultiQueueReceiversTypeDeducer;
269template<
class ...Inputs>
270struct MultiQueueReceiversTypeDeducer<std::tuple<Inputs...>> {
271 using type = core::implementor::MultiQueueReceivers<
Inputs...>;
276template<
class TupleInputs>
277using MultiQueueReceiversTypeDeducer_t =
typename MultiQueueReceiversTypeDeducer<TupleInputs>::type;
282template<
size_t Separator,
class ...AllTypes>
283using MQR = MultiQueueReceiversTypeDeducer_t<
hh::tool::Inputs<Separator, AllTypes...>>;
288template<
class Inputs>
289struct BehaviorMultiExecuteTypeDeducer;
293template<
class ...Inputs>
294struct BehaviorMultiExecuteTypeDeducer<std::tuple<Inputs...>> {
using type = behavior::MultiExecute<
Inputs...>; };
297template<
class TupleInputs>
298using BehaviorMultiExecuteTypeDeducer_t =
typename BehaviorMultiExecuteTypeDeducer<TupleInputs>::type;
302template<
class Inputs>
303struct BehaviorMultiReceiversTypeDeducer;
307template<
class ...Inputs>
308struct BehaviorMultiReceiversTypeDeducer<std::tuple<Inputs...>> {
using type = behavior::MultiReceivers<
Inputs...>; };
311template<
class TupleInputs>
312using BehaviorMultiReceiversTypeDeducer_t =
typename BehaviorMultiReceiversTypeDeducer<TupleInputs>::type;
316template<
class Inputs>
317struct BehaviorMultiSwitchRulesTypeDeducer;
321template<
class ...Inputs>
322struct BehaviorMultiSwitchRulesTypeDeducer<std::tuple<Inputs...>> {
using type = behavior::MultiSwitchRules<
Inputs...>; };
325template<
class TupleInputs>
326using BehaviorMultiSwitchRulesTypeDeducer_t =
typename BehaviorMultiSwitchRulesTypeDeducer<TupleInputs>::type;
330template<
class Outputs>
331struct BehaviorMultiSenderTypeDeducer;
335template<
class ...Outputs>
336struct BehaviorMultiSenderTypeDeducer<std::tuple<Outputs...>> {
using type = behavior::MultiSenders<
Outputs...>; };
339template<
class TupleOutputs>
340using BehaviorMultiSendersTypeDeducer_t =
typename BehaviorMultiSenderTypeDeducer<TupleOutputs>::type;
344template<
class Outputs>
345struct BehaviorTaskMultiSenderTypeDeducer;
349template<
class ...Outputs>
350struct BehaviorTaskMultiSenderTypeDeducer<std::tuple<Outputs...>> {
using type = behavior::TaskMultiSenders<
Outputs...>; };
353template<
class TupleOutputs>
354using BehaviorTaskMultiSendersTypeDeducer_t =
typename BehaviorTaskMultiSenderTypeDeducer<TupleOutputs>::type;
358template<
class Outputs>
359struct BehaviorStateMultiSenderTypeDeducer;
363template<
class ...Outputs>
364struct BehaviorStateMultiSenderTypeDeducer<std::tuple<Outputs...>> {
using type = behavior::StateMultiSenders<
Outputs...>; };
367template<
class TupleOutputs>
368using BehaviorStateMultiSendersTypeDeducer_t =
typename BehaviorStateMultiSenderTypeDeducer<TupleOutputs>::type;
typename internals::Splitter< delta, Types... >::Inputs Inputs
Helper getting the input types from a list of template types (variadic)
typename internals::Splitter< delta, Types... >::Outputs Outputs
Helper getting the output types from a list of template types (variadic)
Default implementors for the sender abstraction, used by tasks or state managers.