blob: f44ceedb3cd10ac8283d4dac08dbeb02927379d3 [file] [log] [blame]
peter klausler491122d2020-01-16 13:51:25 -08001//===-- runtime/memory.h ----------------------------------------*- C++ -*-===//
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// Thin wrapper around malloc()/free() to isolate the dependency,
10// ease porting, and provide an owning pointer.
11
12#ifndef FORTRAN_RUNTIME_MEMORY_H_
13#define FORTRAN_RUNTIME_MEMORY_H_
14
15#include <memory>
16
17namespace Fortran::runtime {
18
19class Terminator;
20
21void *AllocateMemoryOrCrash(Terminator &, std::size_t bytes);
22template<typename A> A &AllocateOrCrash(Terminator &t) {
23 return *reinterpret_cast<A *>(AllocateMemoryOrCrash(t, sizeof(A)));
24}
25void FreeMemory(void *);
26void FreeMemoryAndNullify(void *&);
27
28template<typename A> struct New {
29 template<typename... X> A &operator()(Terminator &terminator, X&&... x) {
30 return *new (AllocateMemoryOrCrash(terminator, sizeof(A))) A{std::forward<X>(x)...};
31 }
32};
33
34namespace {
35template<typename A> class OwningPtrDeleter {
36 void operator()(A *p) { FreeMemory(p); }
37};
38}
39
40template<typename A> using OwningPtr = std::unique_ptr<A, OwningPtrDeleter<A>>;
41}
42
43#endif // FORTRAN_RUNTIME_MEMORY_H_