mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-10 04:43:26 +00:00
![Johannes Schickel](/assets/img/avatar_default.png)
Instead I moved the call to ReadStream::eos into SubReadStream::eos. fuzzie pointed out that in certain cases this resulted in a lot of eos calls before. Those were rather needlessly, since checking the eos bit of the decorated stream in read does not give any advantage over checking it when the client code really wants to test the eos flag.
108 lines
3.5 KiB
C++
108 lines
3.5 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* $URL$
|
|
* $Id$
|
|
*
|
|
*/
|
|
|
|
#ifndef COMMON_SUBSTREAM_H
|
|
#define COMMON_SUBSTREAM_H
|
|
|
|
#include "common/stream.h"
|
|
|
|
namespace Common {
|
|
|
|
/**
|
|
* SubReadStream provides access to a ReadStream restricted to the range
|
|
* [currentPosition, currentPosition+end).
|
|
*
|
|
* Manipulating the parent stream directly /will/ mess up a substream.
|
|
* Likewise, manipulating two substreams of a parent stream will cause them to
|
|
* step on each others toes.
|
|
*/
|
|
class SubReadStream : virtual public ReadStream {
|
|
protected:
|
|
ReadStream *_parentStream;
|
|
DisposeAfterUse::Flag _disposeParentStream;
|
|
uint32 _pos;
|
|
uint32 _end;
|
|
bool _eos;
|
|
public:
|
|
SubReadStream(ReadStream *parentStream, uint32 end, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO)
|
|
: _parentStream(parentStream),
|
|
_disposeParentStream(disposeParentStream),
|
|
_pos(0),
|
|
_end(end),
|
|
_eos(false) {
|
|
assert(parentStream);
|
|
}
|
|
~SubReadStream() {
|
|
if (_disposeParentStream)
|
|
delete _parentStream;
|
|
}
|
|
|
|
virtual bool eos() const { return _eos | _parentStream->eos(); }
|
|
virtual bool err() const { return _parentStream->err(); }
|
|
virtual void clearErr() { _eos = false; _parentStream->clearErr(); }
|
|
virtual uint32 read(void *dataPtr, uint32 dataSize);
|
|
};
|
|
|
|
/*
|
|
* SeekableSubReadStream provides access to a SeekableReadStream restricted to
|
|
* the range [begin, end).
|
|
* The same caveats apply to SeekableSubReadStream as do to SeekableReadStream.
|
|
*
|
|
* Manipulating the parent stream directly /will/ mess up a substream.
|
|
* @see SubReadStream
|
|
*/
|
|
class SeekableSubReadStream : public SubReadStream, public SeekableReadStream {
|
|
protected:
|
|
SeekableReadStream *_parentStream;
|
|
uint32 _begin;
|
|
public:
|
|
SeekableSubReadStream(SeekableReadStream *parentStream, uint32 begin, uint32 end, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO);
|
|
|
|
virtual int32 pos() const { return _pos - _begin; }
|
|
virtual int32 size() const { return _end - _begin; }
|
|
|
|
virtual bool seek(int32 offset, int whence = SEEK_SET);
|
|
};
|
|
|
|
/**
|
|
* This is a SeekableSubReadStream subclass which adds non-endian
|
|
* read methods whose endianness is set on the stream creation.
|
|
*
|
|
* Manipulating the parent stream directly /will/ mess up a substream.
|
|
* @see SubReadStream
|
|
*/
|
|
class SeekableSubReadStreamEndian : public SeekableSubReadStream, public ReadStreamEndian {
|
|
public:
|
|
SeekableSubReadStreamEndian(SeekableReadStream *parentStream, uint32 begin, uint32 end, bool bigEndian, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO)
|
|
: SeekableSubReadStream(parentStream, begin, end, disposeParentStream),
|
|
ReadStreamEndian(bigEndian) {
|
|
}
|
|
};
|
|
|
|
|
|
} // End of namespace Common
|
|
|
|
#endif
|