14
14
#include < __cstddef/size_t.h>
15
15
#include < __new/align_val_t.h>
16
16
#include < __new/global_new_delete.h> // for _LIBCPP_HAS_SIZED_DEALLOCATION
17
+ #include < __type_traits/type_identity.h>
18
+ #include < __utility/element_count.h>
17
19
18
20
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
19
21
# pragma GCC system_header
@@ -48,16 +50,17 @@ _LIBCPP_HIDE_FROM_ABI void __libcpp_operator_delete(_Args... __args) _NOEXCEPT {
48
50
}
49
51
50
52
template <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);
52
55
#if _LIBCPP_HAS_ALIGNED_ALLOCATION
53
56
if (__is_overaligned_for_new (__align)) {
54
57
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) );
56
59
}
57
60
#endif
58
61
59
62
(void )__align;
60
- return std::__libcpp_operator_new (__size);
63
+ return static_cast <_Tp*>( std::__libcpp_operator_new (__size) );
61
64
}
62
65
63
66
#if _LIBCPP_HAS_SIZED_DEALLOCATION
@@ -67,7 +70,9 @@ inline _LIBCPP_HIDE_FROM_ABI void* __libcpp_allocate(size_t __size, size_t __ali
67
70
#endif
68
71
69
72
template <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);
71
76
(void )__size;
72
77
#if !_LIBCPP_HAS_ALIGNED_ALLOCATION
73
78
(void )__align;
@@ -82,17 +87,11 @@ inline _LIBCPP_HIDE_FROM_ABI void __libcpp_deallocate(void* __ptr, size_t __size
82
87
#endif
83
88
}
84
89
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
-
92
90
#undef _LIBCPP_ONLY_IF_SIZED_DEALLOCATION
93
91
94
92
template <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 {
96
95
#if !_LIBCPP_HAS_ALIGNED_ALLOCATION
97
96
(void )__align;
98
97
return std::__libcpp_operator_delete (__ptr);
0 commit comments