10#include "ll/api/base/FixedString.h"
11#include "ll/api/base/Macro.h"
12#include "ll/api/memory/Signature.h"
13#include "ll/api/memory/Symbol.h"
14#include "mc/platform/brstd/function_ref.h"
16namespace Bedrock::Memory {
17class IMemoryAllocator;
25 requires(
sizeof(T) ==
sizeof(FuncPtr))
26constexpr FuncPtr toFuncPtr(T t) {
36 requires(std::is_member_function_pointer_v<T> &&
sizeof(T) ==
sizeof(FuncPtr) +
sizeof(ptrdiff_t))
37constexpr FuncPtr toFuncPtr(T t) {
50inline void memcpy_t(
void* dst,
void const* src,
size_t count) {
51 memcpy(dst, src, count *
sizeof(T));
55inline void memcpy_t(
void* dst,
void const* src) {
56 memcpy(dst, src,
sizeof(T));
69 modify((
void*)std::addressof(ref),
sizeof(T), [&] { f((std::remove_cv_t<T>&)(ref)); });
72template <
class R = void,
class... Args>
73constexpr auto addressCall(
void const* address,
auto&&... args) -> R {
74 return ((R(*)(Args...))address)(std::forward<decltype((args))>(args)...);
77template <
class R = void,
class... Args>
78constexpr auto virtualCall(
void const* self, ptrdiff_t vIndex,
auto&&... args) -> R {
79 return (*(R(**)(
void const*, Args...))(*(uintptr_t**)self + vIndex))(self, std::forward<decltype((args))>(args)...);
83[[nodiscard]]
constexpr T& dAccess(
void* ptr, ptrdiff_t off) {
84 return *(T*)((uintptr_t)((uintptr_t)ptr + off));
88[[nodiscard]]
constexpr T
const& dAccess(
void const* ptr, ptrdiff_t off) {
89 return *(T*)((uintptr_t)((uintptr_t)ptr + off));
93constexpr void destruct(
void* ptr, ptrdiff_t off)
noexcept {
94 std::destroy_at(std::launder(
reinterpret_cast<T*
>((uintptr_t)((uintptr_t)ptr + off))));
97template <
class T,
class... Args>
98constexpr auto construct(
void* ptr, ptrdiff_t off, Args&&... args) {
99 return std::construct_at(
100 std::launder(
reinterpret_cast<T*
>((uintptr_t)((uintptr_t)ptr + off))),
101 std::forward<Args>(args)...
105LLNDAPI ::Bedrock::Memory::IMemoryAllocator& getDefaultAllocator();
107[[noreturn]] LLAPI
void throwMemoryException(
size_t);
109LLNDAPI
size_t getUsableSize(
void* ptr);
111template <
class T,
class D>
112[[nodiscard]]
inline size_t getUsableSize(std::unique_ptr<T, D>& ptr) {
116 return getUsableSize(ptr.get());
120template <
template <
class>
class P,
class T>
121[[nodiscard]]
inline size_t getUsableSize(P<T>& ptr)
122 requires(std::derived_from<P<T>, std::_Ptr_base<T>>)
124 auto& refc = dAccess<std::_Ref_count_base*>(std::addressof(ptr), 8);
128 auto& rawptr = dAccess<T*>(std::addressof(ptr), 0);
132 if constexpr (!std::is_array_v<T>) {
133 if (rawptr == dAccess<T*>(refc, 8 + 4 * 2)) {
134 return getUsableSize(rawptr);
138 return getUsableSize(refc
142 (std::is_array_v<T> ? 8 : 0)
155 LLAPI
void alloc(
size_t size);
164 size_t size()
const {
return memSize; }
166 void* writable()
const {
return rw; }
167 void* executable()
const {
return rx; }
Definition function_ref.h:60