fix generated view
This commit is contained in:
parent
8b0ef87f17
commit
d6608aa6b4
|
@ -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; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
25
src/main.cc
25
src/main.cc
|
@ -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() {
|
||||||
|
|
Loading…
Reference in a new issue