#include #include #include #include // waiting for C++23 support: P2286 Formatting Ranges ... #if defined(__cpp_lib_format_ranges) && defined(__cpp_lib_print) #include template void show(Range&& r, Msg message) { std::print("{:<40}: {}", message, r); } template void show_range_of_ranges(Range&& r, Msg message) { show(r, message); } template void show_range_of_pairs(Range&& r, Msg message) { show(r, message); } template void show_map(Range&& r, Msg message) { show(r, message); } #else #include auto decorate(auto e) { return e; } auto decorate(char e) { return std::string("\'") + e + "\'"; } auto decorate(std::string e) { return std::string("\"") + e + "\""; } template void show(Range&& r, Msg message) { std::cout.width(40); std::cout << std::left << message << " : ["; int cnt = 0; for (auto&& e : r) { std::cout << (cnt++ ? ", ":"") << decorate(e); } std::cout << "]\n"; } template void show_range_of_ranges(Range&& r, Msg message) { std::cout.width(40); std::cout << std::left << message << " : ["; int cnt = 0; for (auto&& inner_range : r) { std::cout << (cnt++ ? ", ":"") << "["; int inner_cnt = 0; for (auto&& e : inner_range) { std::cout << (inner_cnt++ ? ", ":"") << decorate(e); } std::cout << "]"; } std::cout << "]\n"; } template void show_range_of_pairs(Range&& r, Msg message) { std::cout.width(40); std::cout << std::left << message << " : ["; int cnt = 0; for (auto&& [a,b] : r) { std::cout << (cnt++ ? ", ":"") << "(" << decorate(a) << ", " << decorate(b) << ")"; } std::cout << "]\n"; } template void show_map(Range&& r, Msg message) { std::cout.width(40); std::cout << std::left << message << " : {"; int cnt = 0; for (auto&& [k,v] : r) { std::cout << (cnt++ ? ", ":"") << decorate(k) << ": " << decorate(v); } std::cout << "}\n"; } #endif // defined(__cpp_lib_format_ranges) && defined(__cpp_lib_print) int main() { using namespace std::views; using namespace std::string_literals; auto v = std::vector{ 1, 3, 5, 4, 2 }; auto s = "AB CDE"s; auto m = std::map{{"wrong", 6*9}, {"answer", 42}}; auto below_5 = [](int x){ return x < 5; }; auto double_digit = [](int a, int b) { return 10*a + b; }; show( empty, "empty"); show( single(42), "single(42)"); show( iota(0,6), "iota(0,6)"); show( iota(0) | take(3), "iota(0) | take(3)"); show( repeat(6) | take(3), "repeat(6) | take(3)"); std::cout << '\n'; show( counted(begin(v), size(v)), "counted(begin(v),size(v))"); show( v | all, "v | all"); show( v | drop_while(below_5), "v | drop_while(below_5)"); show_range_of_pairs(v | enumerate, "v | enumerate"); show( v | filter(below_5), "v | filter(below_5)"); show( v | reverse, "v | reverse"); show( v | take_while(below_5), "v | take_while(below_5)"); show( v | transform([](int x){ return x*x; }), "v | transform(square)"); std::cout << '\n'; show_range_of_ranges( v | chunk(3), "v | chunk(3)" ); show_range_of_ranges( v | chunk_by(std::ranges::less{}), "v | chunk_by(std::ranges::less{})" ); show( v | pairwise_transform(double_digit), "v | pairwise_transform(double_digit)" ); show_range_of_pairs( v | pairwise, "v | pairwise" ); show_range_of_ranges( v | slide(2), "v | slide(2)" ); show( v | stride(2), "v | stride(2)" ); std::cout << '\n'; show( s , "s"); show_range_of_ranges( s | split(' '), "s | split(\' \')"); show( s | split(' ') | join, "s | split(\' \') | join"); show( s | split(' ') | join_with("<>"s), "s | split(\' \') | join_with(\"<>\"s)"); std::cout << '\n'; show_range_of_pairs( zip(v, s), "zip(v, s)" ); show( zip_transform(double_digit, v, v), "zip_transform(double_digit, v, v)" ); show_range_of_pairs( cartesian_product(v|take(2), s|take(2)), "cartesian_product(v|take(2), s|take(2))" ); std::cout << '\n'; show_map( m , "m"); show( m | keys , "m | keys"); show( m | values , "m | values"); }