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;
|
||||
|
||||
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 <std::invocable F> struct generated_iterator {
|
|||
|
||||
template <std::invocable F>
|
||||
class generated_view : rg::view_interface<generated_view<F>> {
|
||||
F generator = {};
|
||||
detail::generated_iterator<F> 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; }
|
||||
};
|
||||
|
||||
|
|
25
src/main.cc
25
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<std::string>;
|
||||
{
|
||||
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() {
|
||||
|
|
Loading…
Reference in a new issue