Range library for C++11/14/17. This code is the basis of a formal proposal to add range support to the C++ standard library.
Why does C++ need another range library? Simply put, the existing solutions haven’t kept up with the rapid evolution of C++. Range v3 is a library for the future C++. Not only does it work well with today’s C++ – move semantics, lambdas, automatically deduced types and all – it also anticipates tomorrow’s C++ with Concepts.
Range v3 forms the basis of a proposal to add range support to the standard library (N4128: Ranges for the Standard Library). It also will be the reference implementation for an upcoming Technical Specification. These are the first steps toward turning ranges into an international standard.
Check out the (woefully incomplete) documentation here.
Other resources (mind the dates, the library probably has changed since then):
Most of the source code in this project are mine, and those are under the Boost Software License. Parts are taken from Alex Stepanov’s Elements of Programming, Howard Hinnant’s libc++, and from the SGI STL. Please see the attached LICENSE file and the CREDITS file for the licensing and acknowledgments.
The code is known to work on the following compilers:
Development Status: This code is fairly stable, well-tested, and suitable for casual use, although currently lacking documentation. No promise is made about support or long-term stability. This code will evolve without regard to backwards compatibility.
Build status
Writable
(see ericniebler/stl2#387).view_interface
gets a bounds-checking at
method.chunk_view
works on Input ranges.group_by_view
.partial_sum
numeric algorithm.ContiguousIterator
concept and contiguous_iterator_tag
iterator
category tag.span
fixes.action::insert
avoids interfering with vector
’s exponentional growth
strategy.shared
view for views that need container-like scratch
space to do their work.reverse_view
.ranges::reference_wrapper
to avoid LWG#2993.any_view
, the type-erased view wrapper.equal
algorithm is constexpr
in C++14.stride_view
no longer needs an atomic
data member.const
-correct drop_view
.adjacent_filter_view
supports bidirectional iteration.view_adaptor
cleanup to remove the need for a mutable
data
member holding the adapted view.counting_iterator
post-increment bug.tail_view
of an empty range is an empty range, not undefined behavior.any_view
s are now much more efficicient (from @CaseyCarter)<thread>
header (from @CaseyCarter)ranges::experimental::generator
(from @CaseyCarter)ranges::optional
now behaves like std::optional
(from @CaseyCarter)view::chunk
works on Input ranges (from @CaseyCarter)for_each_n
algorithm (from @khlebnikov)action::stable_sort
of vector
broken on Clang 3.8.1 since ~last Xmas (ericniebler/range-v3#632).view::linear_distribute(from,to,n)
- A view of n
elements between from
and to
, distributed evenly.view::indices(n)
- A view of the indices [0,1,2...n-1]
.view::closed_indices(n)
- A view of the indices [0,1,2...n]
.This release deprecates view::ints(n)
as confusing to new users.
view::cartesian_product
action::reverse
Many interfaces are simply renamed. The following table shows the old names
and the new. (All names are in the ranges::v3
namespace.)
Old Name | New Name |
---|---|
indirect_swap |
iter_swap |
indirect_move |
iter_move |
iterator_value_t |
value_type_t |
iterator_reference_t |
reference_t |
iterator_difference_t |
difference_type_t |
iterator_size_t |
size_type_t |
iterator_rvalue_reference_t |
rvalue_reference_t |
iterator_common_reference_t |
iter_common_reference_t |
range_value_t |
range_value_type_t |
range_difference_t |
range_difference_type_t |
range_size_t |
range_size_type_t |
range_iterator_t |
iterator_t |
range_sentinel_t |
sentinel_t |
common_iterator
now requires that its two types (Iterator
and Sentinel
)
are different. Use common_iterator_t<I, S>
to get the old behavior (i.e., if the two types are the same, it is an alias for I
; otherwise, it is
common_iterator<I, S>
).operator++(int)
):
common_iterator
counted_iterator
std::
:
ranges::begin
ranges::end
ranges::size
ranges::swap
ranges::iter_swap
(In practice, this has very little effect but it may effect overloading in rare situations.)
ranges::is_swappable
now only takes one template parameter. The new
ranges::is_swappable_with<T, U>
tests whether T
and U
are swappable.
ranges::is_swappable<T>
is equivalent to ranges::is_swappable_with<T &, T &>
.Destructible
Constructible
DefaultConstructible
MoveConstructible
MoveConstructible
Movable
Assignable
View
concept is no longer satisfied by reference types.Writable
concept to fix #537.I do this work because I love it and because I love C++ and want it to be as excellent as I know it can be. If you like my work and are looking for a way to say thank you, you can leave a supportive comment on my blog. Or you could leave me some kudos on my Open Hub range-v3 contribution page. Just click the Give Kudos button here.