LeviLamina
Loading...
Searching...
No Matches
MemoryOperators.h
1#pragma once
2#ifdef LL_MEMORY_OPERATORS
3// This header provides convenient overrides for the new and
4// delete operations in C++.
5//
6// This header should be included in only one source file!
7
8#include "mc/deps/core/memory/IMemoryAllocator.h"
9
10#include "ll/api/memory/Memory.h"
11
12extern "C" LL_SHARED_EXPORT int const ll_memory_operator_overrided{};
13
14void operator delete(void* p) noexcept { ::ll::memory::getDefaultAllocator().release(p); }
15
16void operator delete(void* p, std::nothrow_t const&) noexcept { operator delete(p); }
17
18void operator delete[](void* p) noexcept { operator delete(p); }
19
20void operator delete[](void* p, std::nothrow_t const&) noexcept { operator delete[](p); }
21
22void operator delete(void* p, std::size_t) noexcept { operator delete(p); }
23
24void operator delete[](void* p, std::size_t) noexcept { operator delete[](p); }
25
26void operator delete(void* p, std::align_val_t) noexcept { ::ll::memory::getDefaultAllocator().alignedRelease(p); }
27
28void operator delete(void* p, std::align_val_t alignment, std::nothrow_t const&) noexcept {
29 operator delete(p, alignment);
30}
31void operator delete[](void* p, std::align_val_t alignment) noexcept { operator delete(p, alignment); }
32
33void operator delete[](void* p, std::align_val_t alignment, std::nothrow_t const&) noexcept {
34 operator delete[](p, alignment);
35}
36void operator delete(void* p, std::size_t, std::align_val_t alignment) noexcept { operator delete(p, alignment); }
37
38void operator delete[](void* p, std::size_t, std::align_val_t alignment) noexcept { operator delete[](p, alignment); }
39
40[[nodiscard]] LL_ALLOCATOR void* operator new(std::size_t size) {
41 if (void* const block = ::ll::memory::getDefaultAllocator().allocate(size)) {
42 return block;
43 }
44 ::ll::memory::throwMemoryException(size);
45}
46[[nodiscard]] LL_NOTHROW_ALLOCATOR void* operator new(std::size_t size, std::nothrow_t const&) noexcept {
47 return ::ll::memory::getDefaultAllocator().allocate(size);
48}
49[[nodiscard]] LL_ALLOCATOR void* operator new[](std::size_t size) { return operator new(size); }
50
51[[nodiscard]] LL_NOTHROW_ALLOCATOR void* operator new[](std::size_t size, std::nothrow_t const& tag) noexcept {
52 return operator new(size, tag);
53}
54[[nodiscard]] LL_ALLOCATOR void* operator new(std::size_t size, std::align_val_t alignment) {
55 if (void* const block = ::ll::memory::getDefaultAllocator().alignedAllocate(size, static_cast<size_t>(alignment))) {
56 return block;
57 }
58 ::ll::memory::throwMemoryException(size);
59}
60[[nodiscard]] LL_NOTHROW_ALLOCATOR void*
61operator new(std::size_t size, std::align_val_t alignment, std::nothrow_t const&) noexcept {
62 return ::ll::memory::getDefaultAllocator().alignedAllocate(size, static_cast<size_t>(alignment));
63}
64[[nodiscard]] LL_ALLOCATOR void* operator new[](std::size_t size, std::align_val_t alignment) {
65 return operator new(size, alignment);
66}
67[[nodiscard]] LL_NOTHROW_ALLOCATOR void*
68operator new[](std::size_t size, std::align_val_t alignment, std::nothrow_t const& tag) noexcept {
69 return operator new(size, alignment, tag);
70}
71#endif