9
9
#ifndef _LIBCPP___RANGES_VIEW_INTERFACE_H
10
10
#define _LIBCPP___RANGES_VIEW_INTERFACE_H
11
11
12
+ #include < __concepts/derived_from.h>
13
+ #include < __concepts/same_as.h>
12
14
#include < __config>
13
15
#include < __debug>
14
16
#include < __iterator/concepts.h>
18
20
#include < __ranges/access.h>
19
21
#include < __ranges/concepts.h>
20
22
#include < __ranges/empty.h>
21
- #include < concepts>
22
23
#include < type_traits>
23
24
24
25
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -31,12 +32,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD
31
32
32
33
namespace ranges {
33
34
34
- template <class _Tp >
35
- concept __can_empty = requires (_Tp __t ) { ranges::empty (__t ); };
36
-
37
- template <class _Tp >
38
- void __implicitly_convert_to (type_identity_t <_Tp>) noexcept ;
39
-
40
35
template <class _Derived >
41
36
requires is_class_v<_Derived> && same_as<_Derived, remove_cv_t <_Derived>>
42
37
class view_interface {
@@ -55,15 +50,13 @@ class view_interface {
55
50
public:
56
51
template <class _D2 = _Derived>
57
52
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool empty ()
58
- noexcept (noexcept (__implicitly_convert_to<bool >(ranges::begin(__derived()) == ranges::end(__derived()))))
59
53
requires forward_range<_D2>
60
54
{
61
55
return ranges::begin (__derived ()) == ranges::end (__derived ());
62
56
}
63
57
64
58
template <class _D2 = _Derived>
65
59
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool empty () const
66
- noexcept (noexcept (__implicitly_convert_to<bool >(ranges::begin(__derived()) == ranges::end(__derived()))))
67
60
requires forward_range<const _D2>
68
61
{
69
62
return ranges::begin (__derived ()) == ranges::end (__derived ());
@@ -72,25 +65,22 @@ class view_interface {
72
65
template <class _D2 = _Derived>
73
66
_LIBCPP_HIDE_FROM_ABI
74
67
constexpr explicit operator bool ()
75
- noexcept (noexcept (ranges::empty(declval<_D2>())))
76
- requires __can_empty<_D2>
68
+ requires requires (_D2& __t ) { ranges::empty (__t ); }
77
69
{
78
70
return !ranges::empty (__derived ());
79
71
}
80
72
81
73
template <class _D2 = _Derived>
82
74
_LIBCPP_HIDE_FROM_ABI
83
75
constexpr explicit operator bool () const
84
- noexcept (noexcept (ranges::empty(declval<const _D2>())))
85
- requires __can_empty<const _D2>
76
+ requires requires (const _D2& __t ) { ranges::empty (__t ); }
86
77
{
87
78
return !ranges::empty (__derived ());
88
79
}
89
80
90
81
template <class _D2 = _Derived>
91
82
_LIBCPP_HIDE_FROM_ABI
92
83
constexpr auto data ()
93
- noexcept (noexcept (std::to_address(ranges::begin(__derived()))))
94
84
requires contiguous_iterator<iterator_t<_D2>>
95
85
{
96
86
return std::to_address (ranges::begin (__derived ()));
@@ -99,7 +89,6 @@ class view_interface {
99
89
template <class _D2 = _Derived>
100
90
_LIBCPP_HIDE_FROM_ABI
101
91
constexpr auto data () const
102
- noexcept (noexcept (std::to_address(ranges::begin(__derived()))))
103
92
requires range<const _D2> && contiguous_iterator<iterator_t<const _D2>>
104
93
{
105
94
return std::to_address (ranges::begin (__derived ()));
@@ -108,27 +97,22 @@ class view_interface {
108
97
template <class _D2 = _Derived>
109
98
_LIBCPP_HIDE_FROM_ABI
110
99
constexpr auto size ()
111
- noexcept (noexcept (ranges::end(__derived()) - ranges::begin(__derived())))
112
- requires forward_range<_D2>
113
- && sized_sentinel_for<sentinel_t<_D2>, iterator_t<_D2>>
100
+ requires forward_range<_D2> && sized_sentinel_for<sentinel_t<_D2>, iterator_t<_D2>>
114
101
{
115
102
return ranges::end (__derived ()) - ranges::begin (__derived ());
116
103
}
117
104
118
105
template <class _D2 = _Derived>
119
106
_LIBCPP_HIDE_FROM_ABI
120
107
constexpr auto size () const
121
- noexcept (noexcept (ranges::end(__derived()) - ranges::begin(__derived())))
122
- requires forward_range<const _D2>
123
- && sized_sentinel_for<sentinel_t<const _D2>, iterator_t<const _D2>>
108
+ requires forward_range<const _D2> && sized_sentinel_for<sentinel_t<const _D2>, iterator_t<const _D2>>
124
109
{
125
110
return ranges::end (__derived ()) - ranges::begin (__derived ());
126
111
}
127
112
128
113
template <class _D2 = _Derived>
129
114
_LIBCPP_HIDE_FROM_ABI
130
115
constexpr decltype (auto ) front()
131
- noexcept (noexcept (*ranges::begin (__derived())))
132
116
requires forward_range<_D2>
133
117
{
134
118
_LIBCPP_ASSERT (!empty (),
@@ -139,7 +123,6 @@ class view_interface {
139
123
template <class _D2 = _Derived>
140
124
_LIBCPP_HIDE_FROM_ABI
141
125
constexpr decltype (auto ) front() const
142
- noexcept (noexcept (*ranges::begin (__derived())))
143
126
requires forward_range<const _D2>
144
127
{
145
128
_LIBCPP_ASSERT (!empty (),
@@ -150,7 +133,6 @@ class view_interface {
150
133
template <class _D2 = _Derived>
151
134
_LIBCPP_HIDE_FROM_ABI
152
135
constexpr decltype (auto ) back()
153
- noexcept (noexcept (*ranges::prev (ranges::end(__derived()))))
154
136
requires bidirectional_range<_D2> && common_range<_D2>
155
137
{
156
138
_LIBCPP_ASSERT (!empty (),
@@ -161,7 +143,6 @@ class view_interface {
161
143
template <class _D2 = _Derived>
162
144
_LIBCPP_HIDE_FROM_ABI
163
145
constexpr decltype (auto ) back() const
164
- noexcept (noexcept (*ranges::prev (ranges::end(__derived()))))
165
146
requires bidirectional_range<const _D2> && common_range<const _D2>
166
147
{
167
148
_LIBCPP_ASSERT (!empty (),
@@ -172,15 +153,13 @@ class view_interface {
172
153
template <random_access_range _RARange = _Derived>
173
154
_LIBCPP_HIDE_FROM_ABI
174
155
constexpr decltype (auto ) operator[](range_difference_t <_RARange> __index)
175
- noexcept (noexcept (ranges::begin(__derived())[__index]))
176
156
{
177
157
return ranges::begin (__derived ())[__index];
178
158
}
179
159
180
160
template <random_access_range _RARange = const _Derived>
181
161
_LIBCPP_HIDE_FROM_ABI
182
162
constexpr decltype (auto ) operator[](range_difference_t <_RARange> __index) const
183
- noexcept (noexcept (ranges::begin(__derived())[__index]))
184
163
{
185
164
return ranges::begin (__derived ())[__index];
186
165
}
0 commit comments