#ifndef ALSK_ALSK_EDSL_IMPL_H #define ALSK_ALSK_EDSL_IMPL_H #include #include "../executor/traits.h" #include "../skeleton/utility.h" #include "../impl/impl.h" #include "op/impl/serial.h" #include "op/traits.h" #include "link.h" namespace alsk { namespace edsl { template constexpr auto getSkeleton(Expression) -> BuildSkeletonT; template< template class Executor, typename Context = DefaultContext, typename Expression, std::enable_if_t>>* = nullptr > constexpr auto implement(Expression&& expression) { using Skeleton = decltype(getSkeleton(expression)); auto f = alsk::implement(); std::forward(expression).setup(f.skeleton); return f; } template< template class Executor, typename Context = DefaultContext, typename Expression, std::enable_if_t>>* = nullptr > constexpr auto implement(Expression&& expression) { using Signature = typename std::decay_t::Signature; using FixedSignatures = AutoLinkSerial; auto linkedExpression = link(std::forward(expression)); using LinkedExpression = std::decay_t; return implement(Serial{std::move(linkedExpression)}); } } } #endif