#include #include #include template tl::generator firstn(T t) { T num = T{ 0 }; while (num < t) { co_yield num; ++num; } } TEST_CASE("firstn") { auto i = 0; for (auto n : firstn(20)) { REQUIRE(n == i); ++i; } } template tl::generator iota(T t = T{ 0 }) { while (true) { co_yield t; t++; } } TEST_CASE("iota") { auto i = 0; for (auto n : iota() | std::views::take(10)) { REQUIRE(n == i); ++i; } for (auto n : iota(10) | std::views::take(10)) { REQUIRE(n == i); ++i; } } #include #include #include tl::generator> split_by_lines_and_whitespace(std::string_view sv) { std::vector res; auto start = sv.begin(); auto pos = sv.begin(); while (pos != sv.end()) { if (*pos == ' ') { res.push_back(std::string(start, pos)); start = pos+1; } if (*pos == '\n') { res.push_back(std::string(start, pos)); co_yield res; res.clear(); start = pos+1; } ++pos; } } template tl::generator>> enumerate(Range&& r) { std::size_t i = 0; for (auto&& val : std::forward(r)) { std::pair> pair {i, std::forward(val)}; co_yield pair; ++i; } } TEST_CASE("split") { auto string = R"(one two three four five six seven eight nine)"; std::vector> result = { {"one", "two", "three"}, {"four", "five", "six"}, {"seven", "eight", "nine"} }; for (auto&& [i, val] : enumerate(split_by_lines_and_whitespace(string))) { REQUIRE(val == result[i]); } }