1 #pragma once 2 3 namespace std { 4 5 template <typename ret_t, typename... args_t> 6 struct coroutine_traits { 7 using promise_type = typename ret_t::promise_type; 8 }; 9 10 template <class promise_t> 11 struct coroutine_handle { from_addresscoroutine_handle12 static constexpr coroutine_handle from_address(void *addr) noexcept { return {}; }; 13 }; 14 15 } // namespace std 16 17 struct never_suspend { await_readynever_suspend18 bool await_ready() noexcept { return false; } 19 template <typename coro_t> await_suspendnever_suspend20 void await_suspend(coro_t handle) noexcept {} await_resumenever_suspend21 void await_resume() noexcept {} 22 }; 23 24 struct task { 25 struct promise_type { get_return_objecttask::promise_type26 task get_return_object() noexcept { return {}; } initial_suspendtask::promise_type27 never_suspend initial_suspend() noexcept { return {}; } final_suspendtask::promise_type28 never_suspend final_suspend() noexcept { return {}; } return_voidtask::promise_type29 void return_void() {} unhandled_exceptiontask::promise_type30 void unhandled_exception() {} 31 }; 32 }; 33