This commit is contained in:
aozhiwei 2023-05-24 07:49:09 +08:00
parent 10c9ce7c68
commit 3d6b01a527
2 changed files with 41 additions and 6 deletions

View File

@ -56,14 +56,18 @@ void Coroutine::CoYield()
(*sink_)(); (*sink_)();
} }
void Coroutine::CoAwait(Awaiter& awaiter) std::shared_ptr<a8::Results> Coroutine::CoAwait(Awaiter& awaiter)
{ {
return CoAwait(&awaiter);
} }
void Coroutine::CoAwait(Awaiter* awaiter) std::shared_ptr<a8::Results> Coroutine::CoAwait(Awaiter* awaiter)
{ {
CoSuspend();
while (!awaiter->Done()) {
CoYield();
}
return awaiter->GetResult();
} }
void Coroutine::Attach() void Coroutine::Attach()

View File

@ -2,9 +2,40 @@
#include <boost/coroutine2/all.hpp> #include <boost/coroutine2/all.hpp>
namespace a8
{
class Results
{
public:
Results(std::vector<std::any> results):results_(std::move(results)) {};
template <typename T>
T Get(size_t index) const { return std::any_cast<T>(results_.at(index));};
private:
std::vector<std::any> results_;
};
}
class Awaiter class Awaiter
{ {
public:
virtual std::shared_ptr<a8::Results> GetResult()
{
return results_;
}
virtual bool Done()
{
return done_;
}
private:
bool done_ = false;
std::shared_ptr<a8::Results> results_;
std::function<void()> cb_;
}; };
class Promise : public Awaiter class Promise : public Awaiter
@ -20,8 +51,8 @@ class Coroutine : public Awaiter, public std::enable_shared_from_this<Coroutine>
void CoSuspend(); void CoSuspend();
void CoResume(); void CoResume();
void CoYield(); void CoYield();
void CoAwait(Awaiter& awaiter); std::shared_ptr<a8::Results> CoAwait(Awaiter& awaiter);
void CoAwait(Awaiter* awaiter); std::shared_ptr<a8::Results> CoAwait(Awaiter* awaiter);
private: private:
Coroutine(std::function<void(Coroutine*)> cb); Coroutine(std::function<void(Coroutine*)> cb);