Awesome
Ranges For C++23
This repository implements a set of views intended to be proposed to a future C++ standard.
The library can only be used with a conforming implementation of C++20 - Only GCC is known to work.
If you are looking for a battle-tested implementation of ranges for older C++ version, use ranges-v3.
ranges::to
ranges::to
is a C++23 proposal
to convert ranges to a container.
It supports input ranges, nested ranges and container, as well as conversion between containers of pairs and associative containers.
auto vec = std::views::iota(0, 10) | rangesnext::to<std::vector>();
views::enumerate
Enumerates provide a counter in addition to the value of the underlying view.
for(auto && [index, value] : rangesnext::enumerate({"Hello", "World"})) {
fmt::print("(index : {}, value : {}) ", index, value);
// (index: 0, value: "Hello") (index: 1, value: "World")
}
views::product
Cartesian product of multiple views, equivalent to a nested for-loop
std::vector a{'a', 'b', 'c', 'd'};
std::vector b{1, 2, 3};
std::vector c{0.1, 0.2};
for (auto &&[c, d, f] : rangesnext::product(a, b, c)) {
fmt::print("({} {} {}), ", c, d,n );
// prints (a, 1, 0.1), (a, 1, 0.2), (a, 2, 0.1), (a, 3, 0.1) ...
}
generator
rangesnext::generator<double> test() {
double i = 0;
while(i++ < 5) {
co_yield i * 2;
}
}
void f() {
std::ranges::for_each(test(), [](double i){
printf("%f\t", i);
});
}
This feature requires the -fcoroutines
flag under GCC, and might not work properly as the GCC support for coroutines is still experimental.
Usage
This project requires a conformant <ranges>
implementation.
Only GCC trunk is known to support this library.
Assuming the project is cloned in a rangesnext
directory
If your are using cmake:
add_subdirectory(rangesnext EXCLUDE_FROM_ALL)
target_link_libraries(your_target rangesnext)
Otherwise, just add rangesnext/include
to
the include path.