From c1e17617cb3bb0ec33377d4b0d9aa9bfd2997d80 Mon Sep 17 00:00:00 2001 From: q66 Date: Fri, 14 Apr 2017 03:45:06 +0200 Subject: [PATCH] hide generator range too --- ostd/coroutine.hh | 100 ++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 56 deletions(-) diff --git a/ostd/coroutine.hh b/ostd/coroutine.hh index cac4ad7..0d81e28 100644 --- a/ostd/coroutine.hh +++ b/ostd/coroutine.hh @@ -869,9 +869,8 @@ inline void swap(coroutine &a, coroutine &b) noexcept { a.swap(b); } -template struct generator_range; - namespace detail { + template struct generator_range; template struct generator_iterator; } @@ -965,8 +964,8 @@ private: }; public: - /** @brief As generators can be used with ranges, this is defined. */ - using range = generator_range; + /** @brief Generators are iterable, see iter(). */ + using range = detail::generator_range; /** @brief The yielder type for the generator. Not opaque, but internal. */ using yield_type = yielder; @@ -1099,16 +1098,16 @@ public: /** @brief Gets a range to the generator. * - * The range is an ostd::generator_range. It's an input range, so all - * of its copies point to the same generator instance, reflecting the same - * internal state. + * The range is an ostd::input_range_tag. It calls to empty() to check + * for emptiness and to resume() to pop. A call to value() is used + * to get the front element reference. */ - generator_range iter() noexcept; + range iter() noexcept; /** @brief Implements a minimal iterator just for range-based for loop. * Do not use directly. */ - detail::generator_iterator begin() noexcept; + auto begin() noexcept; /** @brief Implements a minimal iterator just for range-based for loop. * Do not use directly. @@ -1186,58 +1185,45 @@ namespace detail { template using yield_type = typename detail::yield_type_base::type; -/** @brief A range type over a generator. - * - * This range type is a simple input range type (ostd::input_range_tag) - * that wraps around a generator. - */ -template -struct generator_range: input_range> { - using range_category = input_range_tag; - using value_type = T; - using reference = T &; - using size_type = std::size_t; - using difference_type = std::ptrdiff_t; +namespace detail { + template + struct generator_range: input_range> { + using range_category = input_range_tag; + using value_type = T; + using reference = T &; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; - generator_range() = delete; + generator_range() = delete; - /** @brief Generator ranges are constructed using a generator reference. */ - generator_range(generator &g): p_gen(&g) {} + generator_range(generator &g): p_gen(&g) {} - /** @brief Like ostd::generator::empty(). */ - bool empty() const noexcept { - return p_gen->empty(); - } + bool empty() const noexcept { + return p_gen->empty(); + } - /** @brief Like ostd::generator::resume(). */ - void pop_front() { - p_gen->resume(); - } + void pop_front() { + p_gen->resume(); + } - /** @brief Like ostd::generator::value(). */ - reference front() const { - return p_gen->value(); - } + reference front() const { + return p_gen->value(); + } - /** @brief Implements a minimal iterator just for range-based for loop. - * Do not use directly. - */ - detail::generator_iterator begin() noexcept; + generator_iterator begin() noexcept; - /** @brief Implements a minimal iterator just for range-based for loop. - * Do not use directly. - */ - std::nullptr_t end() noexcept { - return nullptr; - } + std::nullptr_t end() noexcept { + return nullptr; + } -private: - generator *p_gen; -}; + private: + generator *p_gen; + }; +} /* namespace detail */ template -generator_range generator::iter() noexcept { - return generator_range{*this}; +typename generator::range generator::iter() noexcept { + return detail::generator_range{*this}; } namespace detail { @@ -1266,14 +1252,16 @@ namespace detail { } /* namespace detail */ template -detail::generator_iterator generator::begin() noexcept { +auto generator::begin() noexcept { return detail::generator_iterator{*this}; } -template -detail::generator_iterator generator_range::begin() noexcept { - return detail::generator_iterator{*p_gen}; -} +namespace detail { + template + generator_iterator generator_range::begin() noexcept { + return generator_iterator{*p_gen}; + } +} /* namespace detail */ /** @} */