From 0c446ec5f4c39599ea97cb703dd3ac7718fb9169 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Mon, 6 May 2024 21:36:31 +0100 Subject: [PATCH] memory: fix SP/WP hierarchy templates --- src/helpers/memory/SharedPtr.hpp | 16 +++++++++------- src/helpers/memory/WeakPtr.hpp | 18 ++++++++++-------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/helpers/memory/SharedPtr.hpp b/src/helpers/memory/SharedPtr.hpp index ff9b4a45..77f5164a 100644 --- a/src/helpers/memory/SharedPtr.hpp +++ b/src/helpers/memory/SharedPtr.hpp @@ -122,7 +122,9 @@ template class CSharedPointer { public: template - using validHierarchy = typename std::enable_if::value>; + using validHierarchy = typename std::enable_if&, X>::value, CSharedPointer&>::type; + template + using isConstructible = typename std::enable_if::value>::type; /* creates a new shared pointer managing a resource avoid calling. Could duplicate ownership. Prefer makeShared */ @@ -132,7 +134,7 @@ class CSharedPointer { } /* creates a shared pointer from a reference */ - template > + template > CSharedPointer(const CSharedPointer& ref) noexcept { impl_ = ref.impl_; increment(); @@ -143,7 +145,7 @@ class CSharedPointer { increment(); } - template > + template > CSharedPointer(CSharedPointer&& ref) noexcept { std::swap(impl_, ref.impl_); } @@ -178,8 +180,8 @@ class CSharedPointer { decrement(); } - template > - CSharedPointer& operator=(const CSharedPointer& rhs) { + template + validHierarchy&> operator=(const CSharedPointer& rhs) { if (impl_ == rhs.impl_) return *this; @@ -199,8 +201,8 @@ class CSharedPointer { return *this; } - template > - CSharedPointer& operator=(CSharedPointer&& rhs) { + template + validHierarchy&> operator=(CSharedPointer&& rhs) { std::swap(impl_, rhs.impl_); return *this; } diff --git a/src/helpers/memory/WeakPtr.hpp b/src/helpers/memory/WeakPtr.hpp index 677fddf4..f0e72146 100644 --- a/src/helpers/memory/WeakPtr.hpp +++ b/src/helpers/memory/WeakPtr.hpp @@ -14,10 +14,12 @@ template class CWeakPointer { public: template - using validHierarchy = typename std::enable_if::value>; + using validHierarchy = typename std::enable_if&, X>::value, CWeakPointer&>::type; + template + using isConstructible = typename std::enable_if::value>::type; /* create a weak ptr from a reference */ - template > + template > CWeakPointer(const CSharedPointer& ref) noexcept { if (!ref.impl_) return; @@ -27,7 +29,7 @@ class CWeakPointer { } /* create a weak ptr from another weak ptr */ - template > + template > CWeakPointer(const CWeakPointer& ref) noexcept { if (!ref.impl_) return; @@ -44,7 +46,7 @@ class CWeakPointer { incrementWeak(); } - template > + template > CWeakPointer(CWeakPointer&& ref) noexcept { std::swap(impl_, ref.impl_); } @@ -54,8 +56,8 @@ class CWeakPointer { } /* create a weak ptr from another weak ptr with assignment */ - template > - CWeakPointer& operator=(const CWeakPointer& rhs) { + template + validHierarchy&> operator=(const CWeakPointer& rhs) { if (impl_ == rhs.impl_) return *this; @@ -76,8 +78,8 @@ class CWeakPointer { } /* create a weak ptr from a shared ptr with assignment */ - template > - CWeakPointer& operator=(const CSharedPointer& rhs) { + template + validHierarchy&> operator=(const CSharedPointer& rhs) { if ((uintptr_t)impl_ == (uintptr_t)rhs.impl_) return *this;