@@ -36,65 +36,52 @@ _LIBCPP_PUSH_MACROS
3636
3737_LIBCPP_BEGIN_NAMESPACE_STD
3838
39- #define _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX (NAME, PROPERTY ) \
40- template <class _Tp , class = void > \
41- struct NAME : false_type {}; \
42- template <class _Tp > \
43- struct NAME <_Tp, __void_t <typename _Tp::PROPERTY > > : true_type {}
44-
45- _LIBCPP_SUPPRESS_DEPRECATED_PUSH
4639// __pointer
4740template <class _Tp >
4841using __pointer_member _LIBCPP_NODEBUG = typename _Tp::pointer;
4942
5043template <class _Tp , class _Alloc >
5144using __pointer _LIBCPP_NODEBUG = __detected_or_t <_Tp*, __pointer_member, __libcpp_remove_reference_t <_Alloc> >;
5245
53- // __const_pointer
54- _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX (__has_const_pointer, const_pointer);
55- template <class _Tp , class _Ptr , class _Alloc , bool = __has_const_pointer<_Alloc>::value>
56- struct __const_pointer {
57- using type _LIBCPP_NODEBUG = typename _Alloc::const_pointer;
58- };
59- template <class _Tp , class _Ptr , class _Alloc >
60- struct __const_pointer <_Tp, _Ptr, _Alloc, false > {
46+ // This trait returns _Alias<_Alloc> if that's well-formed, and _Ptr rebound to _Tp otherwise
47+ template <class _Alloc , template <class > class _Alias , class _Ptr , class _Tp , class = void >
48+ struct __rebind_or_alias_pointer {
6149#ifdef _LIBCPP_CXX03_LANG
62- using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<const _Tp>::other;
50+ using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<_Tp>::other;
6351#else
64- using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<const _Tp>;
52+ using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<_Tp>;
6553#endif
6654};
6755_LIBCPP_SUPPRESS_DEPRECATED_POP
6856
69- // __void_pointer
70- _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX (__has_void_pointer, void_pointer);
71- template <class _Ptr , class _Alloc , bool = __has_void_pointer<_Alloc>::value>
72- struct __void_pointer {
73- using type _LIBCPP_NODEBUG = typename _Alloc::void_pointer;
57+ template <class _Ptr , class _Alloc , class _Tp , template <class > class _Alias >
58+ struct __rebind_or_alias_pointer <_Alloc, _Alias, _Ptr, _Tp, __void_t <_Alias<_Alloc> > > {
59+ using type _LIBCPP_NODEBUG = _Alias<_Alloc>;
7460};
61+
62+ // __const_pointer
63+ template <class _Alloc >
64+ using __const_pointer_member _LIBCPP_NODEBUG = typename _Alloc::const_pointer;
65+
66+ template <class _Tp , class _Ptr , class _Alloc >
67+ using __const_pointer_t _LIBCPP_NODEBUG =
68+ typename __rebind_or_alias_pointer<_Alloc, __const_pointer_member, _Ptr, const _Tp>::type;
69+
70+ // __void_pointer
71+ template <class _Alloc >
72+ using __void_pointer_member _LIBCPP_NODEBUG = typename _Alloc::void_pointer;
73+
7574template <class _Ptr , class _Alloc >
76- struct __void_pointer <_Ptr, _Alloc, false > {
77- #ifdef _LIBCPP_CXX03_LANG
78- using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<void >::other;
79- #else
80- using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<void >;
81- #endif
82- };
75+ using __void_pointer_t _LIBCPP_NODEBUG =
76+ typename __rebind_or_alias_pointer<_Alloc, __void_pointer_member, _Ptr, void >::type;
8377
8478// __const_void_pointer
85- _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX (__has_const_void_pointer, const_void_pointer);
86- template <class _Ptr , class _Alloc , bool = __has_const_void_pointer<_Alloc>::value>
87- struct __const_void_pointer {
88- using type _LIBCPP_NODEBUG = typename _Alloc::const_void_pointer;
89- };
79+ template <class _Alloc >
80+ using __const_void_pointer_member _LIBCPP_NODEBUG = typename _Alloc::const_void_pointer;
81+
9082template <class _Ptr , class _Alloc >
91- struct __const_void_pointer <_Ptr, _Alloc, false > {
92- #ifdef _LIBCPP_CXX03_LANG
93- using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<const void >::other;
94- #else
95- using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<const void >;
96- #endif
97- };
83+ using __const_void_pointer_t _LIBCPP_NODEBUG =
84+ typename __rebind_or_alias_pointer<_Alloc, __const_void_pointer_member, _Ptr, const void >::type;
9885
9986// __size_type
10087template <class _Tp >
@@ -104,13 +91,13 @@ template <class _Alloc, class _DiffType>
10491using __size_type _LIBCPP_NODEBUG = __detected_or_t <__make_unsigned_t <_DiffType>, __size_type_member, _Alloc>;
10592
10693// __alloc_traits_difference_type
107- _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX (__has_alloc_traits_difference_type, difference_type);
108- template <class _Alloc , class _Ptr , bool = __has_alloc_traits_difference_type<_Alloc>::value>
94+ template <class _Alloc , class _Ptr , class = void >
10995struct __alloc_traits_difference_type {
11096 using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::difference_type;
11197};
98+
11299template <class _Alloc , class _Ptr >
113- struct __alloc_traits_difference_type <_Alloc, _Ptr, true > {
100+ struct __alloc_traits_difference_type <_Alloc, _Ptr, __void_t < typename _Alloc::difference_type> > {
114101 using type _LIBCPP_NODEBUG = typename _Alloc::difference_type;
115102};
116103
@@ -241,9 +228,9 @@ struct _LIBCPP_TEMPLATE_VIS allocator_traits {
241228 using allocator_type = _Alloc;
242229 using value_type = typename allocator_type::value_type;
243230 using pointer = __pointer<value_type, allocator_type>;
244- using const_pointer = typename __const_pointer <value_type, pointer, allocator_type>::type ;
245- using void_pointer = typename __void_pointer <pointer, allocator_type>::type ;
246- using const_void_pointer = typename __const_void_pointer <pointer, allocator_type>::type ;
231+ using const_pointer = __const_pointer_t <value_type, pointer, allocator_type>;
232+ using void_pointer = __void_pointer_t <pointer, allocator_type>;
233+ using const_void_pointer = __const_void_pointer_t <pointer, allocator_type>;
247234 using difference_type = typename __alloc_traits_difference_type<allocator_type, pointer>::type;
248235 using size_type = __size_type<allocator_type, difference_type>;
249236 using propagate_on_container_copy_assignment = __propagate_on_container_copy_assignment<allocator_type>;
@@ -407,8 +394,6 @@ struct __is_cpp17_copy_insertable<
407394 __has_construct<_Alloc, typename _Alloc::value_type*, const typename _Alloc::value_type&>::value > >
408395 : __is_cpp17_move_insertable<_Alloc> {};
409396
410- #undef _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX
411-
412397_LIBCPP_END_NAMESPACE_STD
413398
414399_LIBCPP_POP_MACROS
0 commit comments