-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[libc++][ranges] P2164R9: Implements views::enumerate
#73617
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
H-G-Hristov
wants to merge
94
commits into
llvm:main
Choose a base branch
from
H-G-Hristov:hgh/libcxx/P2164R9-ranges-enumerate_view
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 1 commit
Commits
Show all changes
94 commits
Select commit
Hold shift + click to select a range
75fe088
[libc++][ranges] P2116R9: Implements `views::enumerate`
Zingam 5d9b919
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
Zingam bb520bc
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
Zingam eb53557
WIP: Commented out improperly completed tests temporarily
Zingam 8f922d1
WIP: Addressed comments
Zingam 9a9f5d3
WIP: nothing
Zingam 9d51f6c
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
Zingam 3b5f9f3
WIP: Address comment in `adaptor.pass.cpp`
Zingam 20c59fb
WIP: tweak
Zingam 963aa35
WIP: Addressed some comments
Zingam 6c1146b
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
Zingam 2870bbe
REMOVED: Commented out broken test (Restore them later)
Zingam 8a02a2e
WIP: Fixed formatting
Zingam 2dccd6c
WIP: Addressed some comments
Zingam b922f91
WIP: Addressed comments in iterator/subscript
Zingam 2d7982f
WIP: Updated iterator/artithmetic.pass
Zingam 9cfed98
WIP: do not push
Zingam 0c80538
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
Zingam 5089669
Fixed LLVM target version
Zingam 44cb342
Fixed CI
Zingam b4813f0
Fixed formatting
Zingam 2c66334
Refactoring
H-G-Hristov deda69d
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov cc7e27a
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 251e8ae
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 9c2019b
Generated files
H-G-Hristov 35db57f
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov c176417
Mark members `[[nodiscard]] `
H-G-Hristov 645b5ce
Mark more members as `[[nodiscard]] `
H-G-Hristov 16f2c8c
More `[[nodiscard]] `
H-G-Hristov 124eab9
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov ef591c5
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov d9bdafc
Updated Release Notes
H-G-Hristov 28592f6
Merge remote-tracking branch 'origin/main' into hgh/libcxx/P2164R9-ra…
H-G-Hristov 1ccf784
Fixed [[nodiscard]]
H-G-Hristov 2757c72
Try again
H-G-Hristov 459b1e5
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 4d9aa3f
Try again
H-G-Hristov 44fc950
Removed excessive `[[nodiscard]]`, which is not practical on incremen…
H-G-Hristov 805331b
Cleanup
H-G-Hristov cd1eb6b
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 856d129
Try to fix CI
H-G-Hristov 0d1c1d8
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 5616879
WIP - nodiscard tests
H-G-Hristov 547e1e5
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 43f0018
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov ab93ac3
WIP - nodiscard tests
H-G-Hristov 62621dd
WIP - nodiscard tests
H-G-Hristov 8b98539
WIP - nodiscard tests
H-G-Hristov 7eb8c3a
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 82fd225
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 6f83477
WIP - nodiscard tests
H-G-Hristov a0551a5
Updated `nodiscard` tests
H-G-Hristov 66b1019
Cleaned `nodiscard` tests
H-G-Hristov 4e9c874
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 6449bc9
Minor tweaks
H-G-Hristov b6bceeb
Minor tweak
H-G-Hristov d537977
Formatting
H-G-Hristov d7e7c91
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
Zingam b699d75
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
Zingam 1a1162d
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 8f2d945
Post merge fixes
H-G-Hristov dd8cb11
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
Zingam 749357a
Post-merge fixes
H-G-Hristov daf5f9e
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
Zingam 9c20572
Try to fix build
H-G-Hristov 4c5d08b
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
Zingam c6fed09
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov a2ed592
Update status pages
H-G-Hristov 4d86aaa
Fixed formatting
H-G-Hristov a103387
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov f205395
Implemented LWG3919
H-G-Hristov 31ddab0
Try to fix CI: mark internal aliases `_LIBCPP_NODEBUG`
H-G-Hristov 12e9cbb
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 1d21194
Try again
H-G-Hristov a5be216
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov fbd197a
Try again
H-G-Hristov d3afb06
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 6056552
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov d98841b
Update libcxx/test/std/ranges/range.adaptors/range.enumerate/types.h
H-G-Hristov f964234
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 9406fee
Run generator scripts
H-G-Hristov 80e3496
Apply frederick-js's suggestion to fix CI
H-G-Hristov cb285a1
Use new syntax `// REQUIRES: std-at-least-c++23`
H-G-Hristov da79bbc
Try to fix tests
H-G-Hristov 7c0bf4f
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov a6b030a
Try again
H-G-Hristov bfb4ae6
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 9f630c4
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 790089c
LLVM22
H-G-Hristov 3d95751
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov 4c1eb2c
CPO test
H-G-Hristov dc183b0
Updated CPO test
H-G-Hristov b887a1b
Merge branch 'main' into hgh/libcxx/P2164R9-ranges-enumerate_view
H-G-Hristov File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,333 @@ | ||
// -*- C++ -*- | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// 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 | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef _LIBCPP___RANGES_ENUMERATE_VIEW_H | ||
#define _LIBCPP___RANGES_ENUMERATE_VIEW_H | ||
|
||
#include <__concepts/convertible_to.h> | ||
#include <__config> | ||
#include <__iterator/concepts.h> | ||
#include <__iterator/distance.h> | ||
#include <__iterator/iter_move.h> | ||
#include <__iterator/iterator_traits.h> | ||
#include <__ranges/access.h> | ||
#include <__ranges/all.h> | ||
#include <__ranges/concepts.h> | ||
#include <__ranges/enable_borrowed_range.h> | ||
#include <__ranges/range_adaptor.h> | ||
#include <__ranges/size.h> | ||
#include <__ranges/view_interface.h> | ||
#include <__type_traits/maybe_const.h> | ||
#include <__utility/forward.h> | ||
#include <__utility/move.h> | ||
#include <tuple> | ||
|
||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | ||
# pragma GCC system_header | ||
#endif | ||
|
||
_LIBCPP_BEGIN_NAMESPACE_STD | ||
|
||
#if _LIBCPP_STD_VER >= 23 | ||
|
||
namespace ranges { | ||
|
||
// [concept.object] | ||
|
||
template <class _Rp> | ||
concept __range_with_movable_references = | ||
ranges::input_range<_Rp> && std::move_constructible<ranges::range_reference_t<_Rp>> && | ||
std::move_constructible<ranges::range_rvalue_reference_t<_Rp>>; | ||
|
||
// [range.enumerate.view] | ||
|
||
template <view _View> | ||
requires __range_with_movable_references<_View> | ||
class enumerate_view : public view_interface<enumerate_view<_View>> { | ||
_View __base_ = _View(); | ||
|
||
// [range.enumerate.iterator] | ||
template <bool _Const> | ||
class __iterator; | ||
|
||
// [range.enumerate.sentinel] | ||
template <bool _Const> | ||
class __sentinel; | ||
|
||
template <bool _AnyConst> | ||
_LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto) __get_current(const __iterator<_AnyConst>& __iter) { | ||
return (__iter.__current_); | ||
} | ||
H-G-Hristov marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
||
public: | ||
_LIBCPP_HIDE_FROM_ABI constexpr enumerate_view() | ||
requires(default_initializable<_View>) | ||
H-G-Hristov marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
= default; | ||
_LIBCPP_HIDE_FROM_ABI constexpr explicit enumerate_view(_View __base) : __base_(std::move(__base)){}; | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr auto begin() | ||
requires(!__simple_view<_View>) | ||
{ | ||
return __iterator<false>(ranges::begin(__base_), 0); | ||
} | ||
_LIBCPP_HIDE_FROM_ABI constexpr auto begin() const | ||
requires __range_with_movable_references<const _View> | ||
{ | ||
return __iterator<true>(ranges::begin(__base_), 0); | ||
} | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr auto end() | ||
requires(!__simple_view<_View>) | ||
{ | ||
if constexpr (common_range<_View> && sized_range<_View>) | ||
return __iterator<false>(ranges::end(__base_), ranges::distance(__base_)); | ||
else | ||
return __sentinel<false>(ranges::end(__base_)); | ||
} | ||
_LIBCPP_HIDE_FROM_ABI constexpr auto end() const | ||
requires __range_with_movable_references<const _View> | ||
{ | ||
if constexpr (common_range<const _View> && sized_range<const _View>) | ||
return __iterator<true>(ranges::end(__base_), ranges::distance(__base_)); | ||
else | ||
return __sentinel<true>(ranges::end(__base_)); | ||
} | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr auto size() | ||
requires sized_range<_View> | ||
{ | ||
return ranges::size(__base_); | ||
} | ||
_LIBCPP_HIDE_FROM_ABI constexpr auto size() const | ||
requires sized_range<const _View> | ||
{ | ||
return ranges::size(__base_); | ||
} | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr _View base() const& | ||
requires copy_constructible<_View> | ||
{ | ||
return __base_; | ||
} | ||
_LIBCPP_HIDE_FROM_ABI constexpr _View base() && { return std::move(__base_); } | ||
}; | ||
|
||
template <class _Range> | ||
enumerate_view(_Range&&) -> enumerate_view<views::all_t<_Range>>; | ||
|
||
// [range.enumerate.iterator] | ||
|
||
template <view _View> | ||
requires __range_with_movable_references<_View> | ||
template <bool _Const> | ||
class enumerate_view<_View>::__iterator { | ||
using _Base = __maybe_const<_Const, _View>; | ||
|
||
static consteval auto __get_iterator_concept() { | ||
if constexpr (random_access_range<_Base>) { | ||
return random_access_iterator_tag{}; | ||
} else if constexpr (bidirectional_range<_Base>) { | ||
return bidirectional_iterator_tag{}; | ||
} else if constexpr (forward_range<_Base>) { | ||
return forward_iterator_tag{}; | ||
} else { | ||
return input_iterator_tag{}; | ||
} | ||
} | ||
|
||
friend class enumerate_view<_View>; | ||
|
||
public: | ||
using iterator_category = input_iterator_tag; | ||
using iterator_concept = decltype(__get_iterator_concept()); | ||
using difference_type = range_difference_t<_Base>; | ||
using value_type = tuple<difference_type, range_value_t<_Base>>; | ||
|
||
private: | ||
using __reference_type = tuple<difference_type, range_reference_t<_Base>>; | ||
iterator_t<_Base> __current_ = iterator_t<_Base>(); | ||
difference_type __pos_ = 0; | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr explicit __iterator(iterator_t<_Base> __current, difference_type __pos) | ||
: __current_(std::move(__current)), __pos_(__pos) {} | ||
|
||
public: | ||
_LIBCPP_HIDE_FROM_ABI __iterator() | ||
requires(default_initializable<iterator_t<_Base>>) | ||
H-G-Hristov marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
= default; | ||
_LIBCPP_HIDE_FROM_ABI constexpr __iterator(__iterator<!_Const> __i) | ||
requires _Const && convertible_to<iterator_t<_View>, iterator_t<_Base>> | ||
: __current_(std::move(__i.__current_)), __pos_(__i.__pos_) {} | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr const iterator_t<_Base>& base() const& noexcept { return __current_; } | ||
_LIBCPP_HIDE_FROM_ABI constexpr iterator_t<_Base> base() && { return std::move(__current_); } | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr difference_type index() const noexcept { return __pos_; } | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr auto operator*() const { return __reference_type(__pos_, *__current_); } | ||
H-G-Hristov marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator++() { | ||
++__current_; | ||
++__pos_; | ||
return *this; | ||
} | ||
_LIBCPP_HIDE_FROM_ABI constexpr void operator++(int) { return ++*this; } | ||
_LIBCPP_HIDE_FROM_ABI constexpr __iterator operator++(int) | ||
cjdb marked this conversation as resolved.
Show resolved
Hide resolved
|
||
requires forward_range<_Base> | ||
{ | ||
auto __temp = *this; | ||
++*this; | ||
return __temp; | ||
} | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator--() | ||
requires bidirectional_range<_Base> | ||
{ | ||
--__current_; | ||
--__pos_; | ||
return *this; | ||
} | ||
_LIBCPP_HIDE_FROM_ABI constexpr __iterator operator--(int) | ||
cjdb marked this conversation as resolved.
Show resolved
Hide resolved
|
||
requires bidirectional_range<_Base> | ||
{ | ||
auto __temp = *this; | ||
--*this; | ||
return *__temp; | ||
} | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator+=(difference_type __n) | ||
requires random_access_range<_Base> | ||
{ | ||
__current_ += __n; | ||
__pos_ += __n; | ||
return *this; | ||
} | ||
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator-=(difference_type __n) | ||
requires random_access_range<_Base> | ||
{ | ||
__current_ -= __n; | ||
__pos_ -= __n; | ||
return *this; | ||
} | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr auto operator[](difference_type __n) const | ||
H-G-Hristov marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
requires random_access_range<_Base> | ||
{ | ||
return __reference_type(__pos_ + __n, __current_[__n]); | ||
} | ||
|
||
_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const __iterator& __x, const __iterator& __y) noexcept { | ||
return __x.__pos_ == __y.__pos_; | ||
} | ||
_LIBCPP_HIDE_FROM_ABI friend constexpr strong_ordering | ||
operator<=>(const __iterator& __x, const __iterator& __y) noexcept { | ||
return __x.__pos_ <=> __y.__pos_; | ||
} | ||
|
||
_LIBCPP_HIDE_FROM_ABI friend constexpr __iterator operator+(const __iterator& __i, difference_type __n) | ||
requires random_access_range<_Base> | ||
{ | ||
auto __temp = __i; | ||
__temp += __n; | ||
return __temp; | ||
} | ||
_LIBCPP_HIDE_FROM_ABI friend constexpr __iterator operator+(difference_type __n, const __iterator& __i) | ||
requires random_access_range<_Base> | ||
{ | ||
return __i + __n; | ||
} | ||
_LIBCPP_HIDE_FROM_ABI friend constexpr __iterator operator-(const __iterator& __i, difference_type __n) | ||
requires random_access_range<_Base> | ||
{ | ||
auto __temp = __i; | ||
__temp -= __n; | ||
return __temp; | ||
} | ||
_LIBCPP_HIDE_FROM_ABI friend constexpr difference_type | ||
operator-(const __iterator& __x, const __iterator& __y) noexcept { | ||
return __x.__pos_ - __y.__pos_; | ||
} | ||
|
||
_LIBCPP_HIDE_FROM_ABI friend constexpr auto iter_move(const __iterator& __i) noexcept( | ||
H-G-Hristov marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
noexcept(ranges::iter_move(__i.__current_)) && is_nothrow_move_constructible_v<range_rvalue_reference_t<_Base>>) { | ||
return tuple<difference_type, range_rvalue_reference_t<_Base>>(__i.__pos_, ranges::iter_move(__i.__current_)); | ||
} | ||
}; | ||
|
||
// [range.enumerate.sentinel] | ||
|
||
template <view _View> | ||
requires __range_with_movable_references<_View> | ||
template <bool _Const> | ||
class enumerate_view<_View>::__sentinel { | ||
using _Base = __maybe_const<_Const, _View>; | ||
sentinel_t<_Base> __end_ = sentinel_t<_Base>(); | ||
_LIBCPP_HIDE_FROM_ABI constexpr explicit __sentinel(sentinel_t<_Base> __end) : __end_(std::move(__end)) {} | ||
|
||
friend class enumerate_view<_View>; | ||
|
||
public: | ||
_LIBCPP_HIDE_FROM_ABI __sentinel() = default; | ||
_LIBCPP_HIDE_FROM_ABI constexpr __sentinel(__sentinel<!_Const> __other) | ||
requires _Const && convertible_to<sentinel_t<_View>, sentinel_t<_Base>> | ||
: __end_(std::move(__other.__end_)) {} | ||
|
||
_LIBCPP_HIDE_FROM_ABI constexpr sentinel_t<_Base> base() const { return __end_; } | ||
H-G-Hristov marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
||
template <bool _OtherConst> | ||
requires sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const<_OtherConst, _View>>> | ||
_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const __iterator<_OtherConst>& __x, const __sentinel& __y) { | ||
return __get_current(__x) == __y.__end_; | ||
} | ||
|
||
template <bool _OtherConst> | ||
requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const<_OtherConst, _View>>> | ||
_LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<__maybe_const<_OtherConst, _View>> | ||
H-G-Hristov marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
operator-(const __iterator<_OtherConst>& __x, const __sentinel& __y) { | ||
return __get_current(__x) - __y.__end_; | ||
} | ||
|
||
template <bool _OtherConst> | ||
requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<__maybe_const<_OtherConst, _View>>> | ||
_LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<__maybe_const<_OtherConst, _View>> | ||
operator-(const __sentinel& __x, const __iterator<_OtherConst>& __y) { | ||
H-G-Hristov marked this conversation as resolved.
Show resolved
Hide resolved
|
||
return __x.__end_ - __get_current(__y); | ||
} | ||
}; | ||
|
||
template <class _View> | ||
constexpr bool enable_borrowed_range<enumerate_view<_View>> = enable_borrowed_range<_View>; | ||
|
||
namespace views { | ||
namespace __enumerate { | ||
|
||
struct __fn : __range_adaptor_closure<__fn> { | ||
template <class _Range> | ||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Range&& __range) const | ||
H-G-Hristov marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
noexcept(noexcept(/**/ enumerate_view(std::forward<_Range>(__range)))) | ||
-> decltype(/*--*/ enumerate_view(std::forward<_Range>(__range))) { | ||
return /*-------------*/ enumerate_view(std::forward<_Range>(__range)); | ||
} | ||
}; | ||
|
||
} // namespace __enumerate | ||
|
||
inline namespace __cpo { | ||
|
||
inline constexpr auto enumerate = __enumerate::__fn{}; | ||
|
||
} // namespace __cpo | ||
} // namespace views | ||
} // namespace ranges | ||
|
||
#endif // _LIBCPP_STD_VER >= 23 | ||
|
||
_LIBCPP_END_NAMESPACE_STD | ||
|
||
#endif // _LIBCPP___RANGES_ENUMERATE_VIEW_H |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.