COMMON: Add ReadStreamEndian mixin class

svn-id: r54438
This commit is contained in:
Max Horn 2010-11-23 22:26:27 +00:00
parent c9fdaa7417
commit 382982d6e3
3 changed files with 41 additions and 52 deletions

View File

@ -76,35 +76,13 @@ public:
/**
* This is a wrapper around MemoryReadStream, but it adds non-endian
* This is a MemoryReadStream subclass which adds non-endian
* read methods whose endianness is set on the stream creation.
*/
class MemoryReadStreamEndian : public MemoryReadStream {
private:
const bool _bigEndian;
class MemoryReadStreamEndian : public MemoryReadStream, public ReadStreamEndian {
public:
MemoryReadStreamEndian(const byte *buf, uint32 len, bool bigEndian = false) : MemoryReadStream(buf, len), _bigEndian(bigEndian) {}
uint16 readUint16() {
uint16 val;
read(&val, 2);
return (_bigEndian) ? TO_BE_16(val) : TO_LE_16(val);
}
uint32 readUint32() {
uint32 val;
read(&val, 4);
return (_bigEndian) ? TO_BE_32(val) : TO_LE_32(val);
}
FORCEINLINE int16 readSint16() {
return (int16)readUint16();
}
FORCEINLINE int32 readSint32() {
return (int32)readUint32();
}
MemoryReadStreamEndian(const byte *buf, uint32 len, bool bigEndian = false)
: MemoryReadStream(buf, len), ReadStreamEndian(bigEndian) {}
};
/**

View File

@ -389,6 +389,39 @@ public:
virtual String readLine();
};
/**
* This is a ReadStream mixin subclass which adds non-endian read
* methods whose endianness is set du the stream creation.
*/
class ReadStreamEndian : virtual public ReadStream {
private:
const bool _bigEndian;
public:
ReadStreamEndian(bool bigEndian = false) : _bigEndian(bigEndian) {}
uint16 readUint16() {
uint16 val;
read(&val, 2);
return (_bigEndian) ? TO_BE_16(val) : TO_LE_16(val);
}
uint32 readUint32() {
uint32 val;
read(&val, 4);
return (_bigEndian) ? TO_BE_32(val) : TO_LE_32(val);
}
FORCEINLINE int16 readSint16() {
return (int16)readUint16();
}
FORCEINLINE int32 readSint32() {
return (int32)readUint32();
}
};
} // End of namespace Common
#endif

View File

@ -87,39 +87,17 @@ public:
};
/**
* This is a wrapper around SeekableSubReadStream, but it adds non-endian
* 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 {
private:
const bool _bigEndian;
class SeekableSubReadStreamEndian : public SeekableSubReadStream, public ReadStreamEndian {
public:
SeekableSubReadStreamEndian(SeekableReadStream *parentStream, uint32 begin, uint32 end, bool bigEndian = false, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO)
: SeekableSubReadStream(parentStream, begin, end, disposeParentStream), _bigEndian(bigEndian) {
}
uint16 readUint16() {
uint16 val;
read(&val, 2);
return (_bigEndian) ? TO_BE_16(val) : TO_LE_16(val);
}
uint32 readUint32() {
uint32 val;
read(&val, 4);
return (_bigEndian) ? TO_BE_32(val) : TO_LE_32(val);
}
FORCEINLINE int16 readSint16() {
return (int16)readUint16();
}
FORCEINLINE int32 readSint32() {
return (int32)readUint32();
: SeekableSubReadStream(parentStream, begin, end, disposeParentStream),
ReadStreamEndian(bigEndian) {
}
};