Give UnownedPtr<> a move ctor and move assign operator.
Otherwise, the examples added to the unit test will trip an
incorrect asssertion.
Change-Id: I1dc85cfdf0937036c4493e43ee9dfac03ec38767
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/63156
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/unowned_ptr.h b/core/fxcrt/unowned_ptr.h
index 7bbd937..5a8ee3d 100644
--- a/core/fxcrt/unowned_ptr.h
+++ b/core/fxcrt/unowned_ptr.h
@@ -49,6 +49,7 @@
public:
constexpr UnownedPtr() noexcept = default;
constexpr UnownedPtr(const UnownedPtr& that) noexcept = default;
+ constexpr UnownedPtr(UnownedPtr&& that) noexcept : m_pObj(that.Release()) {}
template <typename U>
explicit constexpr UnownedPtr(U* pObj) noexcept : m_pObj(pObj) {}
@@ -75,6 +76,12 @@
return *this;
}
+ UnownedPtr& operator=(UnownedPtr&& that) noexcept {
+ if (*this != that)
+ Reset(that.Release());
+ return *this;
+ }
+
bool operator==(const UnownedPtr& that) const { return Get() == that.Get(); }
bool operator!=(const UnownedPtr& that) const { return !(*this == that); }
bool operator<(const UnownedPtr& that) const {
diff --git a/core/fxcrt/unowned_ptr_unittest.cpp b/core/fxcrt/unowned_ptr_unittest.cpp
index c125873..f1979ef 100644
--- a/core/fxcrt/unowned_ptr_unittest.cpp
+++ b/core/fxcrt/unowned_ptr_unittest.cpp
@@ -114,6 +114,25 @@
}
}
+TEST(UnownedPtr, MoveCtorOk) {
+ UnownedPtr<Clink> outer;
+ {
+ auto owned = pdfium::MakeUnique<Clink>();
+ outer = owned.get();
+ UnownedPtr<Clink> inner(std::move(outer));
+ }
+}
+
+TEST(UnownedPtr, MoveAssignOk) {
+ UnownedPtr<Clink> outer;
+ {
+ auto owned = pdfium::MakeUnique<Clink>();
+ outer = owned.get();
+ UnownedPtr<Clink> inner;
+ inner = std::move(outer);
+ }
+}
+
TEST(UnownedPtr, ReleaseNotOk) {
#if defined(ADDRESS_SANITIZER)
EXPECT_DEATH(ReleaseDangling(), "");