Refactor a bunch of memory utilities
This commit is contained in:
@ -24,7 +24,7 @@ void* asl::GlobalHeap::alloc(const layout& layout)
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* asl::GlobalHeap::realloc(void* old_ptr, const layout& old_layout, const layout& new_layout)
|
void* asl::GlobalHeap::realloc(void* old_ptr, [[maybe_unused]] const layout& old_layout, const layout& new_layout)
|
||||||
{
|
{
|
||||||
#if ASL_OS_WINDOWS
|
#if ASL_OS_WINDOWS
|
||||||
return ::_aligned_realloc(old_ptr,
|
return ::_aligned_realloc(old_ptr,
|
||||||
|
@ -58,10 +58,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (m_ptr != nullptr)
|
if (m_ptr != nullptr)
|
||||||
{
|
{
|
||||||
if constexpr (!trivially_destructible<T>)
|
destruct(m_ptr);
|
||||||
{
|
|
||||||
m_ptr->~T();
|
|
||||||
}
|
|
||||||
m_alloc.dealloc(m_ptr, layout::of<T>());
|
m_alloc.dealloc(m_ptr, layout::of<T>());
|
||||||
m_ptr = nullptr;
|
m_ptr = nullptr;
|
||||||
}
|
}
|
||||||
@ -92,7 +89,7 @@ constexpr box<T, Allocator> make_box_in(Allocator allocator, Args&&... args)
|
|||||||
requires constructible_from<T, Args&&...>
|
requires constructible_from<T, Args&&...>
|
||||||
{
|
{
|
||||||
void* raw_ptr = allocator.alloc(layout::of<T>());
|
void* raw_ptr = allocator.alloc(layout::of<T>());
|
||||||
T* ptr = new (raw_ptr) T(ASL_FWD(args)...);
|
auto* ptr = construct_at<T>(raw_ptr, ASL_FWD(args)...);
|
||||||
return box(ptr, ASL_MOVE(allocator));
|
return box(ptr, ASL_MOVE(allocator));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,7 +99,7 @@ constexpr box<T, Allocator> make_box(Args&&... args)
|
|||||||
{
|
{
|
||||||
Allocator allocator{};
|
Allocator allocator{};
|
||||||
void* raw_ptr = allocator.alloc(layout::of<T>());
|
void* raw_ptr = allocator.alloc(layout::of<T>());
|
||||||
T* ptr = new (raw_ptr) T{ ASL_FWD(args)... };
|
auto* ptr = construct_at<T>(raw_ptr, ASL_FWD(args)...);
|
||||||
return box<T>(ptr, ASL_MOVE(allocator));
|
return box<T>(ptr, ASL_MOVE(allocator));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,30 +132,7 @@ public:
|
|||||||
|
|
||||||
T* new_data = reinterpret_cast<T*>(m_allocator.alloc(new_layout));
|
T* new_data = reinterpret_cast<T*>(m_allocator.alloc(new_layout));
|
||||||
|
|
||||||
// @Todo Move this logic somewhere else. Make move/destruct/etc. abstractions.
|
relocate_uninit_n(new_data, old_data, current_size);
|
||||||
|
|
||||||
if constexpr (trivially_copyable<T>)
|
|
||||||
{
|
|
||||||
auto init_layout = layout::array<T>(current_size);
|
|
||||||
memcpy(new_data, old_data, init_layout.size);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
static_assert(move_constructible<T>);
|
|
||||||
for (isize_t i = 0; i < current_size; ++i)
|
|
||||||
{
|
|
||||||
// NOLINTNEXTLINE(*-pointer-arithmetic)
|
|
||||||
new(new_data + i) T(ASL_MOVE(old_data[i]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if constexpr (!trivially_destructible<T>)
|
|
||||||
{
|
|
||||||
for (isize_t i = 0; i < current_size; ++i)
|
|
||||||
{
|
|
||||||
(old_data + i)->~T();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currently_on_heap)
|
if (currently_on_heap)
|
||||||
{
|
{
|
||||||
|
@ -47,16 +47,13 @@ public:
|
|||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
constexpr void init_unsafe(Args&&... args) &
|
constexpr void init_unsafe(Args&&... args) &
|
||||||
{
|
{
|
||||||
new(uninit_ptr()) T(ASL_FWD(args)...);
|
construct_at<T>(uninit_ptr(), ASL_FWD(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Safety Must be called only when in initialized state.
|
// @Safety Must be called only when in initialized state.
|
||||||
constexpr void uninit_unsafe() &
|
constexpr void uninit_unsafe() &
|
||||||
{
|
{
|
||||||
if constexpr (!trivially_destructible<T>)
|
destruct(init_ptr_unsafe());
|
||||||
{
|
|
||||||
init_ptr_unsafe()->~T();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "asl/integers.hpp"
|
#include "asl/integers.hpp"
|
||||||
|
#include "asl/meta.hpp"
|
||||||
|
#include "asl/layout.hpp"
|
||||||
|
#include "asl/utility.hpp"
|
||||||
|
|
||||||
constexpr void* operator new(size_t, void* ptr)
|
constexpr void* operator new(size_t, void* ptr)
|
||||||
{
|
{
|
||||||
@ -25,5 +28,53 @@ constexpr isize_t strlen(const char* s)
|
|||||||
return static_cast<isize_t>(__builtin_strlen(s));
|
return static_cast<isize_t>(__builtin_strlen(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T, typename... Args>
|
||||||
|
constexpr T* construct_at(void* ptr, Args&&... args)
|
||||||
|
requires constructible_from<T, Args&&...>
|
||||||
|
{
|
||||||
|
return new (ptr) T{ ASL_FWD(args)... };
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr void destruct(T* data)
|
||||||
|
{
|
||||||
|
if constexpr (!trivially_destructible<T>)
|
||||||
|
{
|
||||||
|
data->~T();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr void destruct_n(T* data, isize_t n)
|
||||||
|
{
|
||||||
|
if constexpr (!trivially_destructible<T>)
|
||||||
|
{
|
||||||
|
for (isize_t i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
|
destruct(data + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr void relocate_uninit_n(T* to, T* from, isize_t n)
|
||||||
|
{
|
||||||
|
if constexpr (trivially_copyable<T>)
|
||||||
|
{
|
||||||
|
memcpy(to, from, size_of<T> * n);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
static_assert(move_constructible<T>);
|
||||||
|
for (isize_t i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
|
// NOLINTNEXTLINE(*-pointer-arithmetic)
|
||||||
|
construct_at<T>(to + i, ASL_MOVE(from[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destruct_n(from, n);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace asl
|
} // namespace asl
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ class option
|
|||||||
|
|
||||||
if constexpr (kHasInlinePayload)
|
if constexpr (kHasInlinePayload)
|
||||||
{
|
{
|
||||||
new (&m_payload) T(ASL_FWD(args)...);
|
construct_at<T>(&m_payload, ASL_FWD(args)...);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -389,11 +389,8 @@ public:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if constexpr (!trivially_destructible<T>)
|
destruct(&m_payload);
|
||||||
{
|
construct_at<T>(&m_payload, niche{});
|
||||||
(&m_payload)->~T();
|
|
||||||
}
|
|
||||||
new (&m_payload) T(niche{});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user