12#ifndef FORTRAN_RUNTIME_MEMORY_H_
13#define FORTRAN_RUNTIME_MEMORY_H_
15#include "flang/Common/api-attrs.h"
20namespace Fortran::runtime {
24[[nodiscard]] RT_API_ATTRS
void *AllocateMemoryOrCrash(
25 const Terminator &, std::size_t bytes);
27[[nodiscard]] RT_API_ATTRS A &AllocateOrCrash(
const Terminator &t) {
28 return *
reinterpret_cast<A *
>(AllocateMemoryOrCrash(t,
sizeof(A)));
30RT_API_ATTRS
void *ReallocateMemoryOrCrash(
31 const Terminator &,
void *ptr, std::size_t newByteSize);
32RT_API_ATTRS
void FreeMemory(
void *);
33template <
typename A> RT_API_ATTRS
void FreeMemory(A *p) {
34 FreeMemory(
reinterpret_cast<void *
>(p));
36template <
typename A> RT_API_ATTRS
void FreeMemoryAndNullify(A *&p) {
47 using pointer_type = A *;
50 RT_API_ATTRS
explicit OwningPtr(pointer_type p) : ptr_(p) {}
55 other.ptr_ = pointer_type{};
61 other.ptr_ = pointer_type{};
69 if (ptr_ != pointer_type{}) {
71 ptr_ = pointer_type{};
76 RT_API_ATTRS pointer_type release() {
77 pointer_type p = ptr_;
78 ptr_ = pointer_type{};
83 RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN
85 RT_API_ATTRS
void reset(pointer_type p = pointer_type{}) {
87 if (p != pointer_type{}) {
94 RT_API_ATTRS
void swap(
OwningPtr &other) { std::swap(ptr_, other.ptr_); }
98 RT_API_ATTRS pointer_type get()
const {
return ptr_; }
100 RT_API_ATTRS
explicit operator bool()
const {
101 return get() != pointer_type{};
104 RT_API_ATTRS
typename std::add_lvalue_reference<A>::type operator*()
const {
105 assert(get() != pointer_type{});
109 RT_API_ATTRS pointer_type operator->()
const {
return get(); }
112 RT_API_ATTRS
void delete_ptr(pointer_type p) { FreeMemory(p); }
116template <
typename X,
typename Y>
117inline RT_API_ATTRS
bool operator!=(
119 return x.get() != y.get();
123inline RT_API_ATTRS
bool operator!=(
const OwningPtr<X> &x, std::nullptr_t) {
128inline RT_API_ATTRS
bool operator!=(std::nullptr_t,
const OwningPtr<X> &x) {
135 : terminator_{terminator} {}
137 template <
typename... X>
139 std::size_t bytes, X &&...x) {
140 return OwningPtr<A>{
new (AllocateMemoryOrCrash(terminator_, bytes))
141 A{std::forward<X>(x)...}};
150 template <
typename... X>
151 [[nodiscard]] RT_API_ATTRS
OwningPtr<A> operator()(X &&...x) {
157 using value_type = A;
159 template <
typename B>
161 : terminator{that.terminator} {}
164 [[nodiscard]]
constexpr A *allocate(std::size_t n) {
165 return reinterpret_cast<A *
>(
166 AllocateMemoryOrCrash(terminator, n *
sizeof(A)));
168 constexpr void deallocate(A *p, std::size_t) { FreeMemory(p); }
Definition: terminator.h:23