From 3d6b01a5270a24b903b40770a82977bf136e0449 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 24 May 2023 07:49:09 +0800 Subject: [PATCH] 1 --- server/robotserver/coroutine.cc | 12 +++++++---- server/robotserver/coroutine.h | 35 +++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/server/robotserver/coroutine.cc b/server/robotserver/coroutine.cc index c98f1e60..e5f7cb46 100644 --- a/server/robotserver/coroutine.cc +++ b/server/robotserver/coroutine.cc @@ -56,14 +56,18 @@ void Coroutine::CoYield() (*sink_)(); } -void Coroutine::CoAwait(Awaiter& awaiter) +std::shared_ptr Coroutine::CoAwait(Awaiter& awaiter) { - + return CoAwait(&awaiter); } -void Coroutine::CoAwait(Awaiter* awaiter) +std::shared_ptr Coroutine::CoAwait(Awaiter* awaiter) { - + CoSuspend(); + while (!awaiter->Done()) { + CoYield(); + } + return awaiter->GetResult(); } void Coroutine::Attach() diff --git a/server/robotserver/coroutine.h b/server/robotserver/coroutine.h index da0cc9ea..1c936436 100644 --- a/server/robotserver/coroutine.h +++ b/server/robotserver/coroutine.h @@ -2,9 +2,40 @@ #include +namespace a8 +{ + class Results + { + public: + + Results(std::vector results):results_(std::move(results)) {}; + + template + T Get(size_t index) const { return std::any_cast(results_.at(index));}; + + private: + std::vector results_; + }; +} + class Awaiter { + public: + virtual std::shared_ptr GetResult() + { + return results_; + } + + virtual bool Done() + { + return done_; + } + + private: + bool done_ = false; + std::shared_ptr results_; + std::function cb_; }; class Promise : public Awaiter @@ -20,8 +51,8 @@ class Coroutine : public Awaiter, public std::enable_shared_from_this void CoSuspend(); void CoResume(); void CoYield(); - void CoAwait(Awaiter& awaiter); - void CoAwait(Awaiter* awaiter); + std::shared_ptr CoAwait(Awaiter& awaiter); + std::shared_ptr CoAwait(Awaiter* awaiter); private: Coroutine(std::function cb);