comparison flang/runtime/memory.h @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 0572611fdcc8
children
comparison
equal deleted inserted replaced
173:0572611fdcc8 207:2e18cbf3894f
18 18
19 class Terminator; 19 class Terminator;
20 20
21 [[nodiscard]] void *AllocateMemoryOrCrash( 21 [[nodiscard]] void *AllocateMemoryOrCrash(
22 const Terminator &, std::size_t bytes); 22 const Terminator &, std::size_t bytes);
23 template <typename A>[[nodiscard]] A &AllocateOrCrash(const Terminator &t) { 23 template <typename A> [[nodiscard]] A &AllocateOrCrash(const Terminator &t) {
24 return *reinterpret_cast<A *>(AllocateMemoryOrCrash(t, sizeof(A))); 24 return *reinterpret_cast<A *>(AllocateMemoryOrCrash(t, sizeof(A)));
25 } 25 }
26 void FreeMemory(void *); 26 void FreeMemory(void *);
27 template <typename A> void FreeMemory(A *p) { 27 template <typename A> void FreeMemory(A *p) {
28 FreeMemory(reinterpret_cast<void *>(p)); 28 FreeMemory(reinterpret_cast<void *>(p));
30 template <typename A> void FreeMemoryAndNullify(A *&p) { 30 template <typename A> void FreeMemoryAndNullify(A *&p) {
31 FreeMemory(p); 31 FreeMemory(p);
32 p = nullptr; 32 p = nullptr;
33 } 33 }
34 34
35 template <typename A> struct New {
36 template <typename... X>
37 [[nodiscard]] A &operator()(const Terminator &terminator, X &&... x) {
38 return *new (AllocateMemoryOrCrash(terminator, sizeof(A)))
39 A{std::forward<X>(x)...};
40 }
41 };
42
43 template <typename A> struct OwningPtrDeleter { 35 template <typename A> struct OwningPtrDeleter {
44 void operator()(A *p) { FreeMemory(p); } 36 void operator()(A *p) { FreeMemory(p); }
45 }; 37 };
46 38
47 template <typename A> using OwningPtr = std::unique_ptr<A, OwningPtrDeleter<A>>; 39 template <typename A> using OwningPtr = std::unique_ptr<A, OwningPtrDeleter<A>>;
40
41 template <typename A> class SizedNew {
42 public:
43 explicit SizedNew(const Terminator &terminator) : terminator_{terminator} {}
44 template <typename... X>
45 [[nodiscard]] OwningPtr<A> operator()(std::size_t bytes, X &&...x) {
46 return OwningPtr<A>{new (AllocateMemoryOrCrash(terminator_, bytes))
47 A{std::forward<X>(x)...}};
48 }
49
50 private:
51 const Terminator &terminator_;
52 };
53
54 template <typename A> struct New : public SizedNew<A> {
55 using SizedNew<A>::SizedNew;
56 template <typename... X> [[nodiscard]] OwningPtr<A> operator()(X &&...x) {
57 return SizedNew<A>::operator()(sizeof(A), std::forward<X>(x)...);
58 }
59 };
48 60
49 template <typename A> struct Allocator { 61 template <typename A> struct Allocator {
50 using value_type = A; 62 using value_type = A;
51 explicit Allocator(const Terminator &t) : terminator{t} {} 63 explicit Allocator(const Terminator &t) : terminator{t} {}
52 template <typename B> 64 template <typename B>