libc++ Ranges Status¶
Overview¶
This document contains the status of the C++20 Ranges library in libc++. It is used to track both the status of the sub-projects of the ranges library and who is assigned to these sub-projects. This is imperative to effective implementation so that work is not duplicated and implementors are not blocked by each other.
If you are interested in contributing to the libc++ Ranges library, please send a message to the #libcxx channel in the LLVM discord. Please do not start working on any of the assigned items below.
Sub-Projects in the One Ranges Proposal¶
Section |
Description |
Dependencies |
Assignee |
Complete |
---|---|---|---|---|
[tuple.helper] |
Update <tuple> includes. |
None |
Unassigned |
Not started |
None |
Zoe Carver |
✅ |
||
None |
Christopher Di Bella |
✅ |
||
Christopher Di Bella |
✅ |
|||
indirectly_readable_traits
incrementable_traits
|
Christopher Di Bella |
✅ |
||
no-throw-input-iterator
no-throw-sentinel-for
no-throw-input-range
no-throw-forward-iterator
no-throw-forward-range
|
[iterator.concepts]
[range.refinements]
|
Unassigned |
Not started |
|
ranges::uninitialized_default_construct
ranges::uninitialized_default_construct_n
ranges::uninitialized_value_construct
ranges::uninitialized_value_construct_n
ranges::uninitialized_copy
ranges::uninitialized_copy_n
ranges::uninitialized_move
ranges::uninitialized_move_n
ranges::uninitialized_fill
ranges::uninitialized_fill_n
ranges::construct_at
ranges::destroy
ranges::destroy_at
ranges::destroy_n
|
[special.mem.concepts] |
Unassigned |
Not started |
|
[strings] |
Adds begin/end and updates const_iterator. |
[iterator.concepts] |
Unassigned |
Not started |
[views.span] |
Same as [strings] |
[iterator.concepts] |
Unassigned |
Not started |
Zoe Carver |
✅ |
|||
iter_value_t |
Zoe Carver |
✅ |
||
Various |
✅ |
|||
[readable.traits] |
Louis Dionne |
✅ |
||
[iterator.concepts] |
Louis Dionne |
✅ |
||
[common.alg.req]: pt. 1 |
[iterator.concepts] |
Zoe Carver |
In progress |
|
[common.alg.req]: pt. 2 |
indirectly_swappable |
[iterator.concepts]
[iterator.cust.swap]
|
Zoe Carver |
✅ |
[common.alg.req]: pt. 3 |
indirectly_comparable |
[projected] |
Louis Dionne |
Not started |
[common.alg.req]: pt. 4 |
permutable
mergeable
sortable
|
[iterator.concepts] |
Unassigned |
Not started |
[std.iterator.tags] |
[iterator.traits] |
Unassigned |
Not started |
|
[iterator.concepts] |
Christopher Di Bella |
In progress |
||
[predef.iterators] |
Updates to predefined iterators. |
[iterator.concepts]
[iterator.cust.swap]
[iterator.cust.move]
|
Unassigned |
Not started |
[move.sentinel] |
[predef.iterators] |
Unassigned |
Not started |
|
[common.iterator] |
[iterator.concepts]
[iterator.cust.swap]
[iterator.cust.move]
|
Zoe Carver |
✅ |
|
[default.sentinels] |
std::default_sentinel_t. |
No dependencies |
Zoe Carver |
✅ |
[counted.iterator] |
[iterator.concepts]
[iterator.cust.swap]
[iterator.cust.move]
[default.sentinels]
|
Zoe Carver |
✅ |
|
[stream.iterators] |
[default.sentinels] |
Unassigned |
Not started |
|
ranges::rbegin
ranges::rend
ranges::crbegin
ranges::crend
ranges::cdata
|
[iterator.concepts] |
Christopher Di Bella and Zoe Carver |
In progress |
|
[range.access] |
Christopher Di Bella |
✅ |
||
[range.primitives]
[range.range]
|
Christopher Di Bella |
✅ |
||
[range.range] |
Louis Dionne |
✅ |
||
ranges::output_range
ranges::contiguous_range
|
[range.range] |
Christopher Di Bella |
✅ |
|
[range.range] |
Louis Dionne |
✅ |
||
simple-view
has-arrow
not-same-as
|
[range.range]
[iterator.concept.input]
|
Zoe Carver |
✅ |
|
[ranges.range]
[range.view]
[range.iterator.op.prev]
[range.refinements]
|
Zoe Carver |
✅ |
||
[view.interface] |
Zoe Carver |
✅ |
||
ranges::dangling
ranges::borrowed_iterator_t
ranges::borrowed_subrange_t
|
[range.range]
[range.subrange]
|
Christopher Di Bella |
✅ |
|
[range.subrange], [range.view.ref] |
Zoe Carver |
✅ |
||
[view.interface] |
Zoe Carver |
✅ |
||
filter_view |
[range.all] |
Louis Dionne |
Not started |
|
[range.all] |
Zoe Carver |
✅ |
||
iota_view |
[range.all] |
Louis Dionne |
Not started |
|
take_view |
[range.all] |
Zoe Carver |
In Progress |
|
join_view |
[range.all] |
Christopher Di Bella |
Not started |
|
[view.interface] |
Zoe Carver |
✅ |
||
single_view |
[view.interface] |
Zoe Carver |
In Progress |
|
split_view |
[range.all] |
Unassigned |
Not started |
|
view::counted |
[range.subrange] |
Zoe Carver |
Not started |
|
common_view |
[range.all] |
Zoe Carver |
✅ |
|
reverse_view |
[range.all] |
Unassigned |
Not started |
Misc. Items and TODOs¶
(Note: files with required updates will contain the TODO at the beginning of the list item so they can be easily found via global search.)
TODO(XX_SPACESHIP_CONCEPTS): when spaceship support is added to various STL types, we need to update some concept tests.
Paper and Issue Status¶
(Note: stolen from MSVC here.)
Number |
Name |
Status |
Assignee |
---|---|---|---|
<ranges> |
|||
Input Range Adaptors |
|||
Movability Of Single-Pass Iterators |
|||
Rangify New Algorithms |
|||
Fixing Relations |
|||
Ranges Design Cleanup |
|||
Range Constructor For string_view |
|||
Move-Only Views |
|||
Helpful Pointers For contiguous_iterator |
|||
Iterator Difference Type And Integer Overflow |
|||
Views And Size Types |
|||
basic_istream_view::iterator Should Not Be Copyable |
|||
Range Comparison Algorithms Are Over-Constrained |
|||
Avoiding Template Bloat For Ranges |
|||
Range Adaptors For Non-Copyable Iterators |
|||
safe_range |
|||
disable_sized_sentinel_for |
|||
Constraining Readable Types |
|||
ranges::ssize |
|||
Fixing Minor Ranges Issues |
|||
elements_view Needs Its Own sentinel |
|||
Fixing Issues With Range Access CPOs |
|||
Range Algorithm Result Types |
|||
Views should not be required to be default constructible |
|||
join_view should join all views of ranges |
|||
Superior String Splitting |
|||
Clarifying range adaptor objects |
|||
Remove misuses of list-initialization from Clause 24 |
|||
ranges permutation generators discard useful information |
|||
Enable CTAD for ref-view |
|||
subrange should always model Range |
|||
Inconsistently named return type for ranges::minmax_element |
|||
Normative permission to specialize Ranges variable templates |
|||
ranges removal, partition, and partial_sort_copy algorithms discard useful information |
|||
std::ranges::shuffle synopsis does not match algorithm definition |
|||
Class split_view::outer_iterator::value_type should inherit from view_interface |
|||
View converting constructors can cause constraint recursion and are unneeded |
|||
Conversion from pair-like types to subrange is a silent semantic promotion |
|||
subrange converting constructor should disallow derived to base conversions |
|||
ranges::size is not required to be valid after a call to ranges::begin on an input range |
|||
iota_view::iterator has the wrong iterator_category |
|||
iota_view is under-constrained |
|||
Pointers don’t need customized iterator behavior |
|||
transform_view::iterator has incorrect iterator_category |
|||
Range adaptor objects keys and values are unspecified |
|||
join_view::iterator::operator– is incorrectly constrained |
|||
has-tuple-element helper concept needs convertible_to |
|||
Constrain return type of transformation function for transform_view |
|||
range_size_t and views::all_t |
|||
The memory algorithms should support move-only input iterators introduced by P1207 |
|||
drop_while_view should opt-out of sized_range |
|||
Initialize data members of ranges and their iterators |
|||
begin and data must agree for contiguous_range |
|||
transform_view::sentinel has an incorrect operator- |
|||
common_iterator is not sufficiently constrained for non-copyable iterators |
|||
[range.reverse.view] reverse_view<V> unintentionally requires range<const V> |
|||
view iterator types have ill-formed <=> operators |
|||
A move-only iterator still does not have a counted_iterator |
|||
ranges::basic_istream_view::iterator should not provide iterator_category |
|||
tuple_element_t is also wrong for const subrange |
|||
Nesting join_views is broken because of CTAD |
|||
viewable_range mishandles lvalue move-only views |
|||
join_view::iterator::operator->() is bogus |
|||
split_view::outer-iterator::operator++ misspecified |
|||
join_view::iterator’s iter_swap is underconstrained |
|||
iter_move and iter_swap are inconsistent for transform_view::iterator |
|||
Missing requirement on InputIterator template parameter for priority_queue constructors |
|||
iota_view::sentinel is not always iota_view’s sentinel |
|||
split_view<V, P>::inner-iterator<true>::operator++(int) should depend on Base |
|||
Make base() const & consistent across iterator wrappers that supports input_iterators |
|||
indirectly_readable_traits should be SFINAE-friendly for all types |
|||
Definition of when counted_iterators refer to the same sequence isn’t quite right |
|||
common_iterator’s postfix-proxy is not quite right |
|||
view_interface is overspecified to derive from view_base |
|||
borrowed_{iterator,subrange}_t are overspecified |
|||
Useless constraint in split_view::outer-iterator::value_type::begin() |
|||
{transform,elements}_view::iterator::iterator_concept should consider const-qualification of the underlying range |