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 Patch Complete
[concepts] Normally this would be more fine-grained, but it’s already been implemented.   Christopher Di Bella  
[tuple.helper] Update <tuple> includes.        
[function.objects] Comparison functions: equal_to, less, etc. [concepts] Zoe Carver D100429  
[memory.syn] Add specializations for uninitialized_* and destroy_*. [concepts], [readable.traits]: iter_value_t      
[readable.traits]: indirectly_readable_traits indirectly_readable_traits only. [concepts] Christopher Di Bella D99461
[iterator.traits] Mainly updates to iterator_traits. [readable.traits]: indirectly_readable_traits, [concepts] Christopher Di Bella D99854, D99855
[readable.traits]: iter_value_t Finish implementing readable.traits. [readable.traits]: indirectly_readable_traits, [concepts], [iterator.traits] Christopher Di Bella D99863
[specialized.algorithms] NOT FINISHED NOT FINISHED      
[strings] Adds begin/end and updates const_iterator. [iterator.concepts]      
[views.span] Same as [strings] [iterator.concepts]      
[incrementable.traits]   [concepts] Christopher Di Bella D99141, D99863
[iterator.cust.move] Implement iter_move.   Christopher Di Bella D99873  
[iterator.cust.swap] Implement iter_swap. [concepts], [readable.traits]: iter_value_t      
[iterator.concepts] indirectly_readable, indirectly_writable, weakly_incrementable, incrementable, input_or_output_iterator, sentinel_for, sized_sentinel_for, input_iterator, output_iterator, forward_iterator, bidirectional_iterator, random_access_iterator, and contiguous_iterator. [concepts], [readable.traits]: iter_value_t, [iterator.traits] Christopher Di Bella indirectly_readable: D100073 indirectly_writable: D100078 weakly_incrementable, incrementable: D100080 input_or_output_iterator, sentinel_for: D100160 input_iterator: D100271 forward_iterator: D100275 bidirectional_iterator: D100278  
[indirectcallable.indirectinvocable] indirectly_unary_invocable, indirectly_regular_unary_invocable, indirectly_unary_predicate, indirectly_binary_predicate, indirectly_equivalence_relation, and indirectly_strict_weak_order. [concepts], [readable.traits]: iter_value_t, [iterator.traits]      
[projected]   [iterator.concepts]      
[common.alg.req]: pt. 1 indirectly_movable, indirectly_movable_storable, indirectly_copyable, and indirectly_copyable_storable. [iterator.concepts]      
[common.alg.req]: pt. 2 indirectly_swappable [iterator.concepts], [iterator.cust.swap]      
[common.alg.req]: pt. 3 indirectly_comparable [projected]      
[common.alg.req]: pt. 4 Note: could be done with pt. 1. … permutable, mergeable, and sortable [iterator.concepts]      
[std.iterator.tags]   [iterator.traits]      
[range.iterator.operations.advance] ranges::advance [iterator.concepts]      
[range.iterator.operations.distance] ranges::distance [iterator.concepts], [range.range]      
[range.iterator.operations.next] ranges::next [iterator.concepts]      
[range.iterator.operations.prev] ranges::prev [iterator.concepts]      
[predef.iterators] Updates to predefined iterators. [iterator.concepts], [iterator.cust.swap], [iterator.cust.move]      
[move.sentinel]   [concepts] … Note: for testing it may be beneficial to have completed [predef.iterators].      
[common.iterator]   [iterator.concepts], [iterator.cust.swap], [iterator.cust.move]      
[default.sentinels] The empty std::default_sentinel_t.        
[counted.iterator]   [iterator.concepts], [iterator.cust.swap], [iterator.cust.move], [default.sentinels]      
[stream.iterators]   [default.sentinels]      
[ranges.syn]: pt. 1 All the stuff not specified elsewhere. [range.access], [iterator.concepts], [range.all], [range.subrange], unreachable, [range.empty]      
[ranges.syn]: pt. 2 iterator_t, sentinel_t, and safe_iterator_t [range.access] Christopher Di Bella D100255, D100269  
[range.access] ranges::begin, end, cbegin, cend, rbegin, rend, crbegin, and crend [iterator.concepts] Christopher Di Bella D100255  
[ranges.primitives] size, empty, data, and cdata [iterator.concepts] Zoe Carver    
[range.range]   [range.access]      
[range.sized]   [range.primitives], [range.range]      
[range.view] View and enable_view [range.range] Louis Dionne https://reviews.llvm.org/D101547
[range.refinements] OutputRange, InputRange, ForwardRange, BidirectionalRange, RandomAccessRange, ContiguousRange, CommonRange, ViewableRange [ranges.syn]: pt. 2, [range.range] Christopher Di Bella input_range: D100271 forward_range: D100275 bidirectional_range: D100278  
[view.interface] [range.utility.helpers] and view_interface [ranges.syn]: pt. 2, [range.view], [range.iterator.operations.prev], [range.refinements] Zoe Carver D101737  
[range.subrange]   [view.interface] Zoe Carver D102006  
[range.all] view::all [range.subrange], [range.view.ref] Zoe Carver D102028  
[range.view.ref] ref-view [view.interface] Zoe Carver D102020  
[range.filter] filter_view [range.all] Louis Dionne    
[range.transform] transform_view [range.all] Zoe Carver    
[range.iota] iota_view [range.all] Louis Dionne    
[range.take] take_view [range.all] Zoe Carver    
[range.join] join_view [range.all] Christopher Di Bella    
[range.empty] empty_view [view.interface]      
[range.single] single_view [view.interface]      
[range.split] split_view [range.all]      
[range.counted] view::counted [range.subrange]      
[range.common] common_view [range.all]      
[range.reverse] reverse_view [range.all]      

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
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    
LWG-3169 ranges permutation generators discard useful information    
LWG-3173 Enable CTAD for ref-view    
LWG-3179 subrange should always model Range    
LWG-3180 Inconsistently named return type for ranges::minmax_element    
LWG-3183 Normative permission to specialize Ranges variable templates    
LWG-3186
ranges removal, partition, and partial_sort_copy algorithms discard useful information
   
