22 #ifndef COMMON_SERIALIZER_H 23 #define COMMON_SERIALIZER_H 25 #include "common/stream.h" 26 #include "common/str.h" 27 #include "common/data-io.h" 40 #define VER(x) Common::Serializer::Version(x) 42 #define SYNC_AS(SUFFIX,TYPE,SIZE) \ 43 template<typename T> \ 44 void syncAs ## SUFFIX(T &val, Version minVersion = 0, Version maxVersion = kLastVersion) { \ 45 if (_version < minVersion || _version > maxVersion) \ 48 val = static_cast<T>(_loadStream->read ## SUFFIX()); \ 51 _saveStream->write ## SUFFIX(tmp); \ 53 _bytesSynced += SIZE; \ 56 #define SYNC_PRIMITIVE(suffix) \ 57 template <typename T> \ 58 static inline void suffix(Serializer &s, T &value) { \ 59 s.syncAs##suffix(value); \ 82 typedef uint32 Version;
83 static const Version kLastVersion = 0xFFFFFFFF;
85 SYNC_PRIMITIVE(Uint32LE)
86 SYNC_PRIMITIVE(Uint32BE)
87 SYNC_PRIMITIVE(Sint32LE)
88 SYNC_PRIMITIVE(Sint32BE)
89 SYNC_PRIMITIVE(FloatLE)
90 SYNC_PRIMITIVE(FloatBE)
91 SYNC_PRIMITIVE(DoubleLE)
92 SYNC_PRIMITIVE(DoubleBE)
93 SYNC_PRIMITIVE(Uint16LE)
94 SYNC_PRIMITIVE(Uint16BE)
95 SYNC_PRIMITIVE(Sint16LE)
96 SYNC_PRIMITIVE(Sint16BE)
110 : _loadStream(in), _saveStream(out), _bytesSynced(0), _version(0) {
115 inline bool isSaving() {
return (_saveStream != 0); }
116 inline bool isLoading() {
return (_loadStream != 0); }
118 SYNC_AS(Byte, byte, 1)
119 SYNC_AS(SByte, int8, 1)
121 SYNC_AS(Uint16LE, uint16, 2)
122 SYNC_AS(Uint16BE, uint16, 2)
123 SYNC_AS(Sint16LE, int16, 2)
124 SYNC_AS(Sint16BE, int16, 2)
126 SYNC_AS(Uint32LE, uint32, 4)
127 SYNC_AS(Uint32BE, uint32, 4)
128 SYNC_AS(Sint32LE, int32, 4)
129 SYNC_AS(Sint32BE, int32, 4)
130 SYNC_AS(FloatLE,
float, 4)
131 SYNC_AS(FloatBE,
float, 4)
133 SYNC_AS(DoubleLE,
double, 8)
134 SYNC_AS(DoubleBE,
double, 8)
143 return _saveStream->
err();
145 return _loadStream->
err();
164 _version = currentVersion;
165 syncAsUint32LE(_version);
166 return _version <= currentVersion;
189 void skip(uint32 size, Version minVersion = 0, Version maxVersion = kLastVersion) {
190 if (_version < minVersion || _version > maxVersion)
193 _bytesSynced += size;
195 _loadStream->
skip(size);
205 void syncBytes(byte *buf, uint32 size, Version minVersion = 0, Version maxVersion = kLastVersion) {
206 if (_version < minVersion || _version > maxVersion)
210 _loadStream->
read(buf, size);
212 _saveStream->
write(buf, size);
213 _bytesSynced += size;
228 bool matchBytes(
const char *magic, byte size, Version minVersion = 0, Version maxVersion = kLastVersion) {
229 if (_version < minVersion || _version > maxVersion)
234 _saveStream->
write(magic, size);
238 _loadStream->
read(buf, size);
239 match = (0 == memcmp(buf, magic, size));
241 _bytesSynced += size;
250 if (_version < minVersion || _version > maxVersion)
256 while ((c = _loadStream->
readByte())) {
264 _bytesSynced += str.size() + 1;
272 if (_version < minVersion || _version > maxVersion)
275 uint32 len = str.size();
280 U32String::value_type *sl =
new U32String::value_type[len];
281 for (uint i = 0; i < len; i++)
282 syncAsUint32LE(sl[i]);
286 for (uint i = 0; i < len; i++)
288 _bytesSynced += 4 * len;
292 template <
typename T>
293 void syncArray(T *arr,
size_t entries,
void (*serializer)(
Serializer &, T &), Version minVersion = 0, Version maxVersion = kLastVersion) {
294 if (_version < minVersion || _version > maxVersion)
297 for (
size_t i = 0; i < entries; ++i) {
298 serializer(*
this, arr[i]);
305 template<
class TDataFormat,
class... T>
307 const TDataFormat dataFormatCopy = dataFormat;
326 this->
syncMultiple<EndianStorageFormat, T...>(isLittle ? EndianStorageFormat::Little : EndianStorageFormat::Big, values...);
334 this->
syncMultiple<EndianStorageFormat, T...>(EndianStorageFormat::Little, values...);
342 this->
syncMultiple<EndianStorageFormat, T...>(EndianStorageFormat::Big, values...);
346 #undef SYNC_PRIMITIVE 357 virtual void saveLoadWithSerializer(
Serializer &ser) = 0;
void syncBytes(byte *buf, uint32 size, Version minVersion=0, Version maxVersion=kLastVersion)
Definition: serializer.h:205
virtual bool err() const
Definition: stream.h:61
Definition: data-io.h:167
void writeUint32LE(uint32 value)
Definition: stream.h:159
virtual void clearErr()
Definition: stream.h:71
uint bytesSynced() const
Definition: serializer.h:183
void clearErr()
Definition: serializer.h:151
bool syncVersion(Version currentVersion)
Definition: serializer.h:163
void syncMultipleLE(T &...values)
Definition: serializer.h:333
Definition: serializer.h:80
byte readByte()
Definition: stream.h:434
void syncMultipleBE(T &...values)
Definition: serializer.h:341
void setVersion(Version version)
Definition: serializer.h:178
void syncMultiple(const TDataFormat &dataFormat, T &...values)
Definition: serializer.h:306
void syncString(String &str, Version minVersion=0, Version maxVersion=kLastVersion)
Definition: serializer.h:249
Definition: algorithm.h:29
bool err() const
Definition: serializer.h:141
Definition: serializer.h:352
void syncString32(U32String &str, Version minVersion=0, Version maxVersion=kLastVersion)
Definition: serializer.h:271
Version getVersion() const
Definition: serializer.h:173
void syncMultipleEndian(bool isLittle, T &...values)
Definition: serializer.h:325
bool matchBytes(const char *magic, byte size, Version minVersion=0, Version maxVersion=kLastVersion)
Definition: serializer.h:228
void skip(uint32 size, Version minVersion=0, Version maxVersion=kLastVersion)
Definition: serializer.h:189
virtual uint32 write(const void *dataPtr, uint32 dataSize)=0
void writeString(const String &str)
virtual uint32 read(void *dataPtr, uint32 dataSize)=0
virtual bool skip(uint32 offset)
Definition: stream.h:793
void writeByte(byte value)
Definition: stream.h:140