@@ -36,12 +36,6 @@ _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-
4539_LIBCPP_SUPPRESS_DEPRECATED_PUSH
4640// __pointer
4741template <class _Tp >
@@ -50,51 +44,45 @@ using __pointer_member _LIBCPP_NODEBUG = typename _Tp::pointer;
5044template <class _Tp , class _Alloc >
5145using __pointer _LIBCPP_NODEBUG = __detected_or_t <_Tp*, __pointer_member, __libcpp_remove_reference_t <_Alloc> >;
5246
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 > {
47+ // This trait returns _Alias<_Alloc> if that's well-formed, and _Ptr rebound to _Tp otherwise
48+ template <class _Alloc , template <class > class _Alias , class _Ptr , class _Tp , class = void >
49+ struct __rebind_or_alias_pointer {
6150#ifdef _LIBCPP_CXX03_LANG
62- using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<const _Tp>::other;
51+ using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<_Tp>::other;
6352#else
64- using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<const _Tp>;
53+ using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::template rebind<_Tp>;
6554#endif
6655};
56+
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>;
60+ };
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;
6769_LIBCPP_SUPPRESS_DEPRECATED_POP
6870
6971// __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;
74- };
72+ template <class _Alloc >
73+ using __void_pointer_member _LIBCPP_NODEBUG = typename _Alloc::void_pointer;
74+
7575template <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- };
76+ using __void_pointer_t _LIBCPP_NODEBUG =
77+ typename __rebind_or_alias_pointer<_Alloc, __void_pointer_member, _Ptr, void >::type;
8378
8479// __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- };
80+ template <class _Alloc >
81+ using __const_void_pointer_member _LIBCPP_NODEBUG = typename _Alloc::const_void_pointer;
82+
9083template <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- };
84+ using __const_void_pointer_t _LIBCPP_NODEBUG =
85+ typename __rebind_or_alias_pointer<_Alloc, __const_void_pointer_member, _Ptr, const void >::type;
9886
9987// __size_type
10088template <class _Tp >
@@ -104,13 +92,13 @@ template <class _Alloc, class _DiffType>
10492using __size_type _LIBCPP_NODEBUG = __detected_or_t <__make_unsigned_t <_DiffType>, __size_type_member, _Alloc>;
10593
10694// __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>
95+ template <class _Alloc , class _Ptr , class = void >
10996struct __alloc_traits_difference_type {
11097 using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::difference_type;
11198};
99+
112100template <class _Alloc , class _Ptr >
113- struct __alloc_traits_difference_type <_Alloc, _Ptr, true > {
101+ struct __alloc_traits_difference_type <_Alloc, _Ptr, __void_t < typename _Alloc::difference_type> > {
114102 using type _LIBCPP_NODEBUG = typename _Alloc::difference_type;
115103};
116104
@@ -240,9 +228,9 @@ struct _LIBCPP_TEMPLATE_VIS allocator_traits {
240228 using allocator_type = _Alloc;
241229 using value_type = typename allocator_type::value_type;
242230 using pointer = __pointer<value_type, allocator_type>;
243- using const_pointer = typename __const_pointer <value_type, pointer, allocator_type>::type ;
244- using void_pointer = typename __void_pointer <pointer, allocator_type>::type ;
245- 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>;
246234 using difference_type = typename __alloc_traits_difference_type<allocator_type, pointer>::type;
247235 using size_type = __size_type<allocator_type, difference_type>;
248236 using propagate_on_container_copy_assignment = __propagate_on_container_copy_assignment<allocator_type>;
@@ -386,8 +374,6 @@ inline const bool __is_cpp17_copy_insertable_v =
386374 (!__is_std_allocator_v<_Alloc> &&
387375 __has_construct_v<_Alloc, typename _Alloc::value_type*, const typename _Alloc::value_type&>));
388376
389- #undef _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX
390-
391377_LIBCPP_END_NAMESPACE_STD
392378
393379_LIBCPP_POP_MACROS
0 commit comments