1414#include < __cstddef/size_t.h>
1515#include < __new/align_val_t.h>
1616#include < __new/global_new_delete.h> // for _LIBCPP_HAS_SIZED_DEALLOCATION
17+ #include < __type_traits/type_identity.h>
18+ #include < __utility/element_count.h>
1719
1820#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1921# pragma GCC system_header
@@ -48,16 +50,17 @@ _LIBCPP_HIDE_FROM_ABI void __libcpp_operator_delete(_Args... __args) _NOEXCEPT {
4850}
4951
5052template <class _Tp >
51- inline _LIBCPP_HIDE_FROM_ABI void * __libcpp_allocate (size_t __size, size_t __align) {
53+ inline _LIBCPP_HIDE_FROM_ABI _Tp* __libcpp_allocate (__element_count __n, size_t __align = _LIBCPP_ALIGNOF(_Tp)) {
54+ size_t __size = static_cast <size_t >(__n) * sizeof (_Tp);
5255#if _LIBCPP_HAS_ALIGNED_ALLOCATION
5356 if (__is_overaligned_for_new (__align)) {
5457 const align_val_t __align_val = static_cast <align_val_t >(__align);
55- return std::__libcpp_operator_new (__size, __align_val);
58+ return static_cast <_Tp*>( std::__libcpp_operator_new (__size, __align_val) );
5659 }
5760#endif
5861
5962 (void )__align;
60- return std::__libcpp_operator_new (__size);
63+ return static_cast <_Tp*>( std::__libcpp_operator_new (__size) );
6164}
6265
6366#if _LIBCPP_HAS_SIZED_DEALLOCATION
@@ -67,7 +70,9 @@ inline _LIBCPP_HIDE_FROM_ABI void* __libcpp_allocate(size_t __size, size_t __ali
6770#endif
6871
6972template <class _Tp >
70- inline _LIBCPP_HIDE_FROM_ABI void __libcpp_deallocate (void * __ptr, size_t __size, size_t __align) _NOEXCEPT {
73+ inline _LIBCPP_HIDE_FROM_ABI void __libcpp_deallocate (
74+ __type_identity_t <_Tp>* __ptr, __element_count __n, size_t __align = _LIBCPP_ALIGNOF(_Tp)) _NOEXCEPT {
75+ size_t __size = static_cast <size_t >(__n) * sizeof (_Tp);
7176 (void )__size;
7277#if !_LIBCPP_HAS_ALIGNED_ALLOCATION
7378 (void )__align;
@@ -82,17 +87,11 @@ inline _LIBCPP_HIDE_FROM_ABI void __libcpp_deallocate(void* __ptr, size_t __size
8287#endif
8388}
8489
85- template <class _Tp >
86- struct __deallocating_deleter {
87- _LIBCPP_HIDE_FROM_ABI void operator ()(void * __p) const {
88- std::__libcpp_deallocate<_Tp>(__p, sizeof (_Tp), _LIBCPP_ALIGNOF (_Tp));
89- }
90- };
91-
9290#undef _LIBCPP_ONLY_IF_SIZED_DEALLOCATION
9391
9492template <class _Tp >
95- inline _LIBCPP_HIDE_FROM_ABI void __libcpp_deallocate_unsized (void * __ptr, size_t __align) _NOEXCEPT {
93+ inline _LIBCPP_HIDE_FROM_ABI void
94+ __libcpp_deallocate_unsized (__type_identity_t <_Tp>* __ptr, size_t __align = _LIBCPP_ALIGNOF(_Tp)) _NOEXCEPT {
9695#if !_LIBCPP_HAS_ALIGNED_ALLOCATION
9796 (void )__align;
9897 return std::__libcpp_operator_delete (__ptr);
0 commit comments