This commit is contained in:
Vaxry 2025-12-01 19:10:20 +00:00
parent 117d6fc98d
commit 70d58f9988
Signed by: vaxry
GPG key ID: 665806380871D640
2 changed files with 23 additions and 5 deletions

View file

@ -220,6 +220,16 @@ namespace Hyprutils {
impl_->incWeak();
}
};
template <typename T, typename U>
CWeakPointer<T> dynamicPointerCast(const CWeakPointer<U>& ref) {
if (!ref)
return nullptr;
T* newPtr = dynamic_cast<T*>(sc<U*>(ref.impl_->getData()));
if (!newPtr)
return nullptr;
return CWeakPointer<T>(ref.impl_, newPtr);
}
}
}

View file

@ -125,19 +125,22 @@ static void testAtomicImpl() {
class InterfaceA {
public:
int m_ifaceAInt = 69;
int m_ifaceAShit = 1;
virtual ~InterfaceA() = default;
int m_ifaceAInt = 69;
int m_ifaceAShit = 1;
};
class InterfaceB {
public:
int m_ifaceBInt = 2;
int m_ifaceBShit = 3;
virtual ~InterfaceB() = default;
int m_ifaceBInt = 2;
int m_ifaceBShit = 3;
};
class CChild : public InterfaceA, public InterfaceB {
public:
int m_childInt = 4;
virtual ~CChild() = default;
int m_childInt = 4;
};
class CChildA : public InterfaceA {
@ -206,19 +209,24 @@ static void testHierarchy() {
EXPECT_EQ(ifaceB->m_ifaceBInt, 2);
AWP<InterfaceA> ifaceAWeak = ifaceA;
AWP<InterfaceB> ifaceBWeak = dynamicPointerCast<InterfaceB>(ifaceA);
child.reset();
EXPECT_TRUE(ifaceAWeak);
EXPECT_TRUE(ifaceBWeak);
EXPECT_TRUE(ifaceA);
EXPECT_EQ(ifaceAWeak->m_ifaceAInt, 69);
EXPECT_EQ(ifaceA->m_ifaceAInt, 69);
EXPECT_EQ(ifaceBWeak->m_ifaceBInt, 2);
ifaceA.reset();
EXPECT_TRUE(ifaceAWeak);
EXPECT_EQ(ifaceAWeak->m_ifaceAInt, 69);
EXPECT_TRUE(ifaceB);
EXPECT_EQ(ifaceB->m_ifaceBInt, 2);
EXPECT_EQ(ifaceBWeak->m_ifaceBInt, 2);
ifaceB.reset();
EXPECT_TRUE(!ifaceAWeak);
EXPECT_TRUE(!ifaceBWeak);
}
// test for leaks