diff --git a/ostd/coroutine.hh b/ostd/coroutine.hh index d30aa4f..ff4863e 100644 --- a/ostd/coroutine.hh +++ b/ostd/coroutine.hh @@ -35,15 +35,10 @@ namespace detail { struct coro_types { using yield_type = std::tuple; - template - static yield_type get_impl( - std::tuple...> &args, std::index_sequence - ) { - return std::make_tuple(std::forward(*std::get(args))...); - } - static yield_type get(std::tuple...> &args) { - return get_impl(args, std::index_sequence_for{}); + return std::apply([](auto ...args) { + return std::make_tuple(std::forward(*args)...); + }, args); } }; @@ -138,8 +133,7 @@ namespace detail { template coro_stor(F &&func): p_func(std::forward(func)) {} - template - coro_args get_args(std::index_sequence) { + coro_args get_args() { return coro_types::get(p_args); } @@ -151,12 +145,12 @@ namespace detail { return std::forward(coro_rtype::get(p_result)); } - template - void call_helper(Y &&yielder, std::index_sequence) { - coro_rtype::store(p_result, std::forward(p_func( - std::move(yielder), - std::forward(*std::get(p_args))... - ))); + void call_helper(Y &&yielder) { + std::apply([this, yielder = std::move(yielder)](auto ...args) { + coro_rtype::store(p_result, std::forward(p_func( + std::move(yielder), std::forward(*args)... + ))); + }, p_args); } void swap(coro_stor &other) { @@ -179,17 +173,14 @@ namespace detail { template coro_stor(F &&func): p_func(std::forward(func)) {} - template - void get_args(std::index_sequence) {} - + void get_args() {} void set_args() {} R get_result() { return std::forward(coro_rtype::get(p_result)); } - template - void call_helper(Y &&yielder, std::index_sequence) { + void call_helper(Y &&yielder) { coro_rtype::store( p_result, std::forward(p_func(std::move(yielder))) ); @@ -209,8 +200,7 @@ namespace detail { template coro_stor(F &&func): p_func(std::forward(func)) {} - template - coro_args get_args(std::index_sequence) { + coro_args get_args() { return coro_types::get(p_args); } @@ -220,9 +210,10 @@ namespace detail { void get_result() {} - template - void call_helper(Y &&yielder, std::index_sequence) { - p_func(std::move(yielder), std::forward(*std::get(p_args))...); + void call_helper(Y &&yielder) { + std::apply([this, yielder = std::move(yielder)](auto ...args) { + p_func(std::move(yielder), std::forward(*args)...); + }, p_args); } void swap(coro_stor &other) { @@ -241,15 +232,12 @@ namespace detail { template coro_stor(F &&func): p_func(std::forward(func)) {} - template - void get_args(std::index_sequence) {} - + void get_args() {} void set_args() {} void get_result() {} - template - void call_helper(Y &&yielder, std::index_sequence) { + void call_helper(Y &&yielder) { p_func(std::move(yielder)); } @@ -277,13 +265,13 @@ private: p_coro.p_stor.p_result, std::move(ret) ); p_coro.yield_jump(); - return p_coro.p_stor.get_args(std::index_sequence_for{}); + return p_coro.p_stor.get_args(); } detail::coro_args operator()(RR const &ret) { detail::coro_rtype::store(p_coro.p_stor.p_result, ret); p_coro.yield_jump(); - return p_coro.p_stor.get_args(std::index_sequence_for{}); + return p_coro.p_stor.get_args(); } private: @@ -297,7 +285,7 @@ private: detail::coro_args operator()(RR &ret) { detail::coro_rtype::store(p_coro.p_stor.p_result, ret); p_coro.yield_jump(); - return p_coro.p_stor.get_args(std::index_sequence_for{}); + return p_coro.p_stor.get_args(); } private: @@ -313,7 +301,7 @@ private: p_coro.p_stor.p_result, std::move(ret) ); p_coro.yield_jump(); - return p_coro.p_stor.get_args(std::index_sequence_for{}); + return p_coro.p_stor.get_args(); } private: @@ -326,7 +314,7 @@ private: detail::coro_args operator()() { p_coro.yield_jump(); - return p_coro.p_stor.get_args(std::index_sequence_for{}); + return p_coro.p_stor.get_args(); } private: @@ -399,7 +387,7 @@ public: private: void resume_call() { - p_stor.call_helper(yield_type{*this}, std::index_sequence_for{}); + p_stor.call_helper(yield_type{*this}); } detail::coro_stor p_stor;