From c085b61a568581761e3d3345d1d3b294bf19494f Mon Sep 17 00:00:00 2001 From: NotPppp1116 <264624490+NotPppp1116@users.noreply.github.com> Date: Tue, 16 Jun 2026 20:11:36 +0100 Subject: [PATCH] memory: add move assignment to CWeakPointer --- include/hyprutils/memory/WeakPtr.hpp | 17 ++++++++ tests/memory/WeakPtrMove.cpp | 65 ++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 tests/memory/WeakPtrMove.cpp diff --git a/include/hyprutils/memory/WeakPtr.hpp b/include/hyprutils/memory/WeakPtr.hpp index 44e2a27..5d2297e 100644 --- a/include/hyprutils/memory/WeakPtr.hpp +++ b/include/hyprutils/memory/WeakPtr.hpp @@ -105,6 +105,23 @@ namespace Hyprutils { return *this; } + template + validHierarchy&> operator=(CWeakPointer&& rhs) noexcept { + std::swap(impl_, rhs.impl_); + std::swap(m_data, rhs.m_data); + return *this; + } + + CWeakPointer& operator=(CWeakPointer&& rhs) noexcept { + if (this == &rhs) + return *this; + + std::swap(impl_, rhs.impl_); + std::swap(m_data, rhs.m_data); + + return *this; + } + /* create a weak ptr from a shared ptr with assignment */ template validHierarchy&> operator=(const CSharedPointer& rhs) { diff --git a/tests/memory/WeakPtrMove.cpp b/tests/memory/WeakPtrMove.cpp new file mode 100644 index 0000000..1ac9cda --- /dev/null +++ b/tests/memory/WeakPtrMove.cpp @@ -0,0 +1,65 @@ +#include +#include + +#include +#include + +using namespace Hyprutils::Memory; + +namespace { + class IBase { + public: + virtual ~IBase() = default; + int value = 0; + }; + + class CDerived : public IBase {}; +} + +TEST(Memory, weakPointerMoveAssignment) { + auto lhsOwner = makeShared(1); + auto rhsOwner = makeShared(2); + + CWeakPointer lhs = lhsOwner; + CWeakPointer rhs = rhsOwner; + + auto* lhsImpl = lhs.impl_; + auto* rhsImpl = rhs.impl_; + + ASSERT_EQ(lhsImpl->wref(), 1U); + ASSERT_EQ(rhsImpl->wref(), 1U); + + lhs = std::move(rhs); + + EXPECT_EQ(lhs.impl_, rhsImpl); + EXPECT_EQ(rhs.impl_, lhsImpl); + EXPECT_EQ(lhsImpl->wref(), 1U); + EXPECT_EQ(rhsImpl->wref(), 1U); + EXPECT_EQ(*lhs, 2); + EXPECT_EQ(*rhs, 1); +} + +TEST(Memory, weakPointerConvertingMoveAssignment) { + auto lhsOwner = makeShared(); + auto rhsOwner = makeShared(); + lhsOwner->value = 1; + rhsOwner->value = 2; + + CWeakPointer lhs = lhsOwner; + CWeakPointer rhs = rhsOwner; + + auto* lhsImpl = lhs.impl_; + auto* rhsImpl = rhs.impl_; + + ASSERT_EQ(lhsImpl->wref(), 1U); + ASSERT_EQ(rhsImpl->wref(), 1U); + + lhs = std::move(rhs); + + EXPECT_EQ(lhs.impl_, rhsImpl); + EXPECT_EQ(rhs.impl_, lhsImpl); + EXPECT_EQ(lhsImpl->wref(), 1U); + EXPECT_EQ(rhsImpl->wref(), 1U); + EXPECT_EQ(lhs->value, 2); + EXPECT_EQ(rhs->value, 1); +}