From 1f3366ddb6c1cb7c4e8c032e0d0413e24bef97a1 Mon Sep 17 00:00:00 2001 From: Lewis Baker Date: Fri, 18 Jan 2019 22:28:18 -0800 Subject: [PATCH] Make recursive_generator satisfy the Range concept. Fix recursive_generator to have a 'reference' type of T&&. --- include/cppcoro/recursive_generator.hpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/include/cppcoro/recursive_generator.hpp b/include/cppcoro/recursive_generator.hpp index 62091b6..69dd42d 100644 --- a/include/cppcoro/recursive_generator.hpp +++ b/include/cppcoro/recursive_generator.hpp @@ -170,7 +170,7 @@ namespace cppcoro std::experimental::coroutine_handle::from_promise(*this).resume(); } - T* m_value; + std::add_pointer_t m_value; std::exception_ptr m_exception; promise_type* m_root; @@ -229,12 +229,16 @@ namespace cppcoro using iterator_category = std::input_iterator_tag; // What type should we use for counting elements of a potentially infinite sequence? - using difference_type = std::size_t; + using difference_type = std::ptrdiff_t; using value_type = std::remove_reference_t; - using reference = value_type&; - using pointer = value_type*; + using reference = std::conditional_t, T, T&>; + using pointer = std::add_pointer_t; - iterator(promise_type* promise) noexcept + iterator() noexcept + : m_promise(nullptr) + {} + + explicit iterator(promise_type* promise) noexcept : m_promise(promise) {} @@ -264,10 +268,15 @@ namespace cppcoro return *this; } + void operator++(int) + { + (void)operator++(); + } + reference operator*() const noexcept { assert(m_promise != nullptr); - return m_promise->value(); + return static_cast(m_promise->value()); } pointer operator->() const noexcept