fix generated view

This commit is contained in:
janis 2022-07-13 01:40:17 +01:00
parent 8b0ef87f17
commit d6608aa6b4
2 changed files with 42 additions and 15 deletions

View file

@ -17,11 +17,30 @@ template <std::invocable F> struct generated_iterator {
using difference_type = std::ptrdiff_t; using difference_type = std::ptrdiff_t;
value_type value{}; 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() = default;
generated_iterator(F gen) : generator(gen), value(gen()) {} explicit generated_iterator(F &&gen)
generated_iterator(F &&gen) : generator(std::move(gen)), value(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(); } auto generate_new_value() -> void { value = generator(); }
@ -47,13 +66,14 @@ template <std::invocable F> struct generated_iterator {
template <std::invocable F> template <std::invocable F>
class generated_view : rg::view_interface<generated_view<F>> { class generated_view : rg::view_interface<generated_view<F>> {
F generator = {}; detail::generated_iterator<F> iter_{};
public: public:
constexpr generated_view() = default; 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; } constexpr auto end() const { return std::unreachable_sentinel; }
}; };

View file

@ -61,16 +61,23 @@ auto test_enumerate_view() {
} }
auto test_generated_view() { auto test_generated_view() {
const auto random = {
util::views::from([] { const auto view = util::views::from([] { return 's'; });
return "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY" auto it = std::ranges::begin(view);
[std::rand() %
std::strlen(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY")];
}) |
std::views::take(10) | util::views::collect<std::string>;
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() { auto test_collect() {