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...