libc++ Ranges Status


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
[range.cmp] None Zoe Carver
[readable.traits] None Christopher Di Bella
[incrementable.traits]   Christopher Di Bella
[iterator.traits] Updates to iterator_traits
Christopher Di Bella
Unassigned Not started
[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
[iterator.cust.move] ranges::iter_move   Zoe Carver
[iterator.cust.swap] ranges::iter_swap iter_value_t Zoe Carver
[iterator.concepts]   Various
[indirectcallable.indirectinvocable] [readable.traits] Louis Dionne
[projected] ranges::projected [iterator.concepts] Louis Dionne
[common.alg.req]: pt. 1
[iterator.concepts] Zoe Carver In progress
[common.alg.req]: pt. 2 indirectly_swappable
Zoe Carver
[common.alg.req]: pt. 3 indirectly_comparable [projected] Louis Dionne Not started
[common.alg.req]: pt. 4
[iterator.concepts] Unassigned Not started
[std.iterator.tags]   [iterator.traits] Unassigned Not started
[range.iter.ops] [iterator.concepts] Christopher Di Bella In progress
[predef.iterators] Updates to predefined iterators.
Unassigned Not started
[move.sentinel]   [predef.iterators] Unassigned Not started
Zoe Carver
[default.sentinels] std::default_sentinel_t. No dependencies Zoe Carver
Zoe Carver
[stream.iterators]   [default.sentinels] Unassigned Not started
[iterator.concepts] Christopher Di Bella and Zoe Carver In progress
[range.range] [range.access] Christopher Di Bella
Christopher Di Bella
[range.view] [range.range] Louis Dionne
[range.refinements] [range.range] Christopher Di Bella
[range.refinements] ranges::viewable_range [range.range] Louis Dionne
Zoe Carver
[view.interface] ranges::view_interface
Zoe Carver
[range.subrange] ranges::subrange [view.interface] Zoe Carver
Christopher Di Bella
[range.all] view::all [range.subrange], [range.view.ref] Zoe Carver
[range.view.ref] ref-view [view.interface] Zoe Carver
[range.filter] filter_view [range.all] Louis Dionne Not started
[range.transform] transform_view [range.all] Zoe Carver
[range.iota] iota_view [range.all] Zoe Carver
[range.take] take_view [range.all] Zoe Carver
[range.join] join_view [range.all] Zoe Carver
[range.empty] empty_view [view.interface] Zoe Carver
[range.single] single_view [view.interface] Zoe Carver
[range.split] split_view [range.all] Zoe Carver In Progress
[range.counted] view::counted [range.subrange] Zoe Carver
[range.common] common_view [range.all] Zoe Carver
[range.reverse] reverse_view [range.all] Zoe Carver

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 First released version
P0896R4 <ranges>    
P1035R7 Input Range Adaptors    
P1207R4 Movability Of Single-Pass Iterators    
P1243R4 Rangify New Algorithms    
P1248R1 Fixing Relations    
P1252R2 Ranges Design Cleanup    
P1391R4 Range Constructor For string_view    
P1456R1 Move-Only Views    
P1474R1 Helpful Pointers For contiguous_iterator    
P1522R1 Iterator Difference Type And Integer Overflow    
P1523R1 Views And Size Types    
P1638R1 basic_istream_view::iterator Should Not Be Copyable    
P1716R3 Range Comparison Algorithms Are Over-Constrained    
P1739R4 Avoiding Template Bloat For Ranges    
P1862R1 Range Adaptors For Non-Copyable Iterators    
P1870R1 safe_range    
P1871R1 disable_sized_sentinel_for    
P1878R1 Constraining Readable Types    
P1970R2 ranges::ssize    
P1983R0 Fixing Minor Ranges Issues    
P1994R1 elements_view Needs Its Own sentinel    
P2091R0 Fixing Issues With Range Access CPOs    
P2106R0 Range Algorithm Result Types    
P2325R3 Views should not be required to be default constructible    
P2328R1 join_view should join all views of ranges    
P2210R2 Superior String Splitting    
P2281R1 Clarifying range adaptor objects    
P2367R0 Remove misuses of list-initialization from Clause 24    
LWG3169 ranges permutation generators discard useful information    
LWG3173 Enable CTAD for ref-view    
LWG3179 subrange should always model Range    
LWG3180 Inconsistently named return type for ranges::minmax_element    
LWG3183 Normative permission to specialize Ranges variable templates    
LWG3186 ranges removal, partition, and partial_sort_copy algorithms discard useful information    
LWG3191 std::ranges::shuffle synopsis does not match algorithm definition    
LWG3276 Class split_view::outer_iterator::value_type should inherit from view_interface    
LWG3280 View converting constructors can cause constraint recursion and are unneeded    
LWG3281 Conversion from pair-like types to subrange is a silent semantic promotion    
LWG3282 subrange converting constructor should disallow derived to base conversions    
LWG3286 ranges::size is not required to be valid after a call to ranges::begin on an input range    
LWG3291 iota_view::iterator has the wrong iterator_category    
LWG3292 iota_view is under-constrained    
LWG3299 Pointers don’t need customized iterator behavior    
LWG3301 transform_view::iterator has incorrect iterator_category    
LWG3302 Range adaptor objects keys and values are unspecified    
LWG3313 join_view::iterator::operator– is incorrectly constrained    
LWG3323 has-tuple-element helper concept needs convertible_to    
LWG3325 Constrain return type of transformation function for transform_view    
LWG3335 range_size_t and views::all_t    
LWG3355 The memory algorithms should support move-only input iterators introduced by P1207    
LWG3363 drop_while_view should opt-out of sized_range    
LWG3364 Initialize data members of ranges and their iterators    
LWG3381 begin and data must agree for contiguous_range    
LWG3384 transform_view::sentinel has an incorrect operator-    
LWG3385 common_iterator is not sufficiently constrained for non-copyable iterators    
LWG3387 [range.reverse.view] reverse_view<V> unintentionally requires range<const V>    
LWG3388 view iterator types have ill-formed <=> operators    
LWG3389 A move-only iterator still does not have a counted_iterator    
LWG3397 ranges::basic_istream_view::iterator should not provide iterator_category    
LWG3398 tuple_element_t is also wrong for const subrange    
LWG3474 Nesting join_views is broken because of CTAD    
LWG3481 viewable_range mishandles lvalue move-only views    
LWG3500 join_view::iterator::operator->() is bogus    
LWG3505 split_view::outer-iterator::operator++ misspecified    
LWG3517 join_view::iterator’s iter_swap is underconstrained    
LWG3520 iter_move and iter_swap are inconsistent for transform_view::iterator    
LWG3522 Missing requirement on InputIterator template parameter for priority_queue constructors Complete 14.0
LWG3523 iota_view::sentinel is not always iota_view’s sentinel    
LWG3532 split_view<V, P>::inner-iterator<true>::operator++(int) should depend on Base    
LWG3533 Make base() const & consistent across iterator wrappers that supports input_iterators    
LWG3541 indirectly_readable_traits should be SFINAE-friendly for all types    
LWG3543 Definition of when counted_iterators refer to the same sequence isn’t quite right    
LWG3546 common_iterator’s postfix-proxy is not quite right    
LWG3549 view_interface is overspecified to derive from view_base    
LWG3551 borrowed_{iterator,subrange}_t are overspecified    
LWG3553 Useless constraint in split_view::outer-iterator::value_type::begin()    
LWG3555 {transform,elements}_view::iterator::iterator_concept should consider const-qualification of the underlying range