From 0a0fe2731712bb689313fafadf6b0d5b78c493d4 Mon Sep 17 00:00:00 2001 From: q66 Date: Thu, 16 Mar 2017 23:25:59 +0100 Subject: [PATCH] better generator yield/value storage semantics --- ostd/coroutine.hh | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/ostd/coroutine.hh b/ostd/coroutine.hh index c758530..7bd5e70 100644 --- a/ostd/coroutine.hh +++ b/ostd/coroutine.hh @@ -420,26 +420,57 @@ private: using base_t = detail::coroutine_context; friend struct detail::coroutine_context; + template struct yielder { - yielder(generator &g): p_gen(g) {} + yielder(generator &g): p_gen(g) {} - void operator()(T &&ret) { + void operator()(U &&ret) { p_gen.p_result = &ret; p_gen.yield_jump(); } - void operator()(T &ret) { + void operator()(U const &ret) { + if constexpr(std::is_const_v) { + p_gen.p_result = &ret; + p_gen.yield_jump(); + } else { + T val{ret}; + p_gen.p_result = &val; + p_gen.yield_jump(); + } + } + private: + generator &p_gen; + }; + + template + struct yielder { + yielder(generator &g): p_gen(g) {} + + void operator()(U &ret) { p_gen.p_result = &ret; p_gen.yield_jump(); } private: - generator &p_gen; + generator &p_gen; + }; + + template + struct yielder { + yielder(generator &g): p_gen(g) {} + + void operator()(U &&ret) { + p_gen.p_result = &ret; + p_gen.yield_jump(); + } + private: + generator &p_gen; }; public: using range = generator_range; - using yield_type = yielder; + using yield_type = yielder; generator() = delete; @@ -534,7 +565,7 @@ private: /* we can use a pointer because even stack values are alive * as long as the coroutine is alive (and it is on every yield) */ - T *p_result = nullptr; + std::decay_t *p_result = nullptr; }; template