{
using std::__detail::__class_or_enum;
- template<typename _Tp>
- constexpr decay_t<_Tp>
- __decay_copy(_Tp&& __t)
- noexcept(is_nothrow_convertible_v<_Tp, decay_t<_Tp>>)
- { return std::forward<_Tp>(__t); }
+ struct {
+ template<typename _Tp>
+ constexpr decay_t<_Tp>
+ operator()(_Tp&& __t) const
+ noexcept(is_nothrow_convertible_v<_Tp, decay_t<_Tp>>)
+ { return std::forward<_Tp>(__t); }
+ } inline constexpr __decay_copy{};
template<typename _Tp>
concept __member_begin = requires(_Tp& __t)
{
- { __cust_access::__decay_copy(__t.begin()) }
- -> input_or_output_iterator;
+ { __decay_copy(__t.begin()) } -> input_or_output_iterator;
};
// Poison pills so that unqualified lookup doesn't find std::begin.
concept __adl_begin = __class_or_enum<remove_reference_t<_Tp>>
&& requires(_Tp& __t)
{
- { __cust_access::__decay_copy(begin(__t)) }
- -> input_or_output_iterator;
+ { __decay_copy(begin(__t)) } -> input_or_output_iterator;
};
// Simplified version of std::ranges::begin that only supports lvalues,
namespace __cust_access
{
using std::ranges::__detail::__maybe_borrowed_range;
+ using std::__detail::__range_iter_t;
struct _Begin
{
template<typename _Tp>
concept __member_end = requires(_Tp& __t)
{
- { __decay_copy(__t.end()) }
- -> sentinel_for<decltype(_Begin{}(std::forward<_Tp>(__t)))>;
+ { __decay_copy(__t.end()) } -> sentinel_for<__range_iter_t<_Tp>>;
};
// Poison pills so that unqualified lookup doesn't find std::end.
concept __adl_end = __class_or_enum<remove_reference_t<_Tp>>
&& requires(_Tp& __t)
{
- { __decay_copy(end(__t)) }
- -> sentinel_for<decltype(_Begin{}(std::forward<_Tp>(__t)))>;
+ { __decay_copy(end(__t)) } -> sentinel_for<__range_iter_t<_Tp>>;
};
struct _End
concept __member_rend = requires(_Tp& __t)
{
{ __decay_copy(__t.rend()) }
- -> sentinel_for<decltype(_RBegin{}(__t))>;
+ -> sentinel_for<decltype(_RBegin{}(std::forward<_Tp>(__t)))>;
};
void rend(auto&) = delete;
template<typename _Tp>
concept __member_data = requires(_Tp& __t)
{
- { __cust_access::__decay_copy(__t.data()) } -> __pointer_to_object;
+ { __decay_copy(__t.data()) } -> __pointer_to_object;
};
template<typename _Tp>
- concept __begin_data = requires(_Tp& __t)
- { { _Begin{}(__t) } -> contiguous_iterator; };
+ concept __begin_data = contiguous_iterator<__range_iter_t<_Tp>>;
struct _Data
{