#ifndef ALSK_ALSK_SKELETON_LINK_LINK_H #define ALSK_ALSK_SKELETON_LINK_LINK_H #include #include "args.h" #include "utility.h" #include "../struct/struct.h" namespace alsk { /** * @brief hold the skeleton links */ template class T, typename F, typename... Ts> using L = S; namespace impl { /** * Pack of return types from links */ template struct LinksToReturnTypes; template struct LinksToReturnTypes { using type = tmp::PackCat, typename LinksToReturnTypes::type>; }; template class Skel, typename R, typename... Params, typename... InnerLs, typename... Ls> struct LinksToReturnTypes, Ls...> { using type = tmp::PackCat, typename LinksToReturnTypes::type>; }; template class Skel, std::size_t I, typename... Params, typename... InnerLs, typename... Ls> struct LinksToReturnTypes(Params...), InnerLs...>, Ls...> { using rets = typename LinksToReturnTypes::type; using R = tmp::PackGet; using type = tmp::PackCat, typename LinksToReturnTypes::type>; }; template<> struct LinksToReturnTypes<> { using type = tmp::Pack<>; }; } } #endif