using std::ranges::__detail::__maybe_borrowed_range;
using std::__detail::__range_iter_t;
- struct _Begin final
+ struct _Begin
{
private:
template<typename _Tp>
return noexcept(__decay_copy(begin(std::declval<_Tp&>())));
}
- void operator&() const = delete;
-
public:
template<__maybe_borrowed_range _Tp>
requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
{ __decay_copy(end(__t)) } -> sentinel_for<__range_iter_t<_Tp>>;
};
- struct _End final
+ struct _End
{
private:
template<typename _Tp>
return noexcept(__decay_copy(end(std::declval<_Tp&>())));
}
- void operator&() const = delete;
-
public:
template<__maybe_borrowed_range _Tp>
requires is_bounded_array_v<remove_reference_t<_Tp>>
return static_cast<const _Tp&&>(__t);
}
- struct _CBegin final
+ struct _CBegin
{
template<typename _Tp>
constexpr auto
{
return _Begin{}(__cust_access::__as_const<_Tp>(__e));
}
-
- void operator&() const = delete;
};
struct _CEnd final
{
return _End{}(__cust_access::__as_const<_Tp>(__e));
}
-
- void operator&() const = delete;
};
template<typename _Tp>
{ _End{}(__t) } -> same_as<decltype(_Begin{}(__t))>;
};
- struct _RBegin final
+ struct _RBegin
{
private:
template<typename _Tp>
}
}
- void operator&() const = delete;
-
public:
template<__maybe_borrowed_range _Tp>
requires __member_rbegin<_Tp> || __adl_rbegin<_Tp> || __reversable<_Tp>
-> sentinel_for<decltype(_RBegin{}(std::forward<_Tp>(__t)))>;
};
- struct _REnd final
+ struct _REnd
{
private:
template<typename _Tp>
}
}
- void operator&() const = delete;
-
public:
template<__maybe_borrowed_range _Tp>
requires __member_rend<_Tp> || __adl_rend<_Tp> || __reversable<_Tp>
}
};
- struct _CRBegin final
+ struct _CRBegin
{
template<typename _Tp>
constexpr auto
{
return _RBegin{}(__cust_access::__as_const<_Tp>(__e));
}
-
- void operator&() const = delete;
};
- struct _CREnd final
+ struct _CREnd
{
template<typename _Tp>
constexpr auto
{
return _REnd{}(__cust_access::__as_const<_Tp>(__e));
}
-
- void operator&() const = delete;
};
template<typename _Tp>
__detail::__to_unsigned_like(_End{}(__t) - _Begin{}(__t));
};
- struct _Size final
+ struct _Size
{
private:
template<typename _Tp>
- _Begin{}(std::declval<_Tp&>()));
}
- void operator&() const = delete;
-
public:
template<typename _Tp>
requires is_bounded_array_v<remove_reference_t<_Tp>>
}
};
- struct _SSize final
+ struct _SSize
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 3403. Domain of ranges::ssize(E) doesn't match ranges::size(E)
else // Must be one of __max_diff_type or __max_size_type.
return __detail::__max_diff_type(__size);
}
-
- void operator&() const = delete;
};
template<typename _Tp>
bool(_Begin{}(__t) == _End{}(__t));
};
- struct _Empty final
+ struct _Empty
{
private:
template<typename _Tp>
== _End{}(std::declval<_Tp&>())));
}
- void operator&() const = delete;
-
public:
template<typename _Tp>
requires __member_empty<_Tp> || __size0_empty<_Tp>
template<typename _Tp>
concept __begin_data = contiguous_iterator<__range_iter_t<_Tp>>;
- struct _Data final
+ struct _Data
{
private:
template<typename _Tp>
return noexcept(_Begin{}(std::declval<_Tp&>()));
}
- void operator&() const = delete;
-
public:
template<__maybe_borrowed_range _Tp>
requires __member_data<_Tp> || __begin_data<_Tp>
}
};
- struct _CData final
+ struct _CData
{
template<typename _Tp>
constexpr auto
{
return _Data{}(__cust_access::__as_const<_Tp>(__e));
}
-
- void operator&() const = delete;
};
} // namespace __cust_access
// This is also true for test_container, although only when it has forward
// iterators (because output_iterator_wrapper and input_iterator_wrapper are
// not default constructible so do not model std::input_or_output_iterator).
+
+
+ // Test for basic properties of C++20 16.3.3.6 [customization.point.object].
+ template<typename T>
+ constexpr bool
+ is_customization_point_object(T& obj) noexcept
+ {
+ // A [CPO] is a function object with a literal class type.
+ static_assert( std::is_class_v<T> || std::is_union_v<T> );
+ static_assert( __is_literal_type(T) );
+ // The type of a [CPO], ignoring cv-qualifiers, shall model semiregular.
+ static_assert( std::semiregular<std::remove_cv_t<T>> );
+
+ return true;
+ }
+
#endif // C++20
} // namespace __gnu_test
#endif // _TESTSUITE_ITERATORS