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

[range.cmp]

None

Zoe Carver

[readable.traits]

None

Christopher Di Bella

[incrementable.traits]

Christopher Di Bella

[iterator.traits]

Updates to iterator_traits

indirectly_readable_traits
incrementable_traits

Christopher Di Bella

[special.mem.concepts]

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

[specialized.algorithms]

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

[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

indirectly_copyable
indirectly_copyable_storable

[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

[range.iter.ops]

[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

[range.access]

ranges::rbegin
ranges::rend
ranges::crbegin
ranges::crend
ranges::cdata

[iterator.concepts]

Christopher Di Bella and Zoe Carver

In progress

[range.range]

[range.access]

Christopher Di Bella

[range.sized]

[range.primitives]
[range.range]

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

[range.utility.helpers]

simple-view
has-arrow
not-same-as
[range.range]
[iterator.concept.input]

Zoe Carver

[view.interface]

ranges::view_interface

[ranges.range]
[range.view]
[range.iterator.op.prev]
[range.refinements]

Zoe Carver

[range.subrange]

ranges::subrange

[view.interface]

Zoe Carver

[range.dangling]

ranges::dangling
ranges::borrowed_iterator_t
ranges::borrowed_subrange_t
[range.range]
[range.subrange]

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]

Louis Dionne

Not started

[range.take]

take_view

[range.all]

Zoe Carver

In Progress

[range.join]

join_view

[range.all]

Christopher Di Bella

Not started

[range.empty]

empty_view

[view.interface]

Zoe Carver

[range.single]

single_view

[view.interface]

Zoe Carver

In Progress

[range.split]

split_view

[range.all]

Unassigned

Not started

[range.counted]

view::counted

[range.subrange]

Zoe Carver

Not started

[range.common]

common_view

[range.all]

Zoe Carver

[range.reverse]

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

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

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