From d6608aa6b4cc686974de66c612fb4b0a1dad6526 Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 13 Jul 2022 01:40:17 +0100 Subject: [PATCH] fix generated view --- include/ranges/generated.hpp | 32 ++++++++++++++++++++++++++------ src/main.cc | 25 ++++++++++++++++--------- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/include/ranges/generated.hpp b/include/ranges/generated.hpp index 72ed7d7..4fdadac 100644 --- a/include/ranges/generated.hpp +++ b/include/ranges/generated.hpp @@ -17,11 +17,30 @@ template struct generated_iterator { using difference_type = std::ptrdiff_t; value_type value{}; - F generator{}; + F generator; + // TODO: make 1 constructor that generates a value, move/copy value in all + // other constructors generated_iterator() = default; - generated_iterator(F gen) : generator(gen), value(gen()) {} - generated_iterator(F &&gen) : generator(std::move(gen)), value(gen()) {} + explicit generated_iterator(F &&gen) + : generator(std::move(gen)), value(gen()) {} + + generated_iterator(const generated_iterator &other) + : generator(other.generator), value(other.value) {} + generated_iterator(generated_iterator &&other) + : generator(std::move(other.generator)), value(std::move(other.value)) {} + + auto operator=(const generated_iterator &other) -> generated_iterator & { + generator = other.generator; + value = other.value; + return *this; + } + + auto operator=(generated_iterator &&other) -> generated_iterator & { + generator = std::move(other.generator); + value = std::move(other.value); + return *this; + } auto generate_new_value() -> void { value = generator(); } @@ -47,13 +66,14 @@ template struct generated_iterator { template class generated_view : rg::view_interface> { - F generator = {}; + detail::generated_iterator iter_{}; public: constexpr generated_view() = default; - constexpr generated_view(F generator) : generator(std::move(generator)) {} + constexpr generated_view(F generator) + : iter_(detail::generated_iterator(std::move(generator))) {} - constexpr auto begin() const { return detail::generated_iterator(generator); } + constexpr auto begin() const { return iter_; } constexpr auto end() const { return std::unreachable_sentinel; } }; diff --git a/src/main.cc b/src/main.cc index 5ac8364..6bfb804 100644 --- a/src/main.cc +++ b/src/main.cc @@ -61,16 +61,23 @@ auto test_enumerate_view() { } auto test_generated_view() { - const auto random = - util::views::from([] { - return "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY" - [std::rand() % - std::strlen( - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY")]; - }) | - std::views::take(10) | util::views::collect; + { + const auto view = util::views::from([] { return 's'; }); + auto it = std::ranges::begin(view); - util::println("random string: {}", random); + util::assert_eq(*it, *it); + util::assert_eq(*it, 's'); + } + + { + auto count = 0; + const auto view = util::views::from([&] { return count++; }); + auto it = std::ranges::begin(view); + + util::assert_eq(*it, *it); + util::assert_ne(*it++, *it++); + util::assert_ne(*it + 1, *++it); + } } auto test_collect() {