19#ifndef HEDGEHOG_CX_METAFUNCTIONS_H_
20#define HEDGEHOG_CX_METAFUNCTIONS_H_
26#include "../../src/api/task/abstract_task.h"
27#include "../../src/api/state_manager/state_manager.h"
28#include "../../src/api/graph/graph.h"
42template<
size_t Separator,
class AllTypes>
43struct HelperAbstractTaskType;
47template<
size_t Separator,
class ...AllTypes>
48struct HelperAbstractTaskType<Separator, std::tuple<AllTypes...>> {
54template<
size_t Separator,
class AllTypes>
55struct HelperStateManagerType;
59template<
size_t Separator,
class ...AllTypes>
60struct HelperStateManagerType<Separator, std::tuple<AllTypes...>> {
67template<
size_t Separator,
class AllTypes>
68struct GraphTypeDeducer;
73template<
size_t Separator,
class ...AllTypes>
74struct GraphTypeDeducer<Separator, std::tuple<AllTypes...>> {
76 using type =
hh::Graph<Separator, AllTypes...>;
86template<
class... First,
class... Second>
87struct CatTuples<std::tuple<First...>, std::tuple<Second...>> {
89 using type = std::tuple<First..., Second...>;
95class UniqueVariantFromTuple;
99template<
class ...AllTypes>
100class UniqueVariantFromTuple<std::tuple<AllTypes...>> {
108 template<
class Current,
class ... Others>
109 static auto makeUniqueTuple() {
110 if constexpr (
sizeof...(Others) == 0) {
111 return std::tuple<Current *>{};
113 if constexpr (std::disjunction_v<std::is_same<Current, Others>...>) {
114 return makeUniqueTuple<Others...>();
116 return std::tuple_cat(std::tuple<Current *>{}, makeUniqueTuple<Others...>());
124 template<
class ... TupleType>
125 static auto makeVariant(std::tuple<TupleType...>) {
126 return (std::variant<std::remove_pointer_t<TupleType>...>());
131 using type =
decltype(makeUniqueTuple<AllTypes...>());
133 using variant_type =
decltype(makeVariant(std::declval<type>()));
138 using type =
typename MakeUnique::variant_type;
144using UniqueVariantFromTuple_t =
typename internals::UniqueVariantFromTuple<Tuple>::type;
147template<
size_t Separator,
class AllTypes>
148using StateManager_t =
typename tool::internals::HelperStateManagerType<Separator, AllTypes>::type;
151template<
size_t Separator,
class AllTypes>
152using AbstractTask_t =
typename tool::internals::HelperAbstractTaskType<Separator, AllTypes>::type;
155template<
size_t Separator,
class AllTypes>
156using Graph_t =
typename tool::internals::GraphTypeDeducer<Separator, AllTypes>::type;
159template<
class First,
class Second>
160using CatTuples_t =
typename tool::internals::CatTuples<First, Second>::type;
Hedgehog graph abstraction.
Base node for computation.