From 54fb32ae569740576ec2d078a3d6b24993b2429c Mon Sep 17 00:00:00 2001 From: Denis Blank Date: Tue, 3 Oct 2017 20:26:32 +0200 Subject: [PATCH] Fix the remaining promisify composition GCC errors --- include/continuable/detail/composition.hpp | 112 +++++++++++---------- 1 file changed, 59 insertions(+), 53 deletions(-) diff --git a/include/continuable/detail/composition.hpp b/include/continuable/detail/composition.hpp index d78ae22..12432b8 100644 --- a/include/continuable/detail/composition.hpp +++ b/include/continuable/detail/composition.hpp @@ -132,39 +132,6 @@ class all_result_submitter : public std::enable_shared_from_this< std::once_flag flag_; std::tuple result_; - template - struct partial_callback { - std::shared_ptr me_; - - template - void operator()(PartialArgs&&... args) { - me_->resolve(traits::size_constant{}, traits::size_constant{}, - std::forward(args)...); - } - - template - void set_value(PartialArgs&&... args) { - (*this)(std::forward(args)...); - } - - void set_exception(types::error_type error) { - (*this)(types::dispatch_error_tag{}, std::move(error)); - } - }; - -public: - explicit all_result_submitter(T callback) - : callback_(std::move(callback)), left_(Submissions) { - } - - /// Creates a submitter which submits it's result into the tuple - template - auto create_callback(traits::size_constant /*from*/, - traits::size_constant /*to*/) { - return partial_callback{this->shared_from_this()}; - } - -private: template void resolve(traits::size_constant from, traits::size_constant, PartialArgs&&... args) { @@ -208,33 +175,74 @@ private: invoke(); } } + + template + struct partial_all_callback { + std::shared_ptr me_; + + template + void operator()(PartialArgs&&... args) { + me_->resolve(traits::size_constant{}, traits::size_constant{}, + std::forward(args)...); + } + + template + void set_value(PartialArgs&&... args) { + (*this)(std::forward(args)...); + } + + void set_exception(types::error_type error) { + (*this)(types::dispatch_error_tag{}, std::move(error)); + } + }; + +public: + explicit all_result_submitter(T callback) + : callback_(std::move(callback)), left_(Submissions) { + } + + /// Creates a submitter which submits it's result into the tuple + template + auto create_callback(traits::size_constant /*from*/, + traits::size_constant /*to*/) { + return partial_all_callback{this->shared_from_this()}; + } }; /// Invokes the callback with the first arriving result -template -class any_result_submitter; -template -class any_result_submitter, T> - : public std::enable_shared_from_this< - any_result_submitter, T>>, +template +class any_result_submitter + : public std::enable_shared_from_this>, public util::non_movable { T callback_; std::once_flag flag_; + struct any_callback { + std::shared_ptr me_; + + template + void operator()(PartialArgs&&... args) { + me_->invoke(std::forward(args)...); + } + + template + void set_value(PartialArgs&&... args) { + (*this)(std::forward(args)...); + } + + void set_exception(types::error_type error) { + (*this)(types::dispatch_error_tag{}, std::move(error)); + } + }; + public: explicit any_result_submitter(T callback) : callback_(std::move(callback)) { } /// Creates a submitter which submits it's result to the callback auto create_callback() { - auto callback = [me = this->shared_from_this()](auto&&... args) { - me->invoke(std::forward(args)...); - }; - - return promise_base, - hints::signature_hint_tag>( - std::move(callback)); + return any_callback{this->shared_from_this()}; } private: @@ -379,10 +387,10 @@ auto finalize_composition( } /// Creates a submitter that continues `any` chains -template -auto make_any_result_submitter(Signature&& /*signature*/, Callback&& callback) { - return std::make_shared, std::decay_t>>( +template +auto make_any_result_submitter(Callback&& callback) { + return std::make_shared< + detail::any_result_submitter>>( std::forward(callback)); } @@ -433,15 +441,13 @@ auto finalize_composition( base::hint_of(traits::identity_of(args))...); }); - using Signature = decltype(signature); - return base::attorney::create( [composition = std::move(composition)](auto&& callback) mutable { // Create the submitter which calls the given callback once at the first // callback invocation. auto submitter = make_any_result_submitter( - Signature{}, std::forward(callback)); + std::forward(callback)); traits::static_for_each_in(std::move(composition), [&](auto&& entry) mutable {