LWG-3191 std::ranges::shuffle synopsis does not match algorithm definition    
LWG-3276 Class split_view::outer_iterator::value_type should inherit from view_interface    
LWG-3280 View converting constructors can cause constraint recursion and are unneeded    
LWG-3281 Conversion from pair-like types to subrange is a silent semantic promotion    
LWG-3282 subrange converting constructor should disallow derived to base conversions    
LWG-3286 ranges::size is not required to be valid after a call to ranges::begin on an input range    
LWG-3291 iota_view::iterator has the wrong iterator_category    
LWG-3292 iota_view is under-constrained    
LWG-3299 Pointers don’t need customized iterator behavior    
LWG-3301 transform_view::iterator has incorrect iterator_category    
LWG-3302 Range adaptor objects keys and values are unspecified    
LWG-3313 join_view::iterator::operator– is incorrectly constrained    
LWG-3323 has-tuple-element helper concept needs convertible_to    
LWG-3325 Constrain return type of transformation function for transform_view    
LWG-3335 range_size_t and views::all_t    
LWG-3355 The memory algorithms should support move-only input iterators introduced by P1207    
LWG-3363 drop_while_view should opt-out of sized_range    
LWG-3364 Initialize data members of ranges and their iterators    
LWG-3381 begin and data must agree for contiguous_range    
LWG-3384 transform_view::sentinel has an incorrect operator-    
LWG-3385 common_iterator is not sufficiently constrained for non-copyable iterators    
LWG-3387 [range.reverse.view] reverse_view<V> unintentionally requires range<const V>    
LWG-3388 view iterator types have ill-formed <=> operators    
LWG-3389 A move-only iterator still does not have a counted_iterator    
LWG-3397 ranges::basic_istream_view::iterator should not provide iterator_category    
LWG-3398 tuple_element_t is also wrong for const subrange    
LWG-3474 Nesting join_views is broken because of CTAD    
LWG-3500 join_view::iterator::operator->() is bogus    
LWG-3505 split_view::outer-iterator::operator++ misspecified