1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef _LIBCPP___MEMORY_BUILTIN_NEW_ALLOCATOR_H 10 #define _LIBCPP___MEMORY_BUILTIN_NEW_ALLOCATOR_H 11 12 #include <__config> 13 #include <__memory/unique_ptr.h> 14 #include <cstddef> 15 #include <new> 16 17 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 18 # pragma GCC system_header 19 #endif 20 21 _LIBCPP_BEGIN_NAMESPACE_STD 22 23 // __builtin_new_allocator -- A non-templated helper for allocating and 24 // deallocating memory using __builtin_operator_new and 25 // __builtin_operator_delete. It should be used in preference to 26 // `std::allocator<T>` to avoid additional instantiations. 27 struct __builtin_new_allocator { 28 struct __builtin_new_deleter { 29 typedef void* pointer_type; 30 __builtin_new_deleter__builtin_new_allocator::__builtin_new_deleter31 _LIBCPP_CONSTEXPR explicit __builtin_new_deleter(size_t __size, size_t __align) 32 : __size_(__size), __align_(__align) {} 33 operator__builtin_new_allocator::__builtin_new_deleter34 void operator()(void* __p) const _NOEXCEPT { 35 _VSTD::__libcpp_deallocate(__p, __size_, __align_); 36 } 37 38 private: 39 size_t __size_; 40 size_t __align_; 41 }; 42 43 typedef unique_ptr<void, __builtin_new_deleter> __holder_t; 44 __allocate_bytes__builtin_new_allocator45 static __holder_t __allocate_bytes(size_t __s, size_t __align) { 46 return __holder_t(_VSTD::__libcpp_allocate(__s, __align), 47 __builtin_new_deleter(__s, __align)); 48 } 49 __deallocate_bytes__builtin_new_allocator50 static void __deallocate_bytes(void* __p, size_t __s, 51 size_t __align) _NOEXCEPT { 52 _VSTD::__libcpp_deallocate(__p, __s, __align); 53 } 54 55 template <class _Tp> 56 _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE __allocate_type__builtin_new_allocator57 static __holder_t __allocate_type(size_t __n) { 58 return __allocate_bytes(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)); 59 } 60 61 template <class _Tp> 62 _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE __deallocate_type__builtin_new_allocator63 static void __deallocate_type(void* __p, size_t __n) _NOEXCEPT { 64 __deallocate_bytes(__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)); 65 } 66 }; 67 68 _LIBCPP_END_NAMESPACE_STD 69 70 #endif // _LIBCPP___MEMORY_BUILTIN_NEW_ALLOCATOR_H 71