COMMON: Turn BufferedWriteStream into a template class, with disposeParentStream as param
svn-id: r54336
This commit is contained in:
parent
c02a233084
commit
a9dcb11c54
1 changed files with 57 additions and 57 deletions
|
@ -421,10 +421,10 @@ namespace {
|
||||||
/**
|
/**
|
||||||
* Wrapper class which adds buffering to any WriteStream.
|
* Wrapper class which adds buffering to any WriteStream.
|
||||||
*/
|
*/
|
||||||
|
template <DisposeAfterUse::Flag _disposeParentStream>
|
||||||
class BufferedWriteStream : public WriteStream {
|
class BufferedWriteStream : public WriteStream {
|
||||||
protected:
|
protected:
|
||||||
WriteStream *_parentStream;
|
WriteStream *_parentStream;
|
||||||
DisposeAfterUse::Flag _disposeParentStream;
|
|
||||||
byte *_buf;
|
byte *_buf;
|
||||||
uint32 _pos;
|
uint32 _pos;
|
||||||
const uint32 _bufSize;
|
const uint32 _bufSize;
|
||||||
|
@ -436,28 +436,29 @@ protected:
|
||||||
* implemented by calling this method), except that it is not
|
* implemented by calling this method), except that it is not
|
||||||
* virtual, hence there is less overhead calling it.
|
* 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:
|
public:
|
||||||
BufferedWriteStream(WriteStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO);
|
BufferedWriteStream(WriteStream *parentStream, uint32 bufSize)
|
||||||
virtual ~BufferedWriteStream();
|
|
||||||
|
|
||||||
virtual uint32 write(const void *dataPtr, uint32 dataSize);
|
|
||||||
virtual bool flush() { return flushBuffer(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
BufferedWriteStream::BufferedWriteStream(WriteStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream)
|
|
||||||
: _parentStream(parentStream),
|
: _parentStream(parentStream),
|
||||||
_disposeParentStream(disposeParentStream),
|
|
||||||
_pos(0),
|
_pos(0),
|
||||||
_bufSize(bufSize) {
|
_bufSize(bufSize) {
|
||||||
|
|
||||||
assert(parentStream);
|
assert(parentStream);
|
||||||
_buf = new byte[bufSize];
|
_buf = new byte[bufSize];
|
||||||
assert(_buf);
|
assert(_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferedWriteStream::~BufferedWriteStream() {
|
virtual ~BufferedWriteStream() {
|
||||||
const bool flushResult = flushBuffer();
|
const bool flushResult = flushBuffer();
|
||||||
assert(flushResult);
|
assert(flushResult);
|
||||||
|
|
||||||
|
@ -465,9 +466,9 @@ BufferedWriteStream::~BufferedWriteStream() {
|
||||||
delete _parentStream;
|
delete _parentStream;
|
||||||
|
|
||||||
delete[] _buf;
|
delete[] _buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 BufferedWriteStream::write(const void *dataPtr, uint32 dataSize) {
|
virtual uint32 write(const void *dataPtr, uint32 dataSize) {
|
||||||
// check if we have enough space for writing to the buffer
|
// check if we have enough space for writing to the buffer
|
||||||
if (_bufSize - _pos >= dataSize) {
|
if (_bufSize - _pos >= dataSize) {
|
||||||
memcpy(_buf + _pos, dataPtr, dataSize);
|
memcpy(_buf + _pos, dataPtr, dataSize);
|
||||||
|
@ -483,24 +484,23 @@ uint32 BufferedWriteStream::write(const void *dataPtr, uint32 dataSize) {
|
||||||
return _parentStream->write(dataPtr, dataSize);
|
return _parentStream->write(dataPtr, dataSize);
|
||||||
}
|
}
|
||||||
return dataSize;
|
return dataSize;
|
||||||
}
|
|
||||||
|
|
||||||
bool BufferedWriteStream::flushBuffer() {
|
|
||||||
const uint32 bytesToWrite = _pos;
|
|
||||||
|
|
||||||
if (bytesToWrite) {
|
|
||||||
_pos = 0;
|
|
||||||
if (_parentStream->write(_buf, bytesToWrite) != bytesToWrite)
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
virtual bool flush() { return flushBuffer(); }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
} // End of nameless namespace
|
} // End of nameless namespace
|
||||||
|
|
||||||
WriteStream *wrapBufferedWriteStream(WriteStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream) {
|
WriteStream *wrapBufferedWriteStream(WriteStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream) {
|
||||||
if (parentStream)
|
if (parentStream) {
|
||||||
return new BufferedWriteStream(parentStream, bufSize, disposeParentStream);
|
switch (disposeParentStream) {
|
||||||
|
case DisposeAfterUse::YES:
|
||||||
|
return new BufferedWriteStream<DisposeAfterUse::YES>(parentStream, bufSize);
|
||||||
|
case DisposeAfterUse::NO:
|
||||||
|
return new BufferedWriteStream<DisposeAfterUse::NO>(parentStream, bufSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue