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.