重构协程
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
#pragma once
|
||||
#include <concurrencpp/concurrencpp.h>
|
||||
#include <exception>
|
||||
#include <memory>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
namespace Psc::coro {
|
||||
template <typename T>
|
||||
class Result_Completion {
|
||||
public:
|
||||
explicit Result_Completion(std::shared_ptr<concurrencpp::result_promise<T>> promise)
|
||||
: promise_(std::move(promise))
|
||||
{
|
||||
}
|
||||
void operator()(T value)
|
||||
{
|
||||
promise_->set_result(std::move(value));
|
||||
}
|
||||
void set_exception(std::exception_ptr exception)
|
||||
{
|
||||
promise_->set_exception(exception);
|
||||
}
|
||||
private:
|
||||
std::shared_ptr<concurrencpp::result_promise<T>> promise_;
|
||||
};
|
||||
template <>
|
||||
class Result_Completion<void> {
|
||||
public:
|
||||
explicit Result_Completion(std::shared_ptr<concurrencpp::result_promise<void>> promise)
|
||||
: promise_(std::move(promise))
|
||||
{
|
||||
}
|
||||
void operator()()
|
||||
{
|
||||
promise_->set_result();
|
||||
}
|
||||
void set_exception(std::exception_ptr exception)
|
||||
{
|
||||
promise_->set_exception(exception);
|
||||
}
|
||||
private:
|
||||
std::shared_ptr<concurrencpp::result_promise<void>> promise_;
|
||||
};
|
||||
template <typename T, typename Starter>
|
||||
[[nodiscard]] concurrencpp::result<T> callback_result(Starter&& starter)
|
||||
{
|
||||
auto promise = std::make_shared<concurrencpp::result_promise<T>>();
|
||||
auto result = promise->get_result();
|
||||
try {
|
||||
std::forward<Starter>(starter)(Result_Completion<T>{promise});
|
||||
} catch (...) {
|
||||
promise->set_exception(std::current_exception());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user