22#ifndef COMMON_STREAM_H
23#define COMMON_STREAM_H
25#include "common/endian.h"
26#include "common/ptr.h"
27#include "common/scummsys.h"
28#include "common/str.h"
29#include "common/data-io.h"
43class SeekableReadStream;
61 virtual bool err()
const {
return false; }
91 virtual uint32
write(
const void *dataPtr, uint32 dataSize) = 0;
103 virtual bool flush() {
return true; }
127 virtual int64
pos()
const = 0;
153 value = TO_LE_16(value);
160 value = TO_LE_32(value);
167 value = TO_LE_64(value);
174 value = TO_BE_16(value);
181 value = TO_BE_32(value);
188 value = TO_BE_64(value);
236 memcpy(&n, &value, 4);
249 memcpy(&n, &value, 4);
261 memcpy(&n, &value, 8);
274 memcpy(&n, &value, 8);
283 template<
class TDataFormat,
class... T>
285 const TDataFormat dataFormatCopy = dataFormat;
292 if (this->
write(buffer, actualSize) != actualSize)
304 return this->
writeMultiple<EndianStorageFormat, T...>(isLittle ? EndianStorageFormat::Little : EndianStorageFormat::Big, values...);
313 return this->
writeMultiple<EndianStorageFormat, T...>(EndianStorageFormat::Little, values...);
322 return this->
writeMultiple<EndianStorageFormat, T...>(EndianStorageFormat::Big, values...);
370 virtual bool seek(int64 offset,
int whence = SEEK_SET) = 0;
379 virtual int64
size()
const = 0;
400 virtual bool eos()
const = 0;
417 virtual uint32
read(
void *dataPtr, uint32 dataSize) = 0;
462 return FROM_LE_16(val);
476 return FROM_LE_32(val);
490 return FROM_LE_64(val);
504 return FROM_BE_16(val);
518 return FROM_BE_32(val);
532 return FROM_BE_64(val);
618 return READ_LE_FLOAT32(val);
632 return READ_BE_FLOAT32(val);
647 return READ_LE_FLOAT64(val);
661 return READ_BE_FLOAT64(val);
668 template<
class TDataFormat,
class... T>
670 const TDataFormat dataFormatCopy = dataFormat;
675 if (
read(buffer, actualSize) != actualSize)
688 return this->
readMultiple<EndianStorageFormat, T...>(isLittle ? EndianStorageFormat::Little : EndianStorageFormat::Big, values...);
697 return this->
readMultiple<EndianStorageFormat, T...>(EndianStorageFormat::Little, values...);
706 return this->
readMultiple<EndianStorageFormat, T...>(EndianStorageFormat::Big, values...);
753 virtual int64
pos()
const = 0;
761 virtual int64
size()
const = 0;
780 virtual bool seek(int64 offset,
int whence = SEEK_SET) = 0;
793 virtual bool skip(uint32 offset) {
return seek(offset, SEEK_CUR); }
821 virtual char *
readLine(
char *s,
size_t bufSize,
bool handleCR =
true);
847 void hexdump(
int len,
int bytesPerLine = 16,
int startOffset = 0);
856 const bool _bigEndian;
869 bool isBE()
const {
return _bigEndian; }
877 return (_bigEndian) ? FROM_BE_16(val) : FROM_LE_16(val);
886 return (_bigEndian) ? FROM_BE_32(val) : FROM_LE_32(val);
895 return (_bigEndian) ? FROM_BE_64(val) : FROM_LE_64(val);
926 return (_bigEndian) ? READ_BE_FLOAT32(val) : READ_LE_FLOAT32(val);
936 return (_bigEndian) ? READ_BE_FLOAT64(val) : READ_LE_FLOAT64(val);
969 _parentStream(parentStream, disposeParentStream) {
970 assert(parentStream);
974 bool err()
const override {
return _parentStream->err(); }
975 void clearErr()
override { _parentStream->clearErr(); }
978 bool eos()
const override {
return _parentStream->eos(); }
979 uint32
read(
void *dataPtr, uint32 dataSize)
override {
return _parentStream->read(dataPtr, dataSize); }
982 int64
pos()
const override {
return _parentStream->pos(); }
983 int64
size()
const override {
return _parentStream->size(); }
984 bool seek(int64 offset,
int whence = SEEK_SET)
override {
return _parentStream->seek(offset, whence); }
FORCEINLINE int64 readSint64()
Definition: stream.h:915
FORCEINLINE double readDouble()
Definition: stream.h:933
bool isBE() const
Definition: stream.h:869
FORCEINLINE int16 readSint16()
Definition: stream.h:901
ReadStreamEndian(bool bigEndian)
Definition: stream.h:865
FORCEINLINE int32 readSint32()
Definition: stream.h:908
uint16 readUint16()
Definition: stream.h:874
uint64 readUint64()
Definition: stream.h:892
uint32 readUint32()
Definition: stream.h:883
FORCEINLINE float readFloat()
Definition: stream.h:923
uint16 readUint16LE()
Definition: stream.h:459
Common::String readPascalString(bool transformCR=true)
FORCEINLINE float readFloatLE()
Definition: stream.h:615
FORCEINLINE int64 readSint64LE()
Definition: stream.h:567
String readString(char terminator=0, size_t len=String::npos)
uint64 readUint64BE()
Definition: stream.h:529
FORCEINLINE int16 readSint16LE()
Definition: stream.h:543
uint32 readUint32BE()
Definition: stream.h:515
bool readMultiple(const TDataFormat &dataFormat, T &...values)
Definition: stream.h:669
uint16 readUint16BE()
Definition: stream.h:501
virtual bool eos() const =0
SeekableReadStream * readStream(uint32 dataSize)
FORCEINLINE float readFloatBE()
Definition: stream.h:629
FORCEINLINE int8 readSByte()
Definition: stream.h:447
virtual uint32 read(void *dataPtr, uint32 dataSize)=0
FORCEINLINE int64 readSint64BE()
Definition: stream.h:603
bool readMultipleBE(T &...values)
Definition: stream.h:705
FORCEINLINE int32 readSint32BE()
Definition: stream.h:591
bool readMultipleLE(T &...values)
Definition: stream.h:696
uint64 readUint64LE()
Definition: stream.h:487
FORCEINLINE int16 readSint16BE()
Definition: stream.h:579
uint32 readUint32LE()
Definition: stream.h:473
FORCEINLINE int32 readSint32LE()
Definition: stream.h:555
bool readMultipleEndian(bool isLittle, T &...values)
Definition: stream.h:687
byte readByte()
Definition: stream.h:434
FORCEINLINE double readDoubleBE()
Definition: stream.h:658
FORCEINLINE double readDoubleLE()
Definition: stream.h:644
SeekableReadStreamEndian(bool bigEndian)
Definition: stream.h:952
bool eos() const override
Definition: stream.h:978
int64 size() const override
Definition: stream.h:983
int64 pos() const override
Definition: stream.h:982
void clearErr() override
Definition: stream.h:975
uint32 read(void *dataPtr, uint32 dataSize) override
Definition: stream.h:979
bool err() const override
Definition: stream.h:974
bool seek(int64 offset, int whence=SEEK_SET) override
Definition: stream.h:984
virtual char * readLine(char *s, size_t bufSize, bool handleCR=true)
virtual int64 pos() const =0
void hexdump(int len, int bytesPerLine=16, int startOffset=0)
virtual int64 size() const =0
virtual String readLine(bool handleCR=true)
virtual bool skip(uint32 offset)
Definition: stream.h:793
virtual bool seek(int64 offset, int whence=SEEK_SET)=0
virtual bool seek(int64 offset, int whence=SEEK_SET)=0
virtual int64 size() const =0
virtual void clearErr()
Definition: stream.h:71
virtual bool err() const
Definition: stream.h:61
FORCEINLINE void writeSint64BE(int64 value)
Definition: stream.h:224
bool writeMultipleLE(const T &...values)
Definition: stream.h:312
FORCEINLINE void writeFloatBE(float value)
Definition: stream.h:246
bool writeMultiple(const TDataFormat &dataFormat, const T &...values)
Definition: stream.h:284
virtual bool flush()
Definition: stream.h:103
void writeUint32LE(uint32 value)
Definition: stream.h:159
virtual int64 pos() const =0
uint32 writeStream(ReadStream *stream, uint32 dataSize)
void writeUint16BE(uint16 value)
Definition: stream.h:173
void writeUint64BE(uint64 value)
Definition: stream.h:187
FORCEINLINE void writeSint64LE(int64 value)
Definition: stream.h:206
bool writeMultipleEndian(bool isLittle, const T &...values)
Definition: stream.h:303
void writeUint16LE(uint16 value)
Definition: stream.h:152
FORCEINLINE void writeSint16BE(int16 value)
Definition: stream.h:212
void writeUint64LE(uint64 value)
Definition: stream.h:166
uint32 writeStream(ReadStream *stream)
bool writeMultipleBE(const T &...values)
Definition: stream.h:321
void writeString(const String &str)
FORCEINLINE void writeSint32BE(int32 value)
Definition: stream.h:218
void writeByte(byte value)
Definition: stream.h:140
FORCEINLINE void writeSint16LE(int16 value)
Definition: stream.h:194
void writeSByte(int8 value)
Definition: stream.h:146
FORCEINLINE void writeFloatLE(float value)
Definition: stream.h:233
virtual uint32 write(const void *dataPtr, uint32 dataSize)=0
FORCEINLINE void writeDoubleBE(double value)
Definition: stream.h:271
FORCEINLINE void writeSint32LE(int32 value)
Definition: stream.h:200
FORCEINLINE void writeDoubleLE(double value)
Definition: stream.h:258
virtual void finalize()
Definition: stream.h:118
void writeUint32BE(uint32 value)
Definition: stream.h:180
Definition: algorithm.h:29
Definition: data-io.h:224