Skip to content
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f81e4a3
[libc++][ranges] P3060R3: Add `std::views::indices(n)`
H-G-Hristov Jul 3, 2025
3e9593d
Implement and cleanup
H-G-Hristov Jul 3, 2025
1572f7a
Update version
H-G-Hristov Jul 3, 2025
a27ae43
Add release notes
H-G-Hristov Jul 3, 2025
a647295
Cleanup
H-G-Hristov Jul 3, 2025
9f06e29
House keeping
H-G-Hristov Jul 3, 2025
35c8579
Addressed review comments
H-G-Hristov Jul 3, 2025
b0c1a84
Update libcxx/modules/std/ranges.inc
Zingam Jul 4, 2025
4fbdb9f
Made the lambda `static`
H-G-Hristov Jul 4, 2025
3c56946
Updated status
H-G-Hristov Jul 13, 2025
af7fe91
Update test
H-G-Hristov Jul 13, 2025
cd478e8
LLVM22
H-G-Hristov Jul 22, 2025
f0bad15
Update libcxx/docs/ReleaseNotes/22.rst
H-G-Hristov Jul 22, 2025
ec1fc1a
Update CPO test
H-G-Hristov Jul 25, 2025
09d1f47
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
H-G-Hristov Aug 11, 2025
174c4c1
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
Zingam Aug 16, 2025
5931d85
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
H-G-Hristov Aug 20, 2025
87c7885
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
H-G-Hristov Aug 25, 2025
9610de0
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
Zingam Sep 3, 2025
34f7565
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
Zingam Sep 4, 2025
38efb3c
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
Zingam Sep 4, 2025
915f38f
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
Zingam Sep 5, 2025
b995e9a
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
H-G-Hristov Sep 10, 2025
b587330
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
H-G-Hristov Sep 29, 2025
cbc4ff6
Updated test
H-G-Hristov Sep 29, 2025
df9ac54
Update libcxx/test/std/ranges/range.factories/range.iota.view/indices…
Zingam Sep 30, 2025
394a10c
Update libcxx/test/std/ranges/range.factories/range.iota.view/indices…
Zingam Sep 30, 2025
e55641b
Merge branch 'main' into hgh/libcxx/P3060R3-Add-std_views_indices
H-G-Hristov Sep 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions libcxx/docs/FeatureTestMacroTable.rst
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,8 @@ Status
---------------------------------------------------------- -----------------
``__cpp_lib_ranges_concat`` *unimplemented*
---------------------------------------------------------- -----------------
``__cpp_lib_ranges_indices`` ``202506L``
---------------------------------------------------------- -----------------
``__cpp_lib_ratio`` ``202306L``
---------------------------------------------------------- -----------------
``__cpp_lib_rcu`` *unimplemented*
Expand Down
1 change: 1 addition & 0 deletions libcxx/docs/ReleaseNotes/22.rst
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ Implemented Papers
- P2321R2: ``zip`` (`Github <https://llvm.org/PR105169>`__) (The paper is partially implemented. ``zip_transform_view``
is implemented in this release)
- P3044R2: sub-``string_view`` from ``string`` (`Github <https://llvm.org/PR148140>`__)
- P3060R3: Add ``std::views::indices(n)`` (`Github <https://llvm.org/PR148175>`__)
- P3168R2: Give ``std::optional`` Range Support (`Github <https://llvm.org/PR105430>`__)

Improvements and New Features
Expand Down
2 changes: 1 addition & 1 deletion libcxx/docs/Status/Cxx2cPapers.csv
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@
"`P3503R3 <https://wg21.link/P3503R3>`__","Make type-erased allocator use in ``promise`` and ``packaged_task`` consistent","2025-06 (Sofia)","","","`#148164 <https://github.com/llvm/llvm-project/issues/148164>`__",""
"`P3008R6 <https://wg21.link/P3008R6>`__","Atomic floating-point min/max","2025-06 (Sofia)","","","`#148168 <https://github.com/llvm/llvm-project/issues/148168>`__",""
"`P3111R8 <https://wg21.link/P3111R8>`__","Atomic Reduction Operations","2025-06 (Sofia)","","","`#148174 <https://github.com/llvm/llvm-project/issues/148174>`__",""
"`P3060R3 <https://wg21.link/P3060R3>`__","Add ``std::views::indices(n)``","2025-06 (Sofia)","","","`#148175 <https://github.com/llvm/llvm-project/issues/148175>`__",""
"`P3060R3 <https://wg21.link/P3060R3>`__","Add ``std::views::indices(n)``","2025-06 (Sofia)","|Complete|","22","`#148175 <https://github.com/llvm/llvm-project/issues/148175>`__",""
"`P2319R5 <https://wg21.link/P2319R5>`__","Prevent ``path`` presentation problems","2025-06 (Sofia)","","","`#148177 <https://github.com/llvm/llvm-project/issues/148177>`__",""
"`P3223R2 <https://wg21.link/P3223R2>`__","Making ``std::istream::ignore`` less surprising","2025-06 (Sofia)","","","`#148178 <https://github.com/llvm/llvm-project/issues/148178>`__",""
"`P2781R9 <https://wg21.link/P2781R9>`__","``std::constant_wrapper``","2025-06 (Sofia)","","","`#148179 <https://github.com/llvm/llvm-project/issues/148179>`__",""
Expand Down
9 changes: 9 additions & 0 deletions libcxx/include/__ranges/iota_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,15 @@ struct __fn {
inline namespace __cpo {
inline constexpr auto iota = __iota::__fn{};
} // namespace __cpo

# if _LIBCPP_STD_VER >= 26

inline constexpr auto indices = [](__integer_like auto __size) static {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think libc++ provides any (cv-unqualified) __integer_like but not weakly_incrementable type at this moment. So, no change requested at this moment. Although the operator() will need to be constrained harder once libc++ starts to provide such an integer-class type.

return ranges::views::iota(decltype(__size){}, __size);
};

# endif

} // namespace views
} // namespace ranges

