21#ifndef HEDGEHOG_CONCEPTS_H 
   22#define HEDGEHOG_CONCEPTS_H 
   32#ifndef DOXYGEN_SHOULD_SKIP_THIS 
   37namespace abstraction {
 
   41class NotifierAbstraction;
 
   47class ReceiverAbstraction;
 
   51class SenderAbstraction;
 
   55namespace implementor {
 
   59class ImplementorNotifier;
 
   63class ImplementorReceiver;
 
   67class ImplementorExecute;
 
   71class ImplementorSender;
 
   85template<
class T, 
class ...Ts>
 
   91template<
class T, 
class Tuple>
 
   97template<
class I, 
class Is>
 
  104template<
class O, 
class ...Os>
 
  111template<
class T, 
class ...Os>
 
  113(std::is_base_of_v<core::abstraction::SenderAbstraction<Os>, T> && ...) &&
 
  114    std::is_base_of_v<core::abstraction::NotifierAbstraction, T>;
 
  120std::is_base_of_v<ManagedMemory, T> 
 
  121    && std::is_default_constructible_v<T>; 
 
  129template<
class CoreNode, 
class TupleCoreInputs, 
class TupleGraphInputs>
 
  131std::is_base_of_v<core::abstraction::NodeAbstraction, CoreNode> 
 
  132    && std::tuple_size_v<Intersect_t<TupleCoreInputs, TupleGraphInputs>> != 0; 
 
  141template<
class CoreNode, 
class InputType, 
class TupleCoreInputs, 
class TupleGraphInputs>
 
  143std::is_base_of_v<core::abstraction::NodeAbstraction, CoreNode> 
 
  152template<
class CoreNode, 
class TupleCoreOutputs, 
class TupleGraphOutputs>
 
  154std::is_base_of_v<core::abstraction::NodeAbstraction, CoreNode> 
 
  156                                     TupleGraphOutputs>> != 0;  
 
  165template<
class CoreNode, 
class OutputType, 
class TupleCoreOutputs, 
class TupleGraphOutputs>
 
  167std::is_base_of_v<core::abstraction::NodeAbstraction, CoreNode> 
 
  174template<
class NodeType>
 
  176std::is_base_of_v<behavior::Node, NodeType> 
 
  177    && 
requires(NodeType *node){
 
  178      typename NodeType::outputs_t; 
 
  179      std::is_base_of_v<behavior::MultiSenders<typename NodeType::outputs_t>, NodeType
 
  185template<
class NodeType>
 
  187std::is_base_of_v<behavior::Node, NodeType> 
 
  188    && 
requires(NodeType *node){
 
  189      typename NodeType::inputs_t; 
 
  190      std::is_base_of_v<behavior::MultiReceivers<typename NodeType::inputs_t>, NodeType
 
  197template<
class NodeType, 
class OutputType>
 
  201                              typename NodeType::outputs_t>; 
 
  206template<
class NodeType, 
class InputType>
 
  210                              typename NodeType::inputs_t>; 
 
  215template<
class NodeType, 
class TupleGraphInputs>
 
  218    && std::tuple_size_v<
 
  219        Intersect_t<typename NodeType::inputs_t, TupleGraphInputs>
 
  226template<
class NodeType, 
class InputType, 
class TupleGraphInputs>
 
  234template<
class NodeType, 
class TupleGraphOutputs>
 
  237    && std::tuple_size_v<
 
  238        Intersect_t<typename NodeType::outputs_t, TupleGraphOutputs>
 
  245template<
class NodeType, 
class OutputType, 
class TupleGraphOutputs>
 
  252template<
class NodeType>
 
  255  std::is_same_v<
decltype(n->copy()), std::shared_ptr<NodeType>>; 
 
  262template<
class MultiReceiver, 
class ...InputTypes>
 
  264(std::is_base_of_v<core::implementor::ImplementorReceiver<InputTypes>, MultiReceiver>, ...);
 
  270template<
class MultiSender, 
class ...OutputTypes>
 
  272(std::is_base_of_v<core::implementor::ImplementorSender<OutputTypes>, MultiSender>, ...);
 
  278template<
class MultiExecute, 
class ...InputTypes>
 
  280(std::is_base_of_v<core::implementor::ImplementorExecute<InputTypes>, MultiExecute>, ...);
 
typename internals::Intersect< Tuple1, Tuple2 >::type Intersect_t
Helper getting the intersection of types between two type tuples.
constexpr bool isContainedIn_v
Helper testing if a type T is in variadic Ts.
Concept verifying that a type is in a variadic.
Concept verifying that a type is in a tuple.
Test if an input type is in the list of input types (tuple)
Test if an output type is in the list of output types (variadic)
Test if a type inherit from core::abstraction::SenderAbstraction for all Os and core::abstraction::No...
Test if a type T is manageable in a Memory manager (derives from ManagedMemory and is default constru...
Test if a core can be input of a graph (derives from core::abstraction::NodeAbstraction and shares at...
Test if a core can be input of a graph for a type (derives from core::abstraction::NodeAbstraction an...
Test if a core can be output of a graph (derives from core::abstraction::NodeAbstraction and shares a...
Test if a core can be output of a graph for a type (derives from core::abstraction::NodeAbstraction a...
Test if a node is a sender node.
Test if a node is a receiver node.
Test if a node is a sender for a type.
Test if a node is a receiver for a type.
Test if a node can be input of a graph.
Test if a node can be input of a graph for a type.
Test if a node can be output of a graph.
Test if a node can be output of a graph for a type.
Test if a node is copyable (copy method is callable and has a the right return type)
Test if a type is a valid concrete implementation of the core::implementor::ImplementorReceiver for t...
Test if a type is a valid concrete implementation of the core::implementor::ImplementorSender for the...
Test if a type is a valid concrete implementation of the core::implementor::ImplementorExecute for th...