diff options
author | Louis Dionne <ldionne.2@gmail.com> | 2021-01-12 11:53:24 -0500 |
---|---|---|
committer | Louis Dionne <ldionne.2@gmail.com> | 2021-01-18 17:37:25 -0500 |
commit | 2cb4a96a99e8acbf57a31d4d06ed5e21799d878e (patch) | |
tree | 4b855a3054a25668c0fa62d0c3cdd25f44b7b67c /libcxx | |
parent | 5b77ac32b1150d066b35b45d6d982f4b4a1f62ff (diff) | |
download | llvm-2cb4a96a99e8acbf57a31d4d06ed5e21799d878e.zip llvm-2cb4a96a99e8acbf57a31d4d06ed5e21799d878e.tar.gz llvm-2cb4a96a99e8acbf57a31d4d06ed5e21799d878e.tar.bz2 |
[libc++] NFCI: Refactor allocator_traits
The implementation had a lot of boilerplate and was more complicated than
necessary. This NFC refactoring introduces a few macros to reduce code
duplication, and uses a consistent style and formatting for the whole file.
Differential Revision: https://reviews.llvm.org/D94544
Diffstat (limited to 'libcxx')
-rw-r--r-- | libcxx/include/__memory/allocator_traits.h | 718 | ||||
-rw-r--r-- | libcxx/include/memory | 4 |
2 files changed, 267 insertions, 455 deletions
diff --git a/libcxx/include/__memory/allocator_traits.h b/libcxx/include/__memory/allocator_traits.h index cdbdb9e..9443f61 100644 --- a/libcxx/include/__memory/allocator_traits.h +++ b/libcxx/include/__memory/allocator_traits.h @@ -24,564 +24,376 @@ _LIBCPP_PUSH_MACROS _LIBCPP_BEGIN_NAMESPACE_STD -template <class _Tp, class = void> -struct __has_pointer_type : false_type {}; - -template <class _Tp> -struct __has_pointer_type<_Tp, - typename __void_t<typename _Tp::pointer>::type> : true_type {}; - -namespace __pointer_type_imp -{ - -template <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> -struct __pointer_type -{ - typedef _LIBCPP_NODEBUG_TYPE typename _Dp::pointer type; -}; - -template <class _Tp, class _Dp> -struct __pointer_type<_Tp, _Dp, false> -{ - typedef _LIBCPP_NODEBUG_TYPE _Tp* type; -}; - -} // __pointer_type_imp - -template <class _Tp, class _Dp> -struct __pointer_type -{ - typedef _LIBCPP_NODEBUG_TYPE typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; -}; - -template <class _Tp, class = void> -struct __has_const_pointer : false_type {}; - -template <class _Tp> -struct __has_const_pointer<_Tp, - typename __void_t<typename _Tp::const_pointer>::type> : true_type {}; - -template <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> -struct __const_pointer -{ - typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::const_pointer type; +#define _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(NAME, PROPERTY) \ + template <class _Tp, class = void> struct NAME : false_type { }; \ + template <class _Tp> struct NAME<_Tp, typename __void_t<typename _Tp:: PROPERTY >::type> : true_type { } + +// __pointer +_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_pointer, pointer); +template <class _Tp, class _Alloc, + class _RawAlloc = typename remove_reference<_Alloc>::type, + bool = __has_pointer<_RawAlloc>::value> +struct __pointer { + using type _LIBCPP_NODEBUG_TYPE = typename _RawAlloc::pointer; +}; +template <class _Tp, class _Alloc, class _RawAlloc> +struct __pointer<_Tp, _Alloc, _RawAlloc, false> { + using type _LIBCPP_NODEBUG_TYPE = _Tp*; +}; + +// __const_pointer +_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_const_pointer, const_pointer); +template <class _Tp, class _Ptr, class _Alloc, + bool = __has_const_pointer<_Alloc>::value> +struct __const_pointer { + using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::const_pointer; }; - template <class _Tp, class _Ptr, class _Alloc> -struct __const_pointer<_Tp, _Ptr, _Alloc, false> -{ -#ifndef _LIBCPP_CXX03_LANG - typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind<const _Tp> type; +struct __const_pointer<_Tp, _Ptr, _Alloc, false> { +#ifdef _LIBCPP_CXX03_LANG + using type = typename pointer_traits<_Ptr>::template rebind<const _Tp>::other; #else - typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; + using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::template rebind<const _Tp>; #endif }; -template <class _Tp, class = void> -struct __has_void_pointer : false_type {}; - -template <class _Tp> -struct __has_void_pointer<_Tp, - typename __void_t<typename _Tp::void_pointer>::type> : true_type {}; - -template <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> -struct __void_pointer -{ - typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::void_pointer type; +// __void_pointer +_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_void_pointer, void_pointer); +template <class _Ptr, class _Alloc, + bool = __has_void_pointer<_Alloc>::value> +struct __void_pointer { + using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::void_pointer; }; - template <class _Ptr, class _Alloc> -struct __void_pointer<_Ptr, _Alloc, false> -{ -#ifndef _LIBCPP_CXX03_LANG - typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind<void> type; +struct __void_pointer<_Ptr, _Alloc, false> { +#ifdef _LIBCPP_CXX03_LANG + using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::template rebind<void>::other; #else - typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind<void>::other type; + using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::template rebind<void>; #endif }; -template <class _Tp, class = void> -struct __has_const_void_pointer : false_type {}; - -template <class _Tp> -struct __has_const_void_pointer<_Tp, - typename __void_t<typename _Tp::const_void_pointer>::type> : true_type {}; - -template <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> -struct __const_void_pointer -{ - typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::const_void_pointer type; +// __const_void_pointer +_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_const_void_pointer, const_void_pointer); +template <class _Ptr, class _Alloc, + bool = __has_const_void_pointer<_Alloc>::value> +struct __const_void_pointer { + using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::const_void_pointer; }; - template <class _Ptr, class _Alloc> -struct __const_void_pointer<_Ptr, _Alloc, false> -{ -#ifndef _LIBCPP_CXX03_LANG - typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind<const void> type; +struct __const_void_pointer<_Ptr, _Alloc, false> { +#ifdef _LIBCPP_CXX03_LANG + using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::template rebind<const void>::other; #else - typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::template rebind<const void>::other type; + using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::template rebind<const void>; #endif }; -template <class _Tp, class = void> -struct __has_size_type : false_type {}; - -template <class _Tp> -struct __has_size_type<_Tp, - typename __void_t<typename _Tp::size_type>::type> : true_type {}; - +// __size_type +_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_size_type, size_type); template <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> -struct __size_type -{ - typedef _LIBCPP_NODEBUG_TYPE typename make_unsigned<_DiffType>::type type; -}; - +struct __size_type : make_unsigned<_DiffType> { }; template <class _Alloc, class _DiffType> -struct __size_type<_Alloc, _DiffType, true> -{ - typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::size_type type; +struct __size_type<_Alloc, _DiffType, true> { + using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::size_type; }; -template <class _Tp, class = void> -struct __has_propagate_on_container_copy_assignment : false_type {}; - -template <class _Tp> -struct __has_propagate_on_container_copy_assignment<_Tp, - typename __void_t<typename _Tp::propagate_on_container_copy_assignment>::type> - : true_type {}; - -template <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> -struct __propagate_on_container_copy_assignment -{ - typedef _LIBCPP_NODEBUG_TYPE false_type type; +// __alloc_traits_difference_type +_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_alloc_traits_difference_type, difference_type); +template <class _Alloc, class _Ptr, bool = __has_alloc_traits_difference_type<_Alloc>::value> +struct __alloc_traits_difference_type { + using type _LIBCPP_NODEBUG_TYPE = typename pointer_traits<_Ptr>::difference_type; +}; +template <class _Alloc, class _Ptr> +struct __alloc_traits_difference_type<_Alloc, _Ptr, true> { + using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::difference_type; }; +// __propagate_on_container_copy_assignment +_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_propagate_on_container_copy_assignment, propagate_on_container_copy_assignment); +template <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> +struct __propagate_on_container_copy_assignment : false_type { }; template <class _Alloc> -struct __propagate_on_container_copy_assignment<_Alloc, true> -{ - typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::propagate_on_container_copy_assignment type; +struct __propagate_on_container_copy_assignment<_Alloc, true> { + using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::propagate_on_container_copy_assignment; }; -template <class _Tp, class = void> -struct __has_propagate_on_container_move_assignment : false_type {}; - -template <class _Tp> -struct __has_propagate_on_container_move_assignment<_Tp, - typename __void_t<typename _Tp::propagate_on_container_move_assignment>::type> - : true_type {}; - +// __propagate_on_container_move_assignment +_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_propagate_on_container_move_assignment, propagate_on_container_move_assignment); template <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> -struct __propagate_on_container_move_assignment -{ - typedef false_type type; -}; - +struct __propagate_on_container_move_assignment : false_type { }; template <class _Alloc> -struct __propagate_on_container_move_assignment<_Alloc, true> -{ - typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::propagate_on_container_move_assignment type; +struct __propagate_on_container_move_assignment<_Alloc, true> { + using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::propagate_on_container_move_assignment; }; -template <class _Tp, class = void> -struct __has_propagate_on_container_swap : false_type {}; - -template <class _Tp> -struct __has_propagate_on_container_swap<_Tp, - typename __void_t<typename _Tp::propagate_on_container_swap>::type> - : true_type {}; - +// __propagate_on_container_swap +_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_propagate_on_container_swap, propagate_on_container_swap); template <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> -struct __propagate_on_container_swap -{ - typedef false_type type; -}; - +struct __propagate_on_container_swap : false_type { }; template <class _Alloc> -struct __propagate_on_container_swap<_Alloc, true> -{ - typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::propagate_on_container_swap type; +struct __propagate_on_container_swap<_Alloc, true> { + using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::propagate_on_container_swap; }; -template <class _Tp, class = void> -struct __has_is_always_equal : false_type {}; - -template <class _Tp> -struct __has_is_always_equal<_Tp, - typename __void_t<typename _Tp::is_always_equal>::type> - : true_type {}; - +// __is_always_equal +_LIBCPP_ALLOCATOR_TRAITS_HAS_XXX(__has_is_always_equal, is_always_equal); template <class _Alloc, bool = __has_is_always_equal<_Alloc>::value> -struct __is_always_equal -{ - typedef _LIBCPP_NODEBUG_TYPE typename _VSTD::is_empty<_Alloc>::type type; -}; - +struct __is_always_equal : is_empty<_Alloc> { }; template <class _Alloc> -struct __is_always_equal<_Alloc, true> -{ - typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::is_always_equal type; -}; - -template <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> -struct __has_rebind_other -{ -private: - struct __two {char __lx; char __lxx;}; - template <class _Xp> static __two __test(...); - _LIBCPP_SUPPRESS_DEPRECATED_PUSH - template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); - _LIBCPP_SUPPRESS_DEPRECATED_POP -public: - static const bool value = sizeof(__test<_Tp>(0)) == 1; +struct __is_always_equal<_Alloc, true> { + using type _LIBCPP_NODEBUG_TYPE = typename _Alloc::is_always_equal; }; +// __allocator_traits_rebind +_LIBCPP_SUPPRESS_DEPRECATED_PUSH +template <class _Tp, class _Up, class = void> +struct __has_rebind_other : false_type { }; template <class _Tp, class _Up> -struct __has_rebind_other<_Tp, _Up, false> -{ - static const bool value = false; -}; +struct __has_rebind_other<_Tp, _Up, typename __void_t< + typename _Tp::template rebind<_Up>::other +>::type> : true_type { }; template <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> -struct __allocator_traits_rebind -{ - _LIBCPP_SUPPRESS_DEPRECATED_PUSH - typedef _LIBCPP_NODEBUG_TYPE typename _Tp::template rebind<_Up>::other type; - _LIBCPP_SUPPRESS_DEPRECATED_POP +struct __allocator_traits_rebind { + using type _LIBCPP_NODEBUG_TYPE = typename _Tp::template rebind<_Up>::other; }; - template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> -struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> -{ - _LIBCPP_SUPPRESS_DEPRECATED_PUSH - typedef _LIBCPP_NODEBUG_TYPE typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; - _LIBCPP_SUPPRESS_DEPRECATED_POP +struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> { + using type _LIBCPP_NODEBUG_TYPE = typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other; }; - template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> -struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> -{ - typedef _LIBCPP_NODEBUG_TYPE _Alloc<_Up, _Args...> type; +struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> { + using type _LIBCPP_NODEBUG_TYPE = _Alloc<_Up, _Args...>; }; +_LIBCPP_SUPPRESS_DEPRECATED_POP -#ifndef _LIBCPP_CXX03_LANG +template<class _Alloc, class _Tp> +using __allocator_traits_rebind_t = typename __allocator_traits_rebind<_Alloc, _Tp>::type; _LIBCPP_SUPPRESS_DEPRECATED_PUSH -template <class _Alloc, class _SizeType, class _ConstVoidPtr> -auto -__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) - -> decltype((void)__a.allocate(__sz, __p), true_type()); -_LIBCPP_SUPPRESS_DEPRECATED_POP -template <class _Alloc, class _SizeType, class _ConstVoidPtr> -auto -__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) - -> false_type; +// __has_allocate_hint +template <class _Alloc, class _SizeType, class _ConstVoidPtr, class = void> +struct __has_allocate_hint : false_type { }; template <class _Alloc, class _SizeType, class _ConstVoidPtr> -struct __has_allocate_hint - : decltype(_VSTD::__has_allocate_hint_test(declval<_Alloc>(), - declval<_SizeType>(), - declval<_ConstVoidPtr>())) -{ -}; +struct __has_allocate_hint<_Alloc, _SizeType, _ConstVoidPtr, decltype( + (void)declval<_Alloc>().allocate(declval<_SizeType>(), declval<_ConstVoidPtr>()) +)> : true_type { }; -#else // _LIBCPP_CXX03_LANG - -template <class _Alloc, class _SizeType, class _ConstVoidPtr> -struct __has_allocate_hint - : true_type -{ -}; - -#endif // _LIBCPP_CXX03_LANG - -_LIBCPP_SUPPRESS_DEPRECATED_PUSH -template <class _Alloc, class ..._Args, - class = decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Args>()...))> -static true_type __test_has_construct(int); -_LIBCPP_SUPPRESS_DEPRECATED_POP - -template <class _Alloc, class...> -static false_type __test_has_construct(...); +// __has_construct +template <class, class _Alloc, class ..._Args> +struct __has_construct_impl : false_type { }; template <class _Alloc, class ..._Args> -struct __has_construct : decltype(__test_has_construct<_Alloc, _Args...>(0)) {}; - -#if !defined(_LIBCPP_CXX03_LANG) - -_LIBCPP_SUPPRESS_DEPRECATED_PUSH -template <class _Alloc, class _Pointer> -auto -__has_destroy_test(_Alloc&& __a, _Pointer&& __p) - -> decltype(__a.destroy(__p), true_type()); -_LIBCPP_SUPPRESS_DEPRECATED_POP - -template <class _Alloc, class _Pointer> -auto -__has_destroy_test(const _Alloc& __a, _Pointer&& __p) - -> false_type; - -template <class _Alloc, class _Pointer> -struct __has_destroy - : decltype(_VSTD::__has_destroy_test(declval<_Alloc>(), - declval<_Pointer>())) -{ -}; - -_LIBCPP_SUPPRESS_DEPRECATED_PUSH -template <class _Alloc> -auto -__has_max_size_test(_Alloc&& __a) - -> decltype(__a.max_size(), true_type()); -_LIBCPP_SUPPRESS_DEPRECATED_POP - -template <class _Alloc> -auto -__has_max_size_test(const volatile _Alloc& __a) - -> false_type; +struct __has_construct_impl<decltype( + (void)declval<_Alloc>().construct(declval<_Args>()...) +), _Alloc, _Args...> : true_type { }; -template <class _Alloc> -struct __has_max_size - : decltype(_VSTD::__has_max_size_test(declval<_Alloc&>())) -{ -}; - -template <class _Alloc> -auto -__has_select_on_container_copy_construction_test(_Alloc&& __a) - -> decltype(__a.select_on_container_copy_construction(), true_type()); - -template <class _Alloc> -auto -__has_select_on_container_copy_construction_test(const volatile _Alloc& __a) - -> false_type; - -template <class _Alloc> -struct __has_select_on_container_copy_construction - : decltype(_VSTD::__has_select_on_container_copy_construction_test(declval<_Alloc&>())) -{ -}; - -#else // _LIBCPP_CXX03_LANG +template <class _Alloc, class ..._Args> +struct __has_construct : __has_construct_impl<void, _Alloc, _Args...> { }; +// __has_destroy template <class _Alloc, class _Pointer, class = void> -struct __has_destroy : false_type {}; +struct __has_destroy : false_type { }; template <class _Alloc, class _Pointer> -struct __has_destroy<_Alloc, _Pointer, typename __void_t< - decltype(_VSTD::declval<_Alloc>().destroy(_VSTD::declval<_Pointer>())) ->::type> : true_type {}; +struct __has_destroy<_Alloc, _Pointer, decltype( + (void)declval<_Alloc>().destroy(declval<_Pointer>()) +)> : true_type { }; -template <class _Alloc> -struct __has_max_size - : true_type -{ -}; +// __has_max_size +template <class _Alloc, class = void> +struct __has_max_size : false_type { }; template <class _Alloc> -struct __has_select_on_container_copy_construction - : false_type -{ -}; - -#endif // _LIBCPP_CXX03_LANG - -template <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> -struct __alloc_traits_difference_type -{ - typedef _LIBCPP_NODEBUG_TYPE typename pointer_traits<_Ptr>::difference_type type; -}; - -template <class _Alloc, class _Ptr> -struct __alloc_traits_difference_type<_Alloc, _Ptr, true> -{ - typedef _LIBCPP_NODEBUG_TYPE typename _Alloc::difference_type type; -}; - -template <class _Tp> -struct __is_default_allocator : false_type {}; - -template <class _Tp> -struct __is_default_allocator<_VSTD::allocator<_Tp> > : true_type {}; +struct __has_max_size<_Alloc, decltype( + (void)declval<_Alloc&>().max_size() +)> : true_type { }; +// __has_select_on_container_copy_construction +template <class _Alloc, class = void> +struct __has_select_on_container_copy_construction : false_type { }; - -template <class _Alloc, - bool = __has_construct<_Alloc, typename _Alloc::value_type*, typename _Alloc::value_type&&>::value && !__is_default_allocator<_Alloc>::value - > -struct __is_cpp17_move_insertable; -template <class _Alloc> -struct __is_cpp17_move_insertable<_Alloc, true> : true_type {}; -template <class _Alloc> -struct __is_cpp17_move_insertable<_Alloc, false> : is_move_constructible<typename _Alloc::value_type> {}; - -template <class _Alloc, - bool = __has_construct<_Alloc, typename _Alloc::value_type*, const typename _Alloc::value_type&>::value && !__is_default_allocator<_Alloc>::value - > -struct __is_cpp17_copy_insertable; template <class _Alloc> -struct __is_cpp17_copy_insertable<_Alloc, true> : __is_cpp17_move_insertable<_Alloc> {}; -template <class _Alloc> -struct __is_cpp17_copy_insertable<_Alloc, false> : integral_constant<bool, - is_copy_constructible<typename _Alloc::value_type>::value && - __is_cpp17_move_insertable<_Alloc>::value> - {}; - +struct __has_select_on_container_copy_construction<_Alloc, decltype( + (void)declval<_Alloc>().select_on_container_copy_construction() +)> : true_type { }; +_LIBCPP_SUPPRESS_DEPRECATED_POP template <class _Alloc> struct _LIBCPP_TEMPLATE_VIS allocator_traits { - typedef _Alloc allocator_type; - typedef typename allocator_type::value_type value_type; - - typedef typename __pointer_type<value_type, allocator_type>::type pointer; - typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer; - typedef typename __void_pointer<pointer, allocator_type>::type void_pointer; - typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer; - - typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type; - typedef typename __size_type<allocator_type, difference_type>::type size_type; - - typedef typename __propagate_on_container_copy_assignment<allocator_type>::type - propagate_on_container_copy_assignment; - typedef typename __propagate_on_container_move_assignment<allocator_type>::type - propagate_on_container_move_assignment; - typedef typename __propagate_on_container_swap<allocator_type>::type - propagate_on_container_swap; - typedef typename __is_always_equal<allocator_type>::type - is_always_equal; + using allocator_type = _Alloc; + using value_type = typename allocator_type::value_type; + using pointer = typename __pointer<value_type, allocator_type>::type; + using const_pointer = typename __const_pointer<value_type, pointer, allocator_type>::type; + using void_pointer = typename __void_pointer<pointer, allocator_type>::type; + using const_void_pointer = typename __const_void_pointer<pointer, allocator_type>::type; + using difference_type = typename __alloc_traits_difference_type<allocator_type, pointer>::type; + using size_type = typename __size_type<allocator_type, difference_type>::type; + using propagate_on_container_copy_assignment = typename __propagate_on_container_copy_assignment<allocator_type>::type; + using propagate_on_container_move_assignment = typename __propagate_on_container_move_assignment<allocator_type>::type; + using propagate_on_container_swap = typename __propagate_on_container_swap<allocator_type>::type; + using is_always_equal = typename __is_always_equal<allocator_type>::type; #ifndef _LIBCPP_CXX03_LANG - template <class _Tp> using rebind_alloc = - typename __allocator_traits_rebind<allocator_type, _Tp>::type; - template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp> >; + template <class _Tp> + using rebind_alloc = __allocator_traits_rebind_t<allocator_type, _Tp>; + template <class _Tp> + using rebind_traits = allocator_traits<rebind_alloc<_Tp> >; #else // _LIBCPP_CXX03_LANG - template <class _Tp> struct rebind_alloc - {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;}; - template <class _Tp> struct rebind_traits - {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;}; + template <class _Tp> + struct rebind_alloc { + using other = __allocator_traits_rebind_t<allocator_type, _Tp>; + }; + template <class _Tp> + struct rebind_traits { + using other = allocator_traits<typename rebind_alloc<_Tp>::other>; + }; #endif // _LIBCPP_CXX03_LANG _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static pointer allocate(allocator_type& __a, size_type __n) - {return __a.allocate(__n);} - _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) - {return __allocate(__a, __n, __hint, - __has_allocate_hint<allocator_type, size_type, const_void_pointer>());} + static pointer allocate(allocator_type& __a, size_type __n) { + return __a.allocate(__n); + } - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT - {__a.deallocate(__p, __n);} - - template <class _Tp, class... _Args> - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) - {__construct(__has_construct<allocator_type, _Tp*, _Args...>(), - __a, __p, _VSTD::forward<_Args>(__args)...);} - - template <class _Tp> - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static void destroy(allocator_type& __a, _Tp* __p) - {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} - - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static size_type max_size(const allocator_type& __a) _NOEXCEPT - {return __max_size(__has_max_size<const allocator_type>(), __a);} + template <class _Ap = _Alloc, class = + _EnableIf<__has_allocate_hint<_Ap, size_type, const_void_pointer>::value> > + _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 + static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) { + _LIBCPP_SUPPRESS_DEPRECATED_PUSH + return __a.allocate(__n, __hint); + _LIBCPP_SUPPRESS_DEPRECATED_POP + } + template <class _Ap = _Alloc, class = void, class = + _EnableIf<!__has_allocate_hint<_Ap, size_type, const_void_pointer>::value> > + _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 + static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer) { + return __a.allocate(__n); + } _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static allocator_type - select_on_container_copy_construction(const allocator_type& __a) - {return __select_on_container_copy_construction( - __has_select_on_container_copy_construction<const allocator_type>(), - __a);} + static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT { + __a.deallocate(__p, __n); + } -private: + template <class _Tp, class... _Args, class = + _EnableIf<__has_construct<allocator_type, _Tp*, _Args...>::value> > _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static pointer __allocate(allocator_type& __a, size_type __n, - const_void_pointer __hint, true_type) - { - _LIBCPP_SUPPRESS_DEPRECATED_PUSH - return __a.allocate(__n, __hint); - _LIBCPP_SUPPRESS_DEPRECATED_POP - } + static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) { + _LIBCPP_SUPPRESS_DEPRECATED_PUSH + __a.construct(__p, _VSTD::forward<_Args>(__args)...); + _LIBCPP_SUPPRESS_DEPRECATED_POP + } + template <class _Tp, class... _Args, class = void, class = + _EnableIf<!__has_construct<allocator_type, _Tp*, _Args...>::value> > _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static pointer __allocate(allocator_type& __a, size_type __n, - const_void_pointer, false_type) - {return __a.allocate(__n);} - - template <class _Tp, class... _Args> - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) - { - _LIBCPP_SUPPRESS_DEPRECATED_PUSH - __a.construct(__p, _VSTD::forward<_Args>(__args)...); - _LIBCPP_SUPPRESS_DEPRECATED_POP - } - - template <class _Tp, class... _Args> - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) - { + static void construct(allocator_type&, _Tp* __p, _Args&&... __args) { #if _LIBCPP_STD_VER > 17 - _VSTD::construct_at(__p, _VSTD::forward<_Args>(__args)...); + _VSTD::construct_at(__p, _VSTD::forward<_Args>(__args)...); #else - ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); + ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); #endif - } + } - template <class _Tp> - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static void __destroy(true_type, allocator_type& __a, _Tp* __p) - { - _LIBCPP_SUPPRESS_DEPRECATED_PUSH - __a.destroy(__p); - _LIBCPP_SUPPRESS_DEPRECATED_POP - } - template <class _Tp> - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static void __destroy(false_type, allocator_type&, _Tp* __p) - { + template <class _Tp, class = + _EnableIf<__has_destroy<allocator_type, _Tp*>::value> > + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 + static void destroy(allocator_type& __a, _Tp* __p) { + _LIBCPP_SUPPRESS_DEPRECATED_PUSH + __a.destroy(__p); + _LIBCPP_SUPPRESS_DEPRECATED_POP + } + template <class _Tp, class = void, class = + _EnableIf<!__has_destroy<allocator_type, _Tp*>::value> > + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 + static void destroy(allocator_type&, _Tp* __p) { #if _LIBCPP_STD_VER > 17 - _VSTD::destroy_at(__p); + _VSTD::destroy_at(__p); #else - __p->~_Tp(); + __p->~_Tp(); #endif - } + } + template <class _Ap = _Alloc, class = + _EnableIf<__has_max_size<const _Ap>::value> > _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static size_type __max_size(true_type, const allocator_type& __a) _NOEXCEPT - { - _LIBCPP_SUPPRESS_DEPRECATED_PUSH - return __a.max_size(); - _LIBCPP_SUPPRESS_DEPRECATED_POP - } - + static size_type max_size(const allocator_type& __a) _NOEXCEPT { + _LIBCPP_SUPPRESS_DEPRECATED_PUSH + return __a.max_size(); + _LIBCPP_SUPPRESS_DEPRECATED_POP + } + template <class _Ap = _Alloc, class = void, class = + _EnableIf<!__has_max_size<const _Ap>::value> > _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static size_type __max_size(false_type, const allocator_type&) _NOEXCEPT - {return numeric_limits<size_type>::max() / sizeof(value_type);} + static size_type max_size(const allocator_type&) _NOEXCEPT { + return numeric_limits<size_type>::max() / sizeof(value_type); + } + template <class _Ap = _Alloc, class = + _EnableIf<__has_select_on_container_copy_construction<const _Ap>::value> > _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static allocator_type - __select_on_container_copy_construction(true_type, const allocator_type& __a) - {return __a.select_on_container_copy_construction();} + static allocator_type select_on_container_copy_construction(const allocator_type& __a) { + return __a.select_on_container_copy_construction(); + } + template <class _Ap = _Alloc, class = void, class = + _EnableIf<!__has_select_on_container_copy_construction<const _Ap>::value> > _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 - static allocator_type - __select_on_container_copy_construction(false_type, const allocator_type& __a) - {return __a;} + static allocator_type select_on_container_copy_construction(const allocator_type& __a) { + return __a; + } }; template <class _Traits, class _Tp> -struct __rebind_alloc_helper -{ +struct __rebind_alloc_helper { #ifndef _LIBCPP_CXX03_LANG - typedef _LIBCPP_NODEBUG_TYPE typename _Traits::template rebind_alloc<_Tp> type; + using type _LIBCPP_NODEBUG_TYPE = typename _Traits::template rebind_alloc<_Tp>; #else - typedef typename _Traits::template rebind_alloc<_Tp>::other type; + using type = typename _Traits::template rebind_alloc<_Tp>::other; #endif }; +// __is_default_allocator +template <class _Tp> +struct __is_default_allocator : false_type { }; + +template <class _Tp> +struct __is_default_allocator<_VSTD::allocator<_Tp> > : true_type { }; + +// __is_cpp17_move_insertable +template <class _Alloc, class = void> +struct __is_cpp17_move_insertable + : is_move_constructible<typename _Alloc::value_type> +{ }; + +template <class _Alloc> +struct __is_cpp17_move_insertable<_Alloc, _EnableIf< + !__is_default_allocator<_Alloc>::value && + __has_construct<_Alloc, typename _Alloc::value_type*, typename _Alloc::value_type&&>::value +> > : true_type { }; + +// __is_cpp17_copy_insertable +template <class _Alloc, class = void> +struct __is_cpp17_copy_insertable + : integral_constant<bool, + is_copy_constructible<typename _Alloc::value_type>::value && + __is_cpp17_move_insertable<_Alloc>::value + > +{ }; + +template <class _Alloc> +struct __is_cpp17_copy_insertable<_Alloc, _EnableIf< + !__is_default_allocator<_Alloc>::value && + __has_construct<_Alloc, typename _Alloc::value_type*, const typename _Alloc::value_type&>::value +> > + : __is_cpp17_move_insertable<_Alloc> +{ }; + +#undef _LIBCPP_ALLOCATOR_TRAITS_HAS_XXX + _LIBCPP_END_NAMESPACE_STD _LIBCPP_POP_MACROS diff --git a/libcxx/include/memory b/libcxx/include/memory index ef1a62b..a00916c 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -1462,7 +1462,7 @@ class _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS unique_ptr { public: typedef _Tp element_type; typedef _Dp deleter_type; - typedef _LIBCPP_NODEBUG_TYPE typename __pointer_type<_Tp, deleter_type>::type pointer; + typedef _LIBCPP_NODEBUG_TYPE typename __pointer<_Tp, deleter_type>::type pointer; static_assert(!is_rvalue_reference<deleter_type>::value, "the specified deleter type cannot be an rvalue reference"); @@ -1670,7 +1670,7 @@ class _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> public: typedef _Tp element_type; typedef _Dp deleter_type; - typedef typename __pointer_type<_Tp, deleter_type>::type pointer; + typedef typename __pointer<_Tp, deleter_type>::type pointer; private: __compressed_pair<pointer, deleter_type> __ptr_; |