mirror of
https://github.com/Naios/continuable.git
synced 2025-12-08 01:36:46 +08:00
Fix the remaining promisify composition GCC errors
This commit is contained in:
parent
1471e1f610
commit
54fb32ae56
@ -132,39 +132,6 @@ class all_result_submitter : public std::enable_shared_from_this<
|
||||
std::once_flag flag_;
|
||||
std::tuple<Args...> result_;
|
||||
|
||||
template <std::size_t From, std::size_t To>
|
||||
struct partial_callback {
|
||||
std::shared_ptr<all_result_submitter> me_;
|
||||
|
||||
template <typename... PartialArgs>
|
||||
void operator()(PartialArgs&&... args) {
|
||||
me_->resolve(traits::size_constant<From>{}, traits::size_constant<To>{},
|
||||
std::forward<PartialArgs>(args)...);
|
||||
}
|
||||
|
||||
template <typename... PartialArgs>
|
||||
void set_value(PartialArgs&&... args) {
|
||||
(*this)(std::forward<PartialArgs>(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 <std::size_t From, std::size_t To>
|
||||
auto create_callback(traits::size_constant<From> /*from*/,
|
||||
traits::size_constant<To> /*to*/) {
|
||||
return partial_callback<From, To>{this->shared_from_this()};
|
||||
}
|
||||
|
||||
private:
|
||||
template <std::size_t From, std::size_t To, typename... PartialArgs>
|
||||
void resolve(traits::size_constant<From> from, traits::size_constant<To>,
|
||||
PartialArgs&&... args) {
|
||||
@ -208,33 +175,74 @@ private:
|
||||
invoke();
|
||||
}
|
||||
}
|
||||
|
||||
template <std::size_t From, std::size_t To>
|
||||
struct partial_all_callback {
|
||||
std::shared_ptr<all_result_submitter> me_;
|
||||
|
||||
template <typename... PartialArgs>
|
||||
void operator()(PartialArgs&&... args) {
|
||||
me_->resolve(traits::size_constant<From>{}, traits::size_constant<To>{},
|
||||
std::forward<PartialArgs>(args)...);
|
||||
}
|
||||
|
||||
template <typename... PartialArgs>
|
||||
void set_value(PartialArgs&&... args) {
|
||||
(*this)(std::forward<PartialArgs>(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 <std::size_t From, std::size_t To>
|
||||
auto create_callback(traits::size_constant<From> /*from*/,
|
||||
traits::size_constant<To> /*to*/) {
|
||||
return partial_all_callback<From, To>{this->shared_from_this()};
|
||||
}
|
||||
};
|
||||
|
||||
/// Invokes the callback with the first arriving result
|
||||
template <typename Signature, typename T>
|
||||
class any_result_submitter;
|
||||
template <typename... Args, typename T>
|
||||
class any_result_submitter<hints::signature_hint_tag<Args...>, T>
|
||||
: public std::enable_shared_from_this<
|
||||
any_result_submitter<hints::signature_hint_tag<Args...>, T>>,
|
||||
template <typename T>
|
||||
class any_result_submitter
|
||||
: public std::enable_shared_from_this<any_result_submitter<T>>,
|
||||
public util::non_movable {
|
||||
|
||||
T callback_;
|
||||
std::once_flag flag_;
|
||||
|
||||
struct any_callback {
|
||||
std::shared_ptr<any_result_submitter> me_;
|
||||
|
||||
template <typename... PartialArgs>
|
||||
void operator()(PartialArgs&&... args) {
|
||||
me_->invoke(std::forward<decltype(args)>(args)...);
|
||||
}
|
||||
|
||||
template <typename... PartialArgs>
|
||||
void set_value(PartialArgs&&... args) {
|
||||
(*this)(std::forward<PartialArgs>(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<decltype(args)>(args)...);
|
||||
};
|
||||
|
||||
return promise_base<std::decay_t<decltype(callback)>,
|
||||
hints::signature_hint_tag<Args...>>(
|
||||
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 <typename Signature, typename Callback>
|
||||
auto make_any_result_submitter(Signature&& /*signature*/, Callback&& callback) {
|
||||
return std::make_shared<detail::any_result_submitter<
|
||||
std::decay_t<Signature>, std::decay_t<decltype(callback)>>>(
|
||||
template <typename Callback>
|
||||
auto make_any_result_submitter(Callback&& callback) {
|
||||
return std::make_shared<
|
||||
detail::any_result_submitter<std::decay_t<decltype(callback)>>>(
|
||||
std::forward<decltype(callback)>(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<decltype(callback)>(callback));
|
||||
std::forward<decltype(callback)>(callback));
|
||||
|
||||
traits::static_for_each_in(std::move(composition),
|
||||
[&](auto&& entry) mutable {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user