Expand Down
5 changes: 5 additions & 0 deletions libcxx/include/ranges
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,11 @@ namespace std::ranges {
template<class W, class Bound>
inline constexpr bool enable_borrowed_range<iota_view<W, Bound>> = true;

namespace views {
inline constexpr unspecified iota = unspecified;
inline constexpr unspecified indices = unspecified; // Since C++26
}

// [range.repeat], repeat view
template<class T>
concept integer-like-with-usable-difference-type = // exposition only
Expand Down
2 changes: 2 additions & 0 deletions libcxx/include/version
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ __cpp_lib_ranges_chunk_by 202202L <ranges>
__cpp_lib_ranges_concat 202403L <ranges>
__cpp_lib_ranges_contains 202207L <algorithm>
__cpp_lib_ranges_find_last 202207L <algorithm>
__cpp_lib_ranges_indices 202506L <ranges>
__cpp_lib_ranges_iota 202202L <numeric>
__cpp_lib_ranges_join_with 202202L <ranges>
__cpp_lib_ranges_repeat 202207L <ranges>
Expand Down Expand Up @@ -591,6 +592,7 @@ __cpp_lib_void_t 201411L <type_traits>
# define __cpp_lib_out_ptr 202311L
// # define __cpp_lib_philox_engine 202406L
// # define __cpp_lib_ranges_concat 202403L
# define __cpp_lib_ranges_indices 202506L
# define __cpp_lib_ratio 202306L
// # define __cpp_lib_rcu 202306L
# define __cpp_lib_reference_wrapper 202403L
Expand Down
3 changes: 3 additions & 0 deletions libcxx/modules/std/ranges.inc
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@ export namespace std {

namespace views {
using std::ranges::views::iota;
#if _LIBCPP_STD_VER >= 26
using std::ranges::views::indices;
#endif
} // namespace views

#if _LIBCPP_STD_VER >= 23
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@
# error "__cpp_lib_ranges_concat should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should not be defined before c++23"
# endif
Expand Down Expand Up @@ -98,6 +102,10 @@
# error "__cpp_lib_ranges_concat should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should not be defined before c++23"
# endif
Expand Down Expand Up @@ -148,6 +156,10 @@
# error "__cpp_lib_ranges_concat should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should not be defined before c++23"
# endif
Expand Down Expand Up @@ -201,6 +213,10 @@
# error "__cpp_lib_ranges_concat should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should not be defined before c++23"
# endif
Expand Down Expand Up @@ -278,6 +294,10 @@
# error "__cpp_lib_ranges_concat should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should not be defined before c++26"
# endif

# ifndef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should be defined in c++23"
# endif
Expand Down Expand Up @@ -400,6 +420,13 @@
# endif
# endif

# ifndef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should be defined in c++26"
# endif
# if __cpp_lib_ranges_indices != 202506L
# error "__cpp_lib_ranges_indices should have the value 202506L in c++26"
# endif

# ifndef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should be defined in c++26"
# endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,10 @@
# error "__cpp_lib_ranges_find_last should not be defined before c++23"
# endif

# ifdef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_iota
# error "__cpp_lib_ranges_iota should not be defined before c++23"
# endif
Expand Down Expand Up @@ -1608,6 +1612,10 @@
# error "__cpp_lib_ranges_find_last should not be defined before c++23"
# endif

# ifdef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_iota
# error "__cpp_lib_ranges_iota should not be defined before c++23"
# endif
Expand Down Expand Up @@ -2723,6 +2731,10 @@
# error "__cpp_lib_ranges_find_last should not be defined before c++23"
# endif

# ifdef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_iota
# error "__cpp_lib_ranges_iota should not be defined before c++23"
# endif
Expand Down Expand Up @@ -4111,6 +4123,10 @@
# error "__cpp_lib_ranges_find_last should not be defined before c++23"
# endif

# ifdef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_iota
# error "__cpp_lib_ranges_iota should not be defined before c++23"
# endif
Expand Down Expand Up @@ -5694,6 +5710,10 @@
# error "__cpp_lib_ranges_find_last should have the value 202207L in c++23"
# endif

# ifdef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should not be defined before c++26"
# endif

# ifndef __cpp_lib_ranges_iota
# error "__cpp_lib_ranges_iota should be defined in c++23"
# endif
Expand Down Expand Up @@ -7610,6 +7630,13 @@
# error "__cpp_lib_ranges_find_last should have the value 202207L in c++26"
# endif

# ifndef __cpp_lib_ranges_indices
# error "__cpp_lib_ranges_indices should be defined in c++26"
# endif
# if __cpp_lib_ranges_indices != 202506L
# error "__cpp_lib_ranges_indices should have the value 202506L in c++26"
# endif

# ifndef __cpp_lib_ranges_iota
# error "__cpp_lib_ranges_iota should be defined in c++26"
# endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ static_assert(test(std::ranges::ssize, a));
// views::empty<T> is not a CPO
static_assert(test(std::views::iota, 1));
static_assert(test(std::views::iota, 1, 10));
#if TEST_STD_VER >= 26
static_assert(test(std::views::indices, 10));
#endif
#ifndef TEST_HAS_NO_LOCALIZATION
static_assert(test(std::views::istream<int>, stream));
#endif
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// REQUIRES: std-at-least-c++26

// ranges

// inline constexpr unspecified indices = unspecified;

#include <cassert>
#include <cstddef>
#include <ranges>
#include <vector>

#include "test_macros.h"
#define TEST_HAS_NO_INT128 // Size cannot be larger than 64 bits
#include "type_algorithms.h"

#include "types.h"

// Test SFINAE.

template <typename SizeType>
concept HasIndices = requires(SizeType s) { std::ranges::views::indices(s); };

struct NotIntegerLike {};

void test_SFINAE() {
static_assert(HasIndices<std::size_t>);
types::for_each(types::integer_types(), []<typename T> { static_assert(HasIndices<T>); });

// Non-integer-like types should not satisfy HasIndices
static_assert(!HasIndices<bool>);
static_assert(!HasIndices<float>);
static_assert(!HasIndices<void>);
static_assert(!HasIndices<SomeInt>); // Does satisfy is_integer_like, but not the conversion to std::size_t
static_assert(!HasIndices<NotIntegerLike>);
}

constexpr bool test() {
{
auto indices_view = std::ranges::views::indices(5);
static_assert(std::ranges::range<decltype(indices_view)>);

assert(indices_view.size() == 5);

assert(indices_view[0] == 0);
assert(indices_view[1] == 1);
assert(indices_view[2] == 2);
assert(indices_view[3] == 3);
assert(indices_view[4] == 4);
}

{
std::vector v(5, 0);

auto indices_view = std::ranges::views::indices(std::ranges::size(v));
static_assert(std::ranges::range<decltype(indices_view)>);

assert(indices_view.size() == 5);

assert(indices_view[0] == 0);
assert(indices_view[1] == 1);
assert(indices_view[2] == 2);
assert(indices_view[3] == 3);
assert(indices_view[4] == 4);
}

{
std::vector v(5, SomeInt{});

auto indices_view = std::ranges::views::indices(std::ranges::size(v));
static_assert(std::ranges::range<decltype(indices_view)>);

assert(indices_view.size() == 5);

assert(indices_view[0] == 0);
assert(indices_view[1] == 1);
assert(indices_view[2] == 2);
assert(indices_view[3] == 3);
assert(indices_view[4] == 4);
}

return true;
}

int main(int, char**) {
test_SFINAE();

test();
static_assert(test());

return 0;
}
5 changes: 5 additions & 0 deletions libcxx/utils/generate_feature_test_macro_components.py
Original file line number Diff line number Diff line change
Expand Up @@ -1113,6 +1113,11 @@ def add_version_header(tc):
"values": {"c++23": 202207},
"headers": ["algorithm"],
},
{
"name": "__cpp_lib_ranges_indices",
"values": {"c++26": 202506},
"headers": ["ranges"],
},
{
"name": "__cpp_lib_ranges_iota",
"values": {"c++23": 202202},
Expand Down
Loading