Skip to content

Commit 646ad89

Browse files
authored
[libc++] Unify __can_reference and __is_referenceable_v (#133278)
Both traits do the same thing. This patch renames __can_reference to __referenceable and moves it to the is_referenceable header.
1 parent fa5025b commit 646ad89

File tree

6 files changed

+17
-13
lines changed

6 files changed

+17
-13
lines changed

libcxx/include/__iterator/common_iterator.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <__memory/addressof.h>
2929
#include <__type_traits/conditional.h>
3030
#include <__type_traits/is_pointer.h>
31+
#include <__type_traits/is_referenceable.h>
3132
#include <__utility/declval.h>
3233
#include <variant>
3334

@@ -157,7 +158,7 @@ class common_iterator {
157158
++*this;
158159
return __tmp;
159160
} else if constexpr (requires(_Iter& __i) {
160-
{ *__i++ } -> __can_reference;
161+
{ *__i++ } -> __referenceable;
161162
} || !__can_use_postfix_proxy<_Iter>) {
162163
return std::__unchecked_get<_Iter>(__hold_)++;
163164
} else {

libcxx/include/__iterator/concepts.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include <__type_traits/is_pointer.h>
3939
#include <__type_traits/is_primary_template.h>
4040
#include <__type_traits/is_reference.h>
41+
#include <__type_traits/is_referenceable.h>
4142
#include <__type_traits/remove_cv.h>
4243
#include <__type_traits/remove_cvref.h>
4344
#include <__utility/forward.h>
@@ -132,7 +133,7 @@ concept incrementable = regular<_Ip> && weakly_incrementable<_Ip> && requires(_I
132133
// [iterator.concept.iterator]
133134
template <class _Ip>
134135
concept input_or_output_iterator = requires(_Ip __i) {
135-
{ *__i } -> __can_reference;
136+
{ *__i } -> __referenceable;
136137
} && weakly_incrementable<_Ip>;
137138

138139
// [iterator.concept.sentinel]

libcxx/include/__iterator/iter_move.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <__config>
1515
#include <__iterator/iterator_traits.h>
1616
#include <__type_traits/is_reference.h>
17+
#include <__type_traits/is_referenceable.h>
1718
#include <__type_traits/remove_cvref.h>
1819
#include <__utility/declval.h>
1920
#include <__utility/forward.h>
@@ -90,7 +91,7 @@ inline constexpr auto iter_move = __iter_move::__fn{};
9091

9192
template <__dereferenceable _Tp>
9293
requires requires(_Tp& __t) {
93-
{ ranges::iter_move(__t) } -> __can_reference;
94+
{ ranges::iter_move(__t) } -> __referenceable;
9495
}
9596
using iter_rvalue_reference_t = decltype(ranges::iter_move(std::declval<_Tp&>()));
9697

libcxx/include/__iterator/iterator_traits.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include <__type_traits/is_object.h>
3333
#include <__type_traits/is_primary_template.h>
3434
#include <__type_traits/is_reference.h>
35+
#include <__type_traits/is_referenceable.h>
3536
#include <__type_traits/is_valid_expansion.h>
3637
#include <__type_traits/nat.h>
3738
#include <__type_traits/remove_const.h>
@@ -48,15 +49,9 @@ _LIBCPP_BEGIN_NAMESPACE_STD
4849

4950
#if _LIBCPP_STD_VER >= 20
5051

51-
template <class _Tp>
52-
using __with_reference _LIBCPP_NODEBUG = _Tp&;
53-
54-
template <class _Tp>
55-
concept __can_reference = requires { typename __with_reference<_Tp>; };
56-
5752
template <class _Tp>
5853
concept __dereferenceable = requires(_Tp& __t) {
59-
{ *__t } -> __can_reference; // not required to be equality-preserving
54+
{ *__t } -> __referenceable; // not required to be equality-preserving
6055
};
6156

6257
// [iterator.traits]
@@ -138,9 +133,9 @@ struct __has_iterator_typedefs {
138133
namespace __iterator_traits_detail {
139134
template <class _Ip>
140135
concept __cpp17_iterator = requires(_Ip __i) {
141-
{ *__i } -> __can_reference;
136+
{ *__i } -> __referenceable;
142137
{ ++__i } -> same_as<_Ip&>;
143-
{ *__i++ } -> __can_reference;
138+
{ *__i++ } -> __referenceable;
144139
} && copyable<_Ip>;
145140

146141
template <class _Ip>

libcxx/include/__ranges/transform_view.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include <__type_traits/is_nothrow_constructible.h>
3939
#include <__type_traits/is_object.h>
4040
#include <__type_traits/is_reference.h>
41+
#include <__type_traits/is_referenceable.h>
4142
#include <__type_traits/maybe_const.h>
4243
#include <__type_traits/remove_cvref.h>
4344
#include <__utility/forward.h>
@@ -63,7 +64,7 @@ concept __regular_invocable_with_range_ref = regular_invocable<_Fn, range_refere
6364
template <class _View, class _Fn>
6465
concept __transform_view_constraints =
6566
view<_View> && is_object_v<_Fn> && regular_invocable<_Fn&, range_reference_t<_View>> &&
66-
__can_reference<invoke_result_t<_Fn&, range_reference_t<_View>>>;
67+
__is_referenceable_v<invoke_result_t<_Fn&, range_reference_t<_View>>>;
6768

6869
# if _LIBCPP_STD_VER >= 23
6970
template <input_range _View, move_constructible _Fn>

libcxx/include/__type_traits/is_referenceable.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ inline const bool __is_referenceable_v = false;
2424
template <class _Tp>
2525
inline const bool __is_referenceable_v<_Tp, __void_t<_Tp&> > = true;
2626

27+
#if _LIBCPP_STD_VER >= 20
28+
template <class _Tp>
29+
concept __referenceable = __is_referenceable_v<_Tp>;
30+
#endif
31+
2732
_LIBCPP_END_NAMESPACE_STD
2833

2934
#endif // _LIBCPP___TYPE_TRAITS_IS_REFERENCEABLE_H

0 commit comments

Comments
 (0)