[Scummvm-git-logs] scummvm master -> 93efb9b8c553db742ec343380b674caa871b9450

sev- noreply at scummvm.org
Mon Nov 28 17:41:36 UTC 2022


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

Summary:
8d722dc3c1 COMMON: Add DisposablePtr constructor with move semantics
02f1759f73 COMMON: Add functions to dynamically cast DisposablePtr
d6d85c8093 AUDIO: Add LoopingAudioStream constructor from move of DisposablePtr.
27532df2c7 AUDIO: Use DisposablePtr-move constructor for looping in mixer
68452ef2e7 COMMON: Kill disownPtr and getDispose from DisposablePtr
93efb9b8c5 COMMON: Allow DisposablePtr to be backed by SharedPtr


Commit: 8d722dc3c105b046389024a00bf4da7caeb2e2a6
    https://github.com/scummvm/scummvm/commit/8d722dc3c105b046389024a00bf4da7caeb2e2a6
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00

Commit Message:
COMMON: Add DisposablePtr constructor with move semantics

This allows easy move from one DisposablePtr to another

Changed paths:
    common/ptr.h


diff --git a/common/ptr.h b/common/ptr.h
index 9193b9b1051..a494c68e841 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -657,6 +657,10 @@ public:
 	typedef T &ReferenceType;
 
 	explicit DisposablePtr(PointerType o, DisposeAfterUse::Flag dispose) : _pointer(o), _dispose(dispose) {}
+	DisposablePtr(DisposablePtr<T>&& o) : _pointer(o._pointer), _dispose(o._dispose) {
+		o._pointer = nullptr;
+		o._dispose = DisposeAfterUse::NO;
+	}
 
 	~DisposablePtr() {
 		if (_dispose) DL()(_pointer);


Commit: 02f1759f73b9fd105ba3df7c20fdb298f75c36b6
    https://github.com/scummvm/scummvm/commit/02f1759f73b9fd105ba3df7c20fdb298f75c36b6
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00

Commit Message:
COMMON: Add functions to dynamically cast DisposablePtr

Changed paths:
    common/ptr.h


diff --git a/common/ptr.h b/common/ptr.h
index a494c68e841..9fabed51aa2 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -691,6 +691,23 @@ public:
 		reset(nullptr, DisposeAfterUse::NO);
 	}
 
+	template <class T2>
+	bool isDynamicallyCastable() {
+		return dynamic_cast<T2 *>(_pointer) != nullptr;
+	}
+
+	/* Destroys the smart pointer while returning a pointer to
+	   assign to a new object.
+ 	 */
+	template <class T2, class DL2 = DefaultDeleter<T2> >
+	DisposablePtr<T2, DL2> moveAndDynamicCast() {
+		DisposablePtr<T2, DL2> ret(
+			dynamic_cast<T2 *>(_pointer), _dispose);
+ 		_pointer = nullptr;
+ 		_dispose = DisposeAfterUse::NO;
+		return ret;
+ 	}
+
 	/**
 	 * Clears the pointer without destroying the old object.
 	 */
@@ -711,6 +728,9 @@ public:
 	 */
 	DisposeAfterUse::Flag getDispose() const { return _dispose; }
 
+	template <class T2, class DL2>
+	friend class DisposablePtr;
+
 private:
 	PointerType           _pointer;
 	DisposeAfterUse::Flag _dispose;


Commit: d6d85c80935ad17339185518eb3d53bb2831afa4
    https://github.com/scummvm/scummvm/commit/d6d85c80935ad17339185518eb3d53bb2831afa4
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00

Commit Message:
AUDIO: Add LoopingAudioStream constructor from move of DisposablePtr.

Changed paths:
    audio/audiostream.cpp
    audio/audiostream.h


