#pragma once #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 { }; class Coroutine : public Awaiter, public std::enable_shared_from_this { public: ~Coroutine(); void CoSuspend(); void CoResume(); void CoYield(); std::shared_ptr CoAwait(Awaiter& awaiter); std::shared_ptr CoAwait(Awaiter* awaiter); private: Coroutine(std::function cb); bool Exec(); void Attach(); void Deatch(); void CallEnter(boost::coroutines2::coroutine::push_type& sink); void CallExit(boost::coroutines2::coroutine::push_type& sink); private: list_head co_entry_; list_head exec_entry_; std::shared_ptr hold_self_; std::shared_ptr::pull_type> source_; std::function cb_; boost::coroutines2::coroutine::push_type* sink_ = nullptr; friend class CoMgr; };