[Scummvm-git-logs] scummvm master -> 8c61c7aecad7f59b18d379d1fc871213498973dc

sev- noreply at scummvm.org
Tue Jul 14 22:48:39 UTC 2026


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
8c61c7aeca COMMON: Add move-assign operator to DisposablePtr


Commit: 8c61c7aecad7f59b18d379d1fc871213498973dc
    https://github.com/scummvm/scummvm/commit/8c61c7aecad7f59b18d379d1fc871213498973dc
Author: Helco (hermann.noll at hotmail.com)
Date: 2026-07-15T00:48:35+02:00

Commit Message:
COMMON: Add move-assign operator to DisposablePtr

Changed paths:
    common/ptr.h
    test/common/ptr.h


diff --git a/common/ptr.h b/common/ptr.h
index 567e439aae7..c0fe1185ada 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -670,6 +670,14 @@ public:
 		if (_dispose) DL()(_pointer);
 	}
 
+	DisposablePtr<T, DL> &operator=(DisposablePtr<T, DL> &&o) {
+		reset(o._pointer, o._dispose);
+		_shared = move(o._shared);
+		o._pointer = nullptr;
+		o._dispose = DisposeAfterUse::NO;
+		return *this;
+	}
+
 	ReferenceType operator*() const { return *_pointer; }
 	PointerType operator->() const { return _pointer; }
 
diff --git a/test/common/ptr.h b/test/common/ptr.h
index 8200825dc13..ec3dbb0b975 100644
--- a/test/common/ptr.h
+++ b/test/common/ptr.h
@@ -166,6 +166,46 @@ class PtrTestSuite : public CxxTest::TestSuite {
 		TS_ASSERT(a.expired());
 		TS_ASSERT(!a.lock());
 	}
+
+	struct IsDeletedClass {
+		bool isDeleted = false;
+		void operator ()(IsDeletedClass *ptr) {
+			TS_ASSERT(!ptr->isDeleted);
+			ptr->isDeleted = true;
+		}
+	};
+
+	void test_disposable_move_assign() {
+		IsDeletedClass obj1, obj2, obj3, obj4;
+		Common::DisposablePtr<IsDeletedClass, IsDeletedClass> p1(&obj1, DisposeAfterUse::YES);
+
+		// move-assign from YES to YES ptr
+		{
+			Common::DisposablePtr<IsDeletedClass, IsDeletedClass> p2(&obj2, DisposeAfterUse::YES);
+			p1 = Common::move(p2);
+			TS_ASSERT(obj1.isDeleted);
+		}
+		TS_ASSERT(!obj2.isDeleted); // p2 did not delete its old object
+
+		// move-assign from NO to YES ptr
+		{
+			Common::DisposablePtr<IsDeletedClass, IsDeletedClass> p3(&obj3, DisposeAfterUse::NO);
+			p1 = Common::move(p3);
+			TS_ASSERT(obj2.isDeleted);
+		}
+		p1.reset();
+		TS_ASSERT(!obj3.isDeleted); // NO dispose flag was correctly propagated
+
+		// move-assign from YES to NO ptr
+		{
+			Common::DisposablePtr<IsDeletedClass, IsDeletedClass> p4(&obj4, DisposeAfterUse::YES);
+			p1 = Common::move(p4);
+			TS_ASSERT(!obj3.isDeleted); // this was still NO
+			TS_ASSERT(!obj4.isDeleted);
+		}
+		p1.reset();
+		TS_ASSERT(obj4.isDeleted); // YES dispose flag was correctly propagated
+	}
 };
 
 int PtrTestSuite::InstanceCountingClass::count = 0;




More information about the Scummvm-git-logs mailing list