diff --git a/audio/audiostream.cpp b/audio/audiostream.cpp
index 08de5bee61f..4624ee437bd 100644
--- a/audio/audiostream.cpp
+++ b/audio/audiostream.cpp
@@ -92,20 +92,23 @@ SeekableAudioStream *SeekableAudioStream::openStreamFile(const Common::String &b
 #pragma mark --- LoopingAudioStream ---
 #pragma mark -
 
-LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse, bool rewind)
-	: _parent(stream, disposeAfterUse), _loops(loops), _completeIterations(0) {
-	assert(stream);
+LoopingAudioStream::LoopingAudioStream(Common::DisposablePtr<RewindableAudioStream>&& stream, uint loops, bool rewind)
+        : _parent(Common::move(stream)), _loops(loops), _completeIterations(0) {
+	assert(_parent);
 
-	if (rewind && !stream->rewind()) {
+	if (rewind && !_parent->rewind()) {
 		// TODO: Properly indicate error
 		_loops = _completeIterations = 1;
 	}
-	if (stream->endOfStream()) {
+	if (_parent->endOfStream()) {
 		// Apparently this is an empty stream
 		_loops = _completeIterations = 1;
 	}
 }
 
+LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse, bool rewind)
+	: LoopingAudioStream(Common::move(Common::DisposablePtr<RewindableAudioStream>(stream, disposeAfterUse)), loops, rewind) {}
+
 int LoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) {
 	if ((_loops && _completeIterations == _loops) || !numSamples)
 		return 0;
diff --git a/audio/audiostream.h b/audio/audiostream.h
index d8779623894..0de0ce45404 100644
--- a/audio/audiostream.h
+++ b/audio/audiostream.h
@@ -157,6 +157,20 @@ public:
 	 */
 	LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES, bool rewind = true);
 
+	/**
+	 * Create a looping audio stream object.
+	 *
+	 * On creation of the LoopingAudioStream object, the underlying stream will be rewound.
+	 *
+	 * @see makeLoopingAudioStream
+	 *
+	 * @param stream  The stream to loop.
+	 * @param loops   How often to loop (0 = infinite).
+	 * @param disposeAfterUse  Destroy the stream after the LoopingAudioStream has finished playback.
+	 * @param rewind  If true, rewind the underlying stream.
+	 */
+	LoopingAudioStream(Common::DisposablePtr<RewindableAudioStream>&& stream, uint loops, bool rewind = true);
+
 	int readBuffer(int16 *buffer, const int numSamples);
 	bool endOfData() const;
 	bool endOfStream() const;


Commit: 27532df2c7f5779d45376622f3a56b13441e704d
    https://github.com/scummvm/scummvm/commit/27532df2c7f5779d45376622f3a56b13441e704d
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00

Commit Message:
AUDIO: Use DisposablePtr-move constructor for looping in mixer

It's much cleaner than disowning the pointer from DisposablePtr

Changed paths:
    audio/mixer.cpp


diff --git a/audio/mixer.cpp b/audio/mixer.cpp
index 3e348402827..7672988cd9b 100644
--- a/audio/mixer.cpp
+++ b/audio/mixer.cpp
@@ -635,11 +635,8 @@ Timestamp Channel::getElapsedTime() {
 void Channel::loop() {
 	assert(_stream);
 
-	Audio::RewindableAudioStream *rewindableStream = dynamic_cast<RewindableAudioStream *>(_stream.get());
-	if (rewindableStream) {
-		DisposeAfterUse::Flag dispose = _stream.getDispose();
-		_stream.disownPtr();
-		Audio::LoopingAudioStream *loopingStream = new Audio::LoopingAudioStream(rewindableStream, 0, dispose, false);
+	if (_stream.isDynamicallyCastable<RewindableAudioStream>()) {
+		Audio::LoopingAudioStream *loopingStream = new Audio::LoopingAudioStream(Common::move(_stream.moveAndDynamicCast<RewindableAudioStream>()), 0, false);
 		_stream.reset(loopingStream, DisposeAfterUse::YES);
 	}
 }


Commit: 68452ef2e7911ed7985d4a47a975c4d759ea5c40
    https://github.com/scummvm/scummvm/commit/68452ef2e7911ed7985d4a47a975c4d759ea5c40
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00

Commit Message:
COMMON: Kill disownPtr and getDispose from DisposablePtr

They unnecessarily expose internal details

Their only user has been eliminated in the previous commit

Changed paths:
    common/ptr.h


diff --git a/common/ptr.h b/common/ptr.h
index 9fabed51aa2..8a9165a7536 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -708,14 +708,6 @@ public:
 		return ret;
  	}
 
-	/**
-	 * Clears the pointer without destroying the old object.
-	 */
-	void disownPtr() {
-		_pointer = nullptr;
-		_dispose = DisposeAfterUse::NO;
-	}
-
 	/**
 	 * Returns the plain pointer value.
 	 *
@@ -723,11 +715,6 @@ public:
 	 */
 	PointerType get() const { return _pointer; }
 
-	/**
-	 * Returns the pointer's dispose flag.
-	 */
-	DisposeAfterUse::Flag getDispose() const { return _dispose; }
-
 	template <class T2, class DL2>
 	friend class DisposablePtr;
 


Commit: 93efb9b8c553db742ec343380b674caa871b9450
    https://github.com/scummvm/scummvm/commit/93efb9b8c553db742ec343380b674caa871b9450
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00

Commit Message:
COMMON: Allow DisposablePtr to be backed by SharedPtr

Currently DisposablePtr allows to transparently switch between raw
pointer and ScopedPtr semantics. Add a possibility to have SharedPtr
semantics as well.

Changed paths:
    common/ptr.h


diff --git a/common/ptr.h b/common/ptr.h
index 8a9165a7536..2922dbdb4e8 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -656,10 +656,12 @@ public:
 	typedef T *PointerType;
 	typedef T &ReferenceType;
 
-	explicit DisposablePtr(PointerType o, DisposeAfterUse::Flag dispose) : _pointer(o), _dispose(dispose) {}
-	DisposablePtr(DisposablePtr<T>&& o) : _pointer(o._pointer), _dispose(o._dispose) {
+	explicit DisposablePtr(PointerType o, DisposeAfterUse::Flag dispose) : _pointer(o), _dispose(dispose), _shared() {}
+	explicit DisposablePtr(SharedPtr<T> o) : _pointer(o.get()), _dispose(DisposeAfterUse::NO), _shared(o) {}
+	DisposablePtr(DisposablePtr<T>&& o) : _pointer(o._pointer), _dispose(o._dispose), _shared(o._shared) {
 		o._pointer = nullptr;
 		o._dispose = DisposeAfterUse::NO;
+		o._shared.reset();
 	}
 
 	~DisposablePtr() {
@@ -682,6 +684,7 @@ public:
 		if (_dispose) DL()(_pointer);
 		_pointer = o;
 		_dispose = dispose;
+		_shared.reset();
 	}
 
 	/**
@@ -701,12 +704,15 @@ public:
  	 */
 	template <class T2, class DL2 = DefaultDeleter<T2> >
 	DisposablePtr<T2, DL2> moveAndDynamicCast() {
-		DisposablePtr<T2, DL2> ret(
-			dynamic_cast<T2 *>(_pointer), _dispose);
- 		_pointer = nullptr;
- 		_dispose = DisposeAfterUse::NO;
+		DisposablePtr<T2, DL2> ret(nullptr, DisposeAfterUse::NO);
+		ret._pointer = dynamic_cast<T2 *>(_pointer);
+		ret._dispose = _dispose;
+		ret._shared = _shared.template dynamicCast<T2>();
+		_pointer = nullptr;
+		_dispose = DisposeAfterUse::NO;
+		_shared.reset();
 		return ret;
- 	}
+	}
 
 	/**
 	 * Returns the plain pointer value.
@@ -719,8 +725,11 @@ public:
 	friend class DisposablePtr;
 
 private:
+	DisposablePtr() : _pointer(nullptr), _dispose(DisposeAfterUse::NO), _shared() {}
 	PointerType           _pointer;
 	DisposeAfterUse::Flag _dispose;
+	SharedPtr<T>          _shared;
+	bool                  _isvalid;
 };
 
 /** @} */




More information about the Scummvm-git-logs mailing list