Mercurial > hg > CbC > CbC_llvm
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> |