[libc++][NFC] Move incrementable_traits and indirectly_readable_traits into separate headers.
Differential Revision: https://reviews.llvm.org/D100682
GitOrigin-RevId: e0adf7e06a9e329327db2c5e9809e1cbf2e7208d
diff --git a/include/iterator b/include/iterator
index c94d275..3158cf0 100644
--- a/include/iterator
+++ b/include/iterator
@@ -429,6 +429,8 @@
#include <concepts>
#include <cstddef>
#include <initializer_list>
+#include <__iterator/incrementable_traits.h>
+#include <__iterator/readable_traits.h>
#include <__memory/addressof.h>
#include <__memory/pointer_traits.h>
#include <version>
@@ -443,99 +445,6 @@
#if !defined(_LIBCPP_HAS_NO_RANGES)
-template<class _Tp>
-using __with_reference = _Tp&;
-
-template<class _Tp>
-concept __referenceable = requires {
- typename __with_reference<_Tp>;
-};
-
-template<class _Tp>
-concept __dereferenceable = requires(_Tp& __t) {
- { *__t } -> __referenceable; // not required to be equality-preserving
-};
-
-// [incrementable.traits]
-template<class> struct incrementable_traits {};
-
-template<class _Tp>
-requires is_object_v<_Tp>
-struct incrementable_traits<_Tp*> {
- using difference_type = ptrdiff_t;
-};
-
-template<class _Ip>
-struct incrementable_traits<const _Ip> : incrementable_traits<_Ip> {};
-
-template<class _Tp>
-concept __has_member_difference_type = requires { typename _Tp::difference_type; };
-
-template<__has_member_difference_type _Tp>
-struct incrementable_traits<_Tp> {
- using difference_type = typename _Tp::difference_type;
-};
-
-template<class _Tp>
-concept __has_integral_minus =
- requires(const _Tp& __x, const _Tp& __y) {
- { __x - __y } -> integral;
- };
-
-template<__has_integral_minus _Tp>
-requires (!__has_member_difference_type<_Tp>)
-struct incrementable_traits<_Tp> {
- using difference_type = make_signed_t<decltype(declval<_Tp>() - declval<_Tp>())>;
-};
-
-// TODO(cjdb): add iter_difference_t once iterator_traits is cleaned up.
-
-// [readable.traits]
-template<class> struct __cond_value_type {};
-
-template<class _Tp>
-requires is_object_v<_Tp>
-struct __cond_value_type<_Tp> { using value_type = remove_cv_t<_Tp>; };
-
-template<class _Tp>
-concept __has_member_value_type = requires { typename _Tp::value_type; };
-
-template<class _Tp>
-concept __has_member_element_type = requires { typename _Tp::element_type; };
-
-template<class> struct indirectly_readable_traits {};
-
-template<class _Ip>
-requires is_array_v<_Ip>
-struct indirectly_readable_traits<_Ip> {
- using value_type = remove_cv_t<remove_extent_t<_Ip>>;
-};
-
-template<class _Ip>
-struct indirectly_readable_traits<const _Ip> : indirectly_readable_traits<_Ip> {};
-
-template<class _Tp>
-struct indirectly_readable_traits<_Tp*> : __cond_value_type<_Tp> {};
-
-template<__has_member_value_type _Tp>
-struct indirectly_readable_traits<_Tp>
- : __cond_value_type<typename _Tp::value_type> {};
-
-template<__has_member_element_type _Tp>
-struct indirectly_readable_traits<_Tp>
- : __cond_value_type<typename _Tp::element_type> {};
-
-// Pre-emptively applies LWG3541
-template<__has_member_value_type _Tp>
-requires __has_member_element_type<_Tp>
-struct indirectly_readable_traits<_Tp> {};
-template<__has_member_value_type _Tp>
-requires __has_member_element_type<_Tp> &&
- same_as<remove_cv_t<typename _Tp::element_type>,
- remove_cv_t<typename _Tp::value_type>>
-struct indirectly_readable_traits<_Tp>
- : __cond_value_type<typename _Tp::value_type> {};
-
// [iterator.traits]
template<__dereferenceable _Tp>
using iter_reference_t = decltype(*declval<_Tp&>());