diff --git a/include/hyprutils/memory/SharedPtr.hpp b/include/hyprutils/memory/SharedPtr.hpp index d2c5995..94c0ec0 100644 --- a/include/hyprutils/memory/SharedPtr.hpp +++ b/include/hyprutils/memory/SharedPtr.hpp @@ -16,6 +16,12 @@ namespace Hyprutils { namespace Memory { + struct SForceReinterpret { + explicit SForceReinterpret() = default; + }; + + constexpr SForceReinterpret FORCE_REINTERPRET = SForceReinterpret(); + template class CSharedPointer { public: @@ -38,6 +44,12 @@ namespace Hyprutils { increment(); } + template + CSharedPointer(const CSharedPointer& ref, SForceReinterpret) noexcept { + impl_ = ref.impl_; + increment(); + } + CSharedPointer(const CSharedPointer& ref) noexcept { impl_ = ref.impl_; increment(); @@ -144,7 +156,7 @@ namespace Hyprutils { Impl_::impl_base* impl_ = nullptr; private: - /* + /* no-op if there is no impl_ may delete the stored object if ref == 0 may delete and reset impl_ if ref == 0 and weak == 0 @@ -167,7 +179,7 @@ namespace Hyprutils { impl_->inc(); } - /* destroy the pointed-to object + /* destroy the pointed-to object if able, will also destroy impl */ void destroyImpl() { // destroy the impl contents