@@ -36,65 +36,52 @@ _LIBCPP_PUSH_MACROS
36
36
37
37
_LIBCPP_BEGIN_NAMESPACE_STD
38
38
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
46
39
// __pointer
47
40
template <class _Tp >
48
41
using __pointer_member _LIBCPP_NODEBUG = typename _Tp::pointer;
49
42
50
43
template <class _Tp , class _Alloc >
51
44
using __pointer _LIBCPP_NODEBUG = __detected_or_t <_Tp*, __pointer_member, __libcpp_remove_reference_t <_Alloc> >;
52
45
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 {
61
49
#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;
63
51
#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>;
65
53
#endif
66
54
};
67
55
_LIBCPP_SUPPRESS_DEPRECATED_POP
68
56
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>;
74
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;
69
+
70
+ // __void_pointer
71
+ template <class _Alloc >
72
+ using __void_pointer_member _LIBCPP_NODEBUG = typename _Alloc::void_pointer;
73
+
75
74
template <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;
83
77
84
78
// __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
+
90
82
template <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;
98
85
99
86
// __size_type
100
87
template <class _Tp >
@@ -104,13 +91,13 @@ template <class _Alloc, class _DiffType>
104
91
using __size_type _LIBCPP_NODEBUG = __detected_or_t <__make_unsigned_t <_DiffType>, __size_type_member, _Alloc>;
105
92
106
93
// __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 >
109
95
struct __alloc_traits_difference_type {
110
96
using type _LIBCPP_NODEBUG = typename pointer_traits<_Ptr>::difference_type;
111
97
};
98
+
112
99
template <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> > {
114
101
using type _LIBCPP_NODEBUG = typename _Alloc::difference_type;
115
102
};
116
103
@@ -241,9 +228,9 @@ struct _LIBCPP_TEMPLATE_VIS allocator_traits {
241
228
using allocator_type = _Alloc;
242
229
using value_type = typename allocator_type::value_type;
243
230
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>;
247
234
using difference_type = typename __alloc_traits_difference_type<allocator_type, pointer>::type;
248
235
using size_type = __size_type<allocator_type, difference_type>;
249
236
using propagate_on_container_copy_assignment = __propagate_on_container_copy_assignment<allocator_type>;
@@ -407,8 +394,6 @@ struct __is_cpp17_copy_insertable<
407
394
__has_construct<_Alloc, typename _Alloc::value_type*, const typename _Alloc::value_type&>::value > >
408
395
: __is_cpp17_move_insertable<_Alloc> {};
409
396
410
- #undef _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX
411
-
412
397
_LIBCPP_END_NAMESPACE_STD
413
398
414
399
_LIBCPP_POP_MACROS
0 commit comments