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)