mirror of
https://github.com/hyprwm/hyprutils.git
synced 2025-05-13 05:40:40 +01:00
memory: Add shared pointer reinterpretPointerCast function (#47)
* memory: Add force reinterpret constructor to shared pointer * memory: Change constructor to reinterpretPointerCast function * memory: Add reinterpretPointerCast test
This commit is contained in:
parent
61a5382f4b
commit
6b0154b183
2 changed files with 18 additions and 3 deletions
|
@ -144,7 +144,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 +167,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
|
||||
|
@ -185,6 +185,11 @@ namespace Hyprutils {
|
|||
static CSharedPointer<U> makeShared(Args&&... args) {
|
||||
return CSharedPointer<U>(new U(std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
template <typename T, typename U>
|
||||
CSharedPointer<T> reinterpretPointerCast(const CSharedPointer<U>& ref) {
|
||||
return CSharedPointer<T>(ref.impl_);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ using namespace Hyprutils::Memory;
|
|||
|
||||
int main(int argc, char** argv, char** envp) {
|
||||
SP<int> intPtr = makeShared<int>(10);
|
||||
SP<int> intPtr2 = makeShared<int>(1337);
|
||||
SP<int> intPtr2 = makeShared<int>(-1337);
|
||||
UP<int> intUnique = makeUnique<int>(420);
|
||||
|
||||
int ret = 0;
|
||||
|
@ -52,5 +52,15 @@ int main(int argc, char** argv, char** envp) {
|
|||
EXPECT(weak.expired(), true);
|
||||
EXPECT(weakUnique.expired(), true);
|
||||
|
||||
auto intPtr2AsUint = reinterpretPointerCast<unsigned int>(intPtr2);
|
||||
EXPECT(intPtr2.strongRef(), 4);
|
||||
EXPECT(intPtr2AsUint.strongRef(), 4);
|
||||
|
||||
EXPECT(*intPtr2AsUint > 0, true);
|
||||
EXPECT(*intPtr2AsUint, (unsigned int)(int)-1337);
|
||||
*intPtr2AsUint = 10;
|
||||
EXPECT(*intPtr2AsUint, 10);
|
||||
EXPECT(*intPtr2, 10);
|
||||
|
||||
return ret;
|
||||
}
|
Loading…
Reference in a new issue