/////////////////////////////////////////////////////////////////////////////// // Reference implementation of std::generator proposal P2168. // // See https://wg21.link/P2168 for details. // /////////////////////////////////////////////////////////////////////////////// // Copyright Lewis Baker, Corentin Jabot // // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. // (See accompanying file LICENSE or http://www.boost.org/LICENSE_1_0.txt) /////////////////////////////////////////////////////////////////////////////// module; #include #include export module nihil.generator:generator_promise; import :forward; import :generator_promise_base; import :promise_base_alloc; namespace nihil { export template struct generator_promise; export template struct generator_promise, ByteAllocator, ExplicitAllocator> final : public generator_promise_base, public promise_base_alloc { generator_promise() noexcept : generator_promise_base( std::coroutine_handle::from_promise(*this)) { } auto get_return_object() noexcept -> generator { return generator{ std::coroutine_handle::from_promise(*this)}; } using generator_promise_base::yield_value; template auto yield_value(nihil::elements_of &&x) -> typename generator_promise_base< Ref>::template yield_sequence_awaiter> { static_assert(!ExplicitAllocator, "This coroutine has an explicit allocator specified with " "std::allocator_arg so an allocator needs to be passed " "explicitely to std::elements_of"); return [](auto &&rng) -> generator { for (auto &&e : rng) co_yield static_cast(e); }(std::forward(x.get())); } }; } // namespace nihil