Mercurial > hg > CbC > CbC_llvm
diff 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 |
line wrap: on
line diff
--- a/flang/runtime/memory.h Mon May 25 11:55:54 2020 +0900 +++ b/flang/runtime/memory.h Tue Jun 08 06:07:14 2021 +0900 @@ -20,7 +20,7 @@ [[nodiscard]] void *AllocateMemoryOrCrash( const Terminator &, std::size_t bytes); -template <typename A>[[nodiscard]] A &AllocateOrCrash(const Terminator &t) { +template <typename A> [[nodiscard]] A &AllocateOrCrash(const Terminator &t) { return *reinterpret_cast<A *>(AllocateMemoryOrCrash(t, sizeof(A))); } void FreeMemory(void *); @@ -32,20 +32,32 @@ p = nullptr; } -template <typename A> struct New { - template <typename... X> - [[nodiscard]] A &operator()(const Terminator &terminator, X &&... x) { - return *new (AllocateMemoryOrCrash(terminator, sizeof(A))) - A{std::forward<X>(x)...}; - } -}; - template <typename A> struct OwningPtrDeleter { void operator()(A *p) { FreeMemory(p); } }; template <typename A> using OwningPtr = std::unique_ptr<A, OwningPtrDeleter<A>>; +template <typename A> class SizedNew { +public: + explicit SizedNew(const Terminator &terminator) : terminator_{terminator} {} + template <typename... X> + [[nodiscard]] OwningPtr<A> operator()(std::size_t bytes, X &&...x) { + return OwningPtr<A>{new (AllocateMemoryOrCrash(terminator_, bytes)) + A{std::forward<X>(x)...}}; + } + +private: + const Terminator &terminator_; +}; + +template <typename A> struct New : public SizedNew<A> { + using SizedNew<A>::SizedNew; + template <typename... X> [[nodiscard]] OwningPtr<A> operator()(X &&...x) { + return SizedNew<A>::operator()(sizeof(A), std::forward<X>(x)...); + } +}; + template <typename A> struct Allocator { using value_type = A; explicit Allocator(const Terminator &t) : terminator{t} {}