[*] Harden AuCastPointer

This commit is contained in:
Reece Wilson 2024-02-15 01:10:23 +00:00
parent 98b72f7e0a
commit 72335a09a9

View File

@ -134,6 +134,26 @@ namespace Aurora::Memory
pHeap->_Free(pVoids); pHeap->_Free(pVoids);
} }
template <typename T, typename Z>
static void DeleteThatCastedOnce(T *pThat)
{
static const auto kAlignment = AuMax(alignof(T), sizeof(void *));
auto pBaseClass = AuStaticCast<Z>(pThat);
if constexpr (AuIsClass_v<T>
#if !defined(AURT_HEAP_NO_STL)
&& !std::is_trivially_destructible_v<T>
#endif
)
{
pBaseClass->~Z();
}
auto &pHeap = *(Heap **)(((char *)pBaseClass) - kAlignment);
pHeap->_Free(&pHeap);
}
template <typename T> template <typename T>
static void RetardedSpecWrittenByRetards(T *pThat) static void RetardedSpecWrittenByRetards(T *pThat)
@ -354,10 +374,13 @@ namespace Aurora::Memory
{ {
return NullUniquePointer<Z>(); return NullUniquePointer<Z>();
} }
else if (pInPointer.get_deleter() == &Heap::DeleteThat<T>)
{
return AuUPtr<Z, decltype(&Heap::DeleteThat<Z>)>(AuStaticCast<Z>(pInPointer.release()), &Heap::DeleteThatCastedOnce<Z, T>);
}
else else
{ {
auto deleter = decltype(&Heap::DeleteThat<Z>)(pInPointer.get_deleter()); return NullUniquePointer<Z>();
return AuUPtr<Z, decltype(&Heap::DeleteThat<Z>)>(AuStaticCast<Z>(pInPointer.release()), deleter);
} }
} }