[Scummvm-cvs-logs] SF.net SVN: scummvm:[54336] scummvm/trunk/common/stream.cpp

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Thu Nov 18 18:56:22 CET 2010


Revision: 54336
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54336&view=rev
Author:   fingolfin
Date:     2010-11-18 17:56:21 +0000 (Thu, 18 Nov 2010)

Log Message:
-----------
COMMON: Turn BufferedWriteStream into a template class, with disposeParentStream as param

Modified Paths:
--------------
    scummvm/trunk/common/stream.cpp

Modified: scummvm/trunk/common/stream.cpp
===================================================================
--- scummvm/trunk/common/stream.cpp	2010-11-18 17:45:07 UTC (rev 54335)
+++ scummvm/trunk/common/stream.cpp	2010-11-18 17:56:21 UTC (rev 54336)
@@ -421,10 +421,10 @@
 /**
  * Wrapper class which adds buffering to any WriteStream.
  */
+template <DisposeAfterUse::Flag _disposeParentStream>
 class BufferedWriteStream : public WriteStream {
 protected:
 	WriteStream *_parentStream;
-	DisposeAfterUse::Flag _disposeParentStream;
 	byte *_buf;
 	uint32 _pos;
 	const uint32 _bufSize;
@@ -436,71 +436,71 @@
 	 * implemented by calling this method), except that it is not
 	 * virtual, hence there is less overhead calling it.
 	 */
-	bool flushBuffer();
+	bool flushBuffer() {
+		const uint32 bytesToWrite = _pos;
 
+		if (bytesToWrite) {
+			_pos = 0;
+			if (_parentStream->write(_buf, bytesToWrite) != bytesToWrite)
+				return false;
+		}
+		return true;
+	}
+
 public:
-	BufferedWriteStream(WriteStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO);
-	virtual ~BufferedWriteStream();
+	BufferedWriteStream(WriteStream *parentStream, uint32 bufSize)
+		: _parentStream(parentStream),
+		_pos(0),
+		_bufSize(bufSize) {
 
-	virtual uint32 write(const void *dataPtr, uint32 dataSize);
-	virtual bool flush() { return flushBuffer(); }
-};
+		assert(parentStream);
+		_buf = new byte[bufSize];
+		assert(_buf);
+	}
 
-BufferedWriteStream::BufferedWriteStream(WriteStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream)
-	: _parentStream(parentStream),
-	_disposeParentStream(disposeParentStream),
-	_pos(0),
-	_bufSize(bufSize) {
+	virtual ~BufferedWriteStream() {
+		const bool flushResult = flushBuffer();
+		assert(flushResult);
 
-	assert(parentStream);
-	_buf = new byte[bufSize];
-	assert(_buf);
-}
+		if (_disposeParentStream)
+			delete _parentStream;
 
-BufferedWriteStream::~BufferedWriteStream() {
-	const bool flushResult = flushBuffer();
-	assert(flushResult);
+		delete[] _buf;
+	}
 
-	if (_disposeParentStream)
-		delete _parentStream;
-
-	delete[] _buf;
-}
-
-uint32 BufferedWriteStream::write(const void *dataPtr, uint32 dataSize) {
-	// check if we have enough space for writing to the buffer
-	if (_bufSize - _pos >= dataSize) {
-		memcpy(_buf + _pos, dataPtr, dataSize);
-		_pos += dataSize;
-	} else if (_bufSize >= dataSize) {	// check if we can flush the buffer and load the data
-		const bool flushResult = flushBuffer();
-		assert(flushResult);
-		memcpy(_buf, dataPtr, dataSize);
-		_pos += dataSize;
-	} else	{	// too big for our buffer
-		const bool flushResult = flushBuffer();
-		assert(flushResult);
-		return _parentStream->write(dataPtr, dataSize);
+	virtual uint32 write(const void *dataPtr, uint32 dataSize) {
+		// check if we have enough space for writing to the buffer
+		if (_bufSize - _pos >= dataSize) {
+			memcpy(_buf + _pos, dataPtr, dataSize);
+			_pos += dataSize;
+		} else if (_bufSize >= dataSize) {	// check if we can flush the buffer and load the data
+			const bool flushResult = flushBuffer();
+			assert(flushResult);
+			memcpy(_buf, dataPtr, dataSize);
+			_pos += dataSize;
+		} else	{	// too big for our buffer
+			const bool flushResult = flushBuffer();
+			assert(flushResult);
+			return _parentStream->write(dataPtr, dataSize);
+		}
+		return dataSize;
 	}
-	return dataSize;
-}
 
-bool BufferedWriteStream::flushBuffer() {
-	const uint32 bytesToWrite = _pos;
+	virtual bool flush() { return flushBuffer(); }
 
-	if (bytesToWrite) {
-		_pos = 0;
-		if (_parentStream->write(_buf, bytesToWrite) != bytesToWrite)
-			return false;
-	}
-	return true;
-}
+};
 
 }	// End of nameless namespace
 
 WriteStream *wrapBufferedWriteStream(WriteStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream) {
-	if (parentStream)
-		return new BufferedWriteStream(parentStream, bufSize, disposeParentStream);
+	if (parentStream) {
+		switch (disposeParentStream) {
+		case DisposeAfterUse::YES:
+			return new BufferedWriteStream<DisposeAfterUse::YES>(parentStream, bufSize);
+		case DisposeAfterUse::NO:
+			return new BufferedWriteStream<DisposeAfterUse::NO>(parentStream, bufSize);
+		}
+	}
 	return 0;
 }
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list