@@ -429,6 +429,8 @@ template <class E> constexpr const E* data(initializer_list<E> il) noexcept;
429
429
#include < concepts>
430
430
#include < cstddef>
431
431
#include < initializer_list>
432
+ #include < __iterator/incrementable_traits.h>
433
+ #include < __iterator/readable_traits.h>
432
434
#include < __memory/addressof.h>
433
435
#include < __memory/pointer_traits.h>
434
436
#include < version>
@@ -443,99 +445,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD
443
445
444
446
#if !defined(_LIBCPP_HAS_NO_RANGES)
445
447
446
- template <class _Tp >
447
- using __with_reference = _Tp&;
448
-
449
- template <class _Tp >
450
- concept __referenceable = requires {
451
- typename __with_reference<_Tp>;
452
- };
453
-
454
- template <class _Tp >
455
- concept __dereferenceable = requires (_Tp& __t ) {
456
- { *__t } -> __referenceable; // not required to be equality-preserving
457
- };
458
-
459
- // [incrementable.traits]
460
- template <class > struct incrementable_traits {};
461
-
462
- template <class _Tp >
463
- requires is_object_v<_Tp>
464
- struct incrementable_traits <_Tp*> {
465
- using difference_type = ptrdiff_t ;
466
- };
467
-
468
- template <class _Ip >
469
- struct incrementable_traits <const _Ip> : incrementable_traits<_Ip> {};
470
-
471
- template <class _Tp >
472
- concept __has_member_difference_type = requires { typename _Tp::difference_type; };
473
-
474
- template <__has_member_difference_type _Tp>
475
- struct incrementable_traits <_Tp> {
476
- using difference_type = typename _Tp::difference_type;
477
- };
478
-
479
- template <class _Tp >
480
- concept __has_integral_minus =
481
- requires (const _Tp& __x, const _Tp& __y) {
482
- { __x - __y } -> integral;
483
- };
484
-
485
- template <__has_integral_minus _Tp>
486
- requires (!__has_member_difference_type<_Tp>)
487
- struct incrementable_traits<_Tp> {
488
- using difference_type = make_signed_t <decltype (declval<_Tp>() - declval<_Tp>())>;
489
- };
490
-
491
- // TODO(cjdb): add iter_difference_t once iterator_traits is cleaned up.
492
-
493
- // [readable.traits]
494
- template <class > struct __cond_value_type {};
495
-
496
- template <class _Tp >
497
- requires is_object_v<_Tp>
498
- struct __cond_value_type <_Tp> { using value_type = remove_cv_t <_Tp>; };
499
-
500
- template <class _Tp >
501
- concept __has_member_value_type = requires { typename _Tp::value_type; };
502
-
503
- template <class _Tp >
504
- concept __has_member_element_type = requires { typename _Tp::element_type; };
505
-
506
- template <class > struct indirectly_readable_traits {};
507
-
508
- template <class _Ip >
509
- requires is_array_v<_Ip>
510
- struct indirectly_readable_traits <_Ip> {
511
- using value_type = remove_cv_t <remove_extent_t <_Ip>>;
512
- };
513
-
514
- template <class _Ip >
515
- struct indirectly_readable_traits <const _Ip> : indirectly_readable_traits<_Ip> {};
516
-
517
- template <class _Tp >
518
- struct indirectly_readable_traits <_Tp*> : __cond_value_type<_Tp> {};
519
-
520
- template <__has_member_value_type _Tp>
521
- struct indirectly_readable_traits <_Tp>
522
- : __cond_value_type<typename _Tp::value_type> {};
523
-
524
- template <__has_member_element_type _Tp>
525
- struct indirectly_readable_traits <_Tp>
526
- : __cond_value_type<typename _Tp::element_type> {};
527
-
528
- // Pre-emptively applies LWG3541
529
- template <__has_member_value_type _Tp>
530
- requires __has_member_element_type<_Tp>
531
- struct indirectly_readable_traits <_Tp> {};
532
- template <__has_member_value_type _Tp>
533
- requires __has_member_element_type<_Tp> &&
534
- same_as<remove_cv_t <typename _Tp::element_type>,
535
- remove_cv_t <typename _Tp::value_type>>
536
- struct indirectly_readable_traits <_Tp>
537
- : __cond_value_type<typename _Tp::value_type> {};
538
-
539
448
// [iterator.traits]
540
449
template <__dereferenceable _Tp>
541
450
using iter_reference_t = decltype (*declval<_Tp&>());
0 commit comments