From f6f3a932fc7c99e5e1d16c88dd51f7b1888a8ae2 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 12 May 2022 10:14:07 -0700 Subject: [PATCH] [owned-ptr] add method `PassOwnership()` (#7684) --- src/core/common/owned_ptr.hpp | 8 ++++++++ tests/unit/test_smart_ptrs.cpp | 14 +++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/core/common/owned_ptr.hpp b/src/core/common/owned_ptr.hpp index f507e3dbe..ab98fd3f9 100644 --- a/src/core/common/owned_ptr.hpp +++ b/src/core/common/owned_ptr.hpp @@ -144,6 +144,14 @@ public: return pointer; } + /** + * This method allows passing of the ownership to another `OwnedPtr` using move semantics. + * + * @returns An rvalue reference of the pointer to move from. + * + */ + OwnedPtr &&PassOwnership(void) { return static_cast(*this); } + /** * This method overload the assignment operator `=` to replace the object owned by the `OwnedPtr` with another one * using move semantics. diff --git a/tests/unit/test_smart_ptrs.cpp b/tests/unit/test_smart_ptrs.cpp index a892d1cfa..273dc9d26 100644 --- a/tests/unit/test_smart_ptrs.cpp +++ b/tests/unit/test_smart_ptrs.cpp @@ -121,7 +121,7 @@ void TestOwnedPtr(void) { OwnedPtr ptr1(&obj1); - OwnedPtr ptr2(static_cast &&>(ptr1)); + OwnedPtr ptr2(ptr1.PassOwnership()); VerifyPointer(ptr1, nullptr); VerifyPointer(ptr2, &obj1); @@ -209,26 +209,26 @@ void TestOwnedPtr(void) VerifyPointer(ptr3, &obj3); // Move from non-null (ptr1) to non-null (ptr2) - ptr2 = static_cast &&>(ptr1); + ptr2 = ptr1.PassOwnership(); VerifyPointer(ptr1, nullptr); VerifyPointer(ptr2, &obj1); VerifyOrQuit(!obj1.WasFreed()); VerifyOrQuit(obj2.WasFreed()); // Move from null (ptr1) to non-null (ptr3) - ptr3 = static_cast &&>(ptr1); + ptr3 = ptr1.PassOwnership(); VerifyPointer(ptr1, nullptr); VerifyPointer(ptr3, nullptr); VerifyOrQuit(obj3.WasFreed()); // Move from non-null (ptr2) to null (ptr1) - ptr1 = static_cast &&>(ptr2); + ptr1 = ptr2.PassOwnership(); VerifyPointer(ptr1, &obj1); VerifyPointer(ptr2, nullptr); VerifyOrQuit(!obj1.WasFreed()); // Move from null (ptr2) to null (ptr3) - ptr3 = static_cast &&>(ptr2); + ptr3 = ptr2.PassOwnership(); VerifyPointer(ptr2, nullptr); VerifyPointer(ptr3, nullptr); VerifyOrQuit(!obj1.WasFreed()); @@ -247,11 +247,11 @@ void TestOwnedPtr(void) VerifyPointer(ptr2, nullptr); // Move from non-null (ptr1) to itself - ptr1 = static_cast &&>(ptr1); + ptr1 = ptr1.PassOwnership(); VerifyPointer(ptr1, &obj1); // Move from null (ptr2) to itself - ptr2 = static_cast &&>(ptr2); + ptr2 = ptr2.PassOwnership(); VerifyPointer(ptr2, nullptr); }