2626#include < __type_traits/conditional.h>
2727#include < __type_traits/detected_or.h>
2828#include < __type_traits/disjunction.h>
29- #include < __type_traits/enable_if.h>
3029#include < __type_traits/integral_constant.h>
3130#include < __type_traits/is_convertible.h>
3231#include < __type_traits/is_object.h>
3332#include < __type_traits/is_primary_template.h>
3433#include < __type_traits/is_reference.h>
3534#include < __type_traits/is_referenceable.h>
36- #include < __type_traits/is_valid_expansion.h>
3735#include < __type_traits/nat.h>
3836#include < __type_traits/remove_const.h>
3937#include < __type_traits/remove_cv.h>
@@ -72,42 +70,6 @@ struct random_access_iterator_tag : public bidirectional_iterator_tag {};
7270struct contiguous_iterator_tag : public random_access_iterator_tag {};
7371#endif
7472
75- template <class _Iter >
76- struct __iter_traits_cache {
77- using type _LIBCPP_NODEBUG =
78- _If<__is_primary_template<iterator_traits<_Iter> >::value, _Iter, iterator_traits<_Iter> >;
79- };
80- template <class _Iter >
81- using _ITER_TRAITS _LIBCPP_NODEBUG = typename __iter_traits_cache<_Iter>::type;
82-
83- struct __iter_concept_concept_test {
84- template <class _Iter >
85- using _Apply _LIBCPP_NODEBUG = typename _ITER_TRAITS<_Iter>::iterator_concept;
86- };
87- struct __iter_concept_category_test {
88- template <class _Iter >
89- using _Apply _LIBCPP_NODEBUG = typename _ITER_TRAITS<_Iter>::iterator_category;
90- };
91- struct __iter_concept_random_fallback {
92- template <class _Iter >
93- using _Apply _LIBCPP_NODEBUG =
94- __enable_if_t <__is_primary_template<iterator_traits<_Iter> >::value, random_access_iterator_tag>;
95- };
96-
97- template <class _Iter , class _Tester >
98- struct __test_iter_concept : _IsValidExpansion<_Tester::template _Apply, _Iter>, _Tester {};
99-
100- template <class _Iter >
101- struct __iter_concept_cache {
102- using type _LIBCPP_NODEBUG =
103- _Or<__test_iter_concept<_Iter, __iter_concept_concept_test>,
104- __test_iter_concept<_Iter, __iter_concept_category_test>,
105- __test_iter_concept<_Iter, __iter_concept_random_fallback> >;
106- };
107-
108- template <class _Iter >
109- using _ITER_CONCEPT _LIBCPP_NODEBUG = typename __iter_concept_cache<_Iter>::type::template _Apply<_Iter>;
110-
11173template <class _Tp >
11274struct __has_iterator_typedefs {
11375private:
@@ -194,16 +156,6 @@ concept __specifies_members = requires {
194156 requires __has_member_iterator_category<_Ip>;
195157};
196158
197- template <class >
198- struct __iterator_traits_member_pointer_or_void {
199- using type _LIBCPP_NODEBUG = void ;
200- };
201-
202- template <__has_member_pointer _Tp>
203- struct __iterator_traits_member_pointer_or_void <_Tp> {
204- using type _LIBCPP_NODEBUG = typename _Tp::pointer;
205- };
206-
207159template <class _Tp >
208160concept __cpp17_iterator_missing_members = !__specifies_members<_Tp> && __iterator_traits_detail::__cpp17_iterator<_Tp>;
209161
@@ -303,6 +255,9 @@ struct __iterator_traits_difference_type<_Ip> {
303255template <class >
304256struct __iterator_traits {};
305257
258+ template <class _Tp >
259+ using __pointer_member _LIBCPP_NODEBUG = typename _Tp::pointer;
260+
306261// [iterator.traits]/3.1
307262// If `I` has valid ([temp.deduct]) member types `difference-type`, `value-type`, `reference`, and
308263// `iterator-category`, then `iterator-traits<I>` has the following publicly accessible members:
@@ -311,7 +266,7 @@ struct __iterator_traits<_Ip> {
311266 using iterator_category = typename _Ip::iterator_category;
312267 using value_type = typename _Ip::value_type;
313268 using difference_type = typename _Ip::difference_type;
314- using pointer = typename __iterator_traits_member_pointer_or_void< _Ip>::type ;
269+ using pointer = __detected_or_t < void , __pointer_member, _Ip>;
315270 using reference = typename _Ip::reference;
316271};
317272
0 commit comments