48#include <gtest/gtest.h>
71 co_yield std::string(
"b") +
"b";
78 for (
int i = 0; i < n; ++i)
80 throw std::runtime_error(
"generator failure");
90 explicit Probe(
int v) :
value(v) { ++live; }
91 Probe(
const Probe &p) :
value(p.
value) { ++live; }
92 Probe(Probe &&p) noexcept :
value(p.value) { ++live; }
93 Probe &operator=(
const Probe &) =
default;
94 Probe &operator=(Probe &&) noexcept = default;
102 for (
int i = 0; i < n; ++i)
108 for (
int i = 0; i < n; ++i)
109 co_yield std::make_unique<int>(i);
123 "Generator::begin() must reject rvalue generators to avoid dangling iterators");
126 "Generator::begin() must still accept lvalue generators");
132 for (
int i : countdown(5))
143 std::vector<int> seen;
144 for (
int i : countdown(4))
146 EXPECT_EQ(seen, (std::vector<int>{4, 3, 2, 1}));
152 for (
int i : empty_generator())
153 { (void) i; ++count; }
159 std::vector<std::string> seen;
160 for (
const std::string &s : mixed_value_categories())
162 EXPECT_EQ(seen, (std::vector<std::string>{
"a",
"bb",
"c"}));
169 for (
int i : countdown(1000000))
176 EXPECT_EQ(first, 1000000);
184 ASSERT_NE(it, g.
end());
187 ASSERT_NE(it, g.
end());
190 ASSERT_NE(it, g.
end());
193 EXPECT_EQ(it, g.
end());
204 ASSERT_NE(it, g.
end());
207 ASSERT_EQ(it, g.
end());
211 auto it2 = g.
begin();
212 EXPECT_EQ(it2, g.
end());
216 EXPECT_THROW(++it, std::domain_error);
231 { (void) i; ++count; }
246 std::vector<int> seen;
249 for (
int i : throwing_after(3))
253 EXPECT_EQ(seen, (std::vector<int>{0, 1, 2}));
260 for (
int i : throwing_after(0))
262 FAIL() <<
"expected std::runtime_error";
264 catch (
const std::runtime_error &e)
266 EXPECT_STREQ(e.what(),
"generator failure");
272 ASSERT_EQ(Probe::live, 0);
275 for (
const Probe &p : probes(5))
278 EXPECT_EQ(Probe::live, 1);
281 EXPECT_EQ(sum, 0 + 1 + 2 + 3 + 4);
283 EXPECT_EQ(Probe::live, 0);
288 ASSERT_EQ(Probe::live, 0);
292 EXPECT_EQ(Probe::live, 1);
297 EXPECT_EQ(Probe::live, 0);
302 std::vector<int> seen;
303 for (
auto &p : unique_ptrs(4))
305 EXPECT_EQ(seen, (std::vector<int>{0, 1, 2, 3}));
310 static_assert(not std::is_copy_constructible_v<Generator<int>>);
311 static_assert(std::is_move_constructible_v<Generator<int>>);
315 std::vector<int> seen;
318 EXPECT_EQ(seen, (std::vector<int>{2, 1}));
323 std::vector<int> seen;
324 for (
int i : doubled(countdown(3)))
326 EXPECT_EQ(seen, (std::vector<int>{6, 4, 2}));
334 auto ita = a.
begin();
335 auto itb = b.
begin();
Lazy sequence type (Aleph::Generator<T>) built on C++20 coroutines.
size_t size_t int32_t value
Lazy, single-pass sequence of T values produced by a coroutine.
static std::default_sentinel_t end() noexcept
End sentinel, per the C++20 sentinel-based range model.
iterator begin() &
Begin iterating: resumes the coroutine to its first co_yield.