xref: /freebsd/contrib/llvm-project/libcxx/include/__memory/builtin_new_allocator.h (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
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 
31     _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit __builtin_new_deleter(size_t __size, size_t __align)
32         : __size_(__size), __align_(__align) {}
33 
34     _LIBCPP_HIDE_FROM_ABI void operator()(void* __p) const _NOEXCEPT {
35       std::__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 
45   _LIBCPP_HIDE_FROM_ABI static __holder_t __allocate_bytes(size_t __s, size_t __align) {
46     return __holder_t(std::__libcpp_allocate(__s, __align), __builtin_new_deleter(__s, __align));
47   }
48 
49   _LIBCPP_HIDE_FROM_ABI static void __deallocate_bytes(void* __p, size_t __s, size_t __align) _NOEXCEPT {
50     std::__libcpp_deallocate(__p, __s, __align);
51   }
52 
53   template <class _Tp>
54   _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI static __holder_t __allocate_type(size_t __n) {
55     return __allocate_bytes(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
56   }
57 
58   template <class _Tp>
59   _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI static void
60   __deallocate_type(void* __p, size_t __n) _NOEXCEPT {
61     __deallocate_bytes(__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
62   }
63 };
64 
65 _LIBCPP_END_NAMESPACE_STD
66 
67 #endif // _LIBCPP___MEMORY_BUILTIN_NEW_ALLOCATOR_H
68