重构协程

This commit is contained in:
2026-06-25 11:17:53 +08:00
parent 3de44c150c
commit 818b400318
4 changed files with 108 additions and 58 deletions
+57
View File
@@ -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;
}
}