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.