From 4a5136427bdd9d1f7f759b5fb664655553de897d Mon Sep 17 00:00:00 2001 From: Denis Blank Date: Wed, 28 Feb 2018 17:28:41 +0100 Subject: [PATCH] Avoid using SFINAE inside the materializer --- include/continuable/continuable-base.hpp | 25 +++---------------- .../continuable/detail/composition-all.hpp | 4 +-- include/continuable/detail/composition.hpp | 21 ++++++++++++++++ 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/include/continuable/continuable-base.hpp b/include/continuable/continuable-base.hpp index c950c60..384d94f 100644 --- a/include/continuable/continuable-base.hpp +++ b/include/continuable/continuable-base.hpp @@ -115,7 +115,8 @@ using detail::base::is_continuable; /// /// \since 1.0.0 template -class continuable_base { +class continuable_base + : detail::composition::materializer> { /// \cond false template @@ -625,28 +626,8 @@ private: ownership_.release(); } - auto materialize() && - noexcept(std::is_nothrow_move_constructible::value) { - assert_acquired(); - return materializeImpl(std::move(*this)); - } - - template ::value>* = nullptr> - static auto - materializeImpl(continuable_base&& continuable) { - return std::move(continuable); - } - template ::value>* = nullptr> - static auto - materializeImpl(continuable_base&& continuable) { - return detail::composition::finalize_composition(std::move(continuable)); - } - Data&& consume_data() && { + assert_acquired(); release(); return std::move(data_); } diff --git a/include/continuable/detail/composition-all.hpp b/include/continuable/detail/composition-all.hpp index 66049fb..12bf654 100644 --- a/include/continuable/detail/composition-all.hpp +++ b/include/continuable/detail/composition-all.hpp @@ -262,13 +262,13 @@ struct composition_finalizer { }; } - template + /*template static auto finalize_new(Composition&& composition) { return [composition = std::forward(composition)]( auto&& callback) mutable { // TODO }; - } + }*/ }; } // namespace composition } // namespace detail diff --git a/include/continuable/detail/composition.hpp b/include/continuable/detail/composition.hpp index 341c100..b2e8b26 100644 --- a/include/continuable/detail/composition.hpp +++ b/include/continuable/detail/composition.hpp @@ -159,6 +159,27 @@ auto finalize_composition(continuable_base&& continuation) { signature, std::move(ownership)); } +/// A base class from which the continuable may inherit in order to +/// provide a materializer method which will finalize an oustanding strategy. +template +struct materializer { +protected: + constexpr auto&& materialize() && { + return std::move(*static_cast(this)); + } +}; +template +struct materializer< + continuable_base, + std::enable_if_t::value>> { + +protected: + constexpr auto materialize() && { + return finalize_composition( + std::move(*static_cast*>(this))); + } +}; + struct prepare_continuables { util::ownership& ownership_;