diff --git a/include/continuable/continuable-base.hpp b/include/continuable/continuable-base.hpp index 1e5c987..b1f469b 100644 --- a/include/continuable/continuable-base.hpp +++ b/include/continuable/continuable-base.hpp @@ -811,10 +811,14 @@ constexpr auto make_continuable(Continuation&& continuation) { "use make_continuable(...). Continuables with an exact " "signature may be created through make_continuable."); - // TODO + using hint_t = detail::traits::identity; + using continuation_t = + detail::base::proxy_continuable>; + return detail::base::attorney::create_from( - std::forward(continuation), - detail::hints::from_explicit(detail::traits::identity{}), + continuation_t{std::forward(continuation)}, + typename detail::hints::from_explicit::type{}, detail::util::ownership{}); } diff --git a/include/continuable/detail/core/annotation.hpp b/include/continuable/detail/core/annotation.hpp index 03cb20c..88e1924 100644 --- a/include/continuable/detail/core/annotation.hpp +++ b/include/continuable/detail/core/annotation.hpp @@ -56,16 +56,14 @@ namespace hints { /// from an argument pack as specified by make_continuable. /// /// This is the overload taking an arbitrary amount of args +template +struct from_explicit; template -constexpr auto from_explicit(traits::identity hint) { - return hint; -} -/// \copybrief from_explicit -/// -/// This is the overload taking a void arg. -constexpr auto from_explicit(traits::identity /*hint*/) { - return traits::identity<>{}; -} +struct from_explicit> + : std::common_type> {}; +template <> +struct from_explicit> + : std::common_type> {}; } // namespace hints } // namespace detail } // namespace cti diff --git a/include/continuable/detail/core/base.hpp b/include/continuable/detail/core/base.hpp index ad73dea..535a14a 100644 --- a/include/continuable/detail/core/base.hpp +++ b/include/continuable/detail/core/base.hpp @@ -119,6 +119,33 @@ struct ready_continuation<> { } }; +template +struct proxy_continuable; +template +struct proxy_continuable, Continuation> + : Continuation { + + explicit proxy_continuable(Continuation continuation) + : Continuation(std::move(continuation)) { + } + ~proxy_continuable() = default; + proxy_continuable(proxy_continuable&&) = default; + proxy_continuable(proxy_continuable const&) = delete; + proxy_continuable& operator=(proxy_continuable&&) = default; + proxy_continuable& operator=(proxy_continuable const&) = delete; + + using Continuation::Continuation; + using Continuation::operator(); + + bool operator()(is_ready_arg_t) const noexcept { + return false; + } + + std::tuple operator()(get_arg_t) && { + util::unreachable(); + } +}; + struct attorney { /// Creates a continuable_base from the given continuation, annotation /// and ownership.