#pragma once
#include "coctx.h"
#include <functional>
namespace tinyrpc {
    

    class Coroutine {
        friend void coFunction(Coroutine* co);
    private:
        Coroutine();
    public:
        // Coroutine(std::size_t stack_size, char* stack_sp);

        Coroutine(std::function<void()> cb, std::size_t stack_size = 1 * 1024 * 1024/* , char* stack_sp */);

        // int getCorID() const {return m_cor_id;}

        void operator()() const {  // 调用 这个协程的回调
            m_callback();
        }

        bool isMainCoroutine() const {return m_stack_sp == nullptr;}

        // coctx* getContext() {return &m_ctx;}
        
        static void yeild(); // 挂起当前的协程
        void resume();  // 恢复 this 的运行

        static Coroutine* getCurrCoroutine();
        static Coroutine* getMainCoroutine();
        ~Coroutine();
    private:
        coctx m_ctx {};  // 这个协程的上下文信息
        // int m_cor_id {0}; // 这个协程的 id
        char* m_stack_sp {nullptr};  // 这个协程的栈空间指针
        std::size_t m_stack_size {0};
        bool m_is_in_cofunc {true}; // 调用 CoFunction 时为true，CoFunction 完成时为false。
        std::function<void()> m_callback {}; // 这个协程的回调
    };


}