mirror of
https://github.com/hyprwm/hyprutils.git
synced 2025-12-20 04:40:08 +01:00
weak
This commit is contained in:
parent
117d6fc98d
commit
70d58f9988
2 changed files with 23 additions and 5 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue