[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