From d76e64c0626a5964bb5159fc8ae21182037cf4a1 Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Sat, 30 Aug 2025 00:30:09 +0200 Subject: [PATCH] Fixed converting auf DynamicPointers, added wrapDynamic helper to simplify creating non-owning DynamicPointers. --- source/mijin/memory/dynamic_pointer.hpp | 26 ++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/source/mijin/memory/dynamic_pointer.hpp b/source/mijin/memory/dynamic_pointer.hpp index 92ed97e..4e48b95 100644 --- a/source/mijin/memory/dynamic_pointer.hpp +++ b/source/mijin/memory/dynamic_pointer.hpp @@ -35,10 +35,11 @@ public: { MIJIN_ASSERT((std::bit_cast(ptr) & 1) == 0, "Invalid address, DynamicPointer requires addresses to be divisible by two."); } - template requires (std::is_constructible_v) + template requires (std::is_assignable_v && std::is_constructible_v) constexpr DynamicPointer(DynamicPointer&& other) MIJIN_NOEXCEPT_IF((std::is_nothrow_convertible_v)) - : mData(std::exchange(other.mData, 0)), mDeleter(std::move(other.mDeleter)) { - MIJIN_ASSERT(other.mData == 0, ""); + : DynamicPointer(other.get(), other.isOwning() ? Owning::YES : Owning::NO, TDeleter(std::move(other.mDeleter))) + { + other.mData = 0; } constexpr ~DynamicPointer() noexcept { @@ -64,6 +65,15 @@ public: return *this; } + // template requires (std::is_base_of_v) + // constexpr operator DynamicPointer() && // MIJIN_NOEXCEPT_IF(std::is_nothrow_move_constructible_v>) + // { + // const Owning owning = isOwning() ? Owning::YES : Owning::NO; + // T* const ptr = release(); + // + // return DynamicPointer(static_cast(ptr), owning, TOtherDeleter(std::move(mDeleter))); + // } + template requires(std::equality_comparable_with) auto operator<=>(const DynamicPointer& other) MIJIN_NOEXCEPT { @@ -155,9 +165,9 @@ bool operator!=(std::nullptr_t, const DynamicPointer& pointer) MIJI } template -DynamicPointer> makeDynamic(TArgs&&... args) MIJIN_NOEXCEPT_IF((std::is_nothrow_constructible_v)) +DynamicPointer makeDynamic(TArgs&&... args) MIJIN_NOEXCEPT_IF((std::is_nothrow_constructible_v)) { - return DynamicPointer>(new T(std::forward(args)...), Owning::YES); + return DynamicPointer(new T(std::forward(args)...), Owning::YES); } template TAllocator, typename... TArgs> @@ -171,6 +181,12 @@ DynamicPointer> makeDynamicWithAllocator(TAlloca } return DynamicPointer>(obj, Owning::YES, AllocatorDeleter(std::move(allocator))); } + +template +DynamicPointer wrapDynamic(T* raw) +{ + return DynamicPointer(raw, Owning::NO); +} } // namespace mijin #endif // !defined(MIJIN_MEMORY_DYNAMIC_POINTER_HPP_INCLUDED)