22#ifndef COMMON_DATA_IO_H
23#define COMMON_DATA_IO_H
25#include "common/scummsys.h"
29enum class EndianStorageFormat {
36template<
class TDataFormat>
42 static inline bool isLittleEndian(EndianStorageFormat storageFormat) {
43 return storageFormat == EndianStorageFormat::Little;
47template<
class TDataFormat,
class T>
49 static const uint kMaxSize =
sizeof(T);
51 static uint computeSize(TDataFormat dataFormat);
53 static void encode(TDataFormat dataFormat,
byte *data,
const T &value);
54 static void decode(TDataFormat dataFormat,
const byte *data, T &value);
57template<
class TDataFormat,
class T>
62template<
class TDataFormat,
class T>
63void SimpleDataIO<TDataFormat, T>::encode(TDataFormat dataFormat,
byte *data,
const T &value) {
64 const byte *valueBytes =
reinterpret_cast<const byte *
>(&value);
65 byte *dataBytes =
reinterpret_cast<byte *
>(data);
67 const bool isTargetLE = DataFormatTraits<TDataFormat>::isLittleEndian(dataFormat);
68#ifdef SCUMM_LITTLE_ENDIAN
69 const bool isSystemLE =
true;
71#ifdef SCUMM_BIG_ENDIAN
72 const bool isSystemLE =
false;
75 const bool requiresSwap = (isSystemLE != isTargetLE);
80 for (uint i = 0; i <
sizeof(T); i++)
81 temp[i] = valueBytes[
sizeof(T) - 1 - i];
83 for (uint i = 0; i <
sizeof(T); i++)
84 temp[i] = valueBytes[i];
87 for (uint i = 0; i <
sizeof(T); i++)
88 dataBytes[i] = temp[i];
91template<
class TDataFormat,
class T>
92void SimpleDataIO<TDataFormat, T>::decode(TDataFormat dataFormat,
const byte *data, T &value) {
93 byte *valueBytes =
reinterpret_cast<byte *
>(&value);
94 const byte *dataBytes =
reinterpret_cast<const byte *
>(data);
96 const bool isTargetLE = DataFormatTraits<TDataFormat>::isLittleEndian(dataFormat);
97#ifdef SCUMM_LITTLE_ENDIAN
98 const bool isSystemLE =
true;
100#ifdef SCUMM_BIG_ENDIAN
101 const bool isSystemLE =
false;
104 const bool requiresSwap = (isSystemLE != isTargetLE);
106 byte temp[
sizeof(T)];
109 for (uint i = 0; i <
sizeof(T); i++)
110 temp[i] = dataBytes[
sizeof(T) - 1 - i];
112 for (uint i = 0; i <
sizeof(T); i++)
113 temp[i] = dataBytes[i];
116 for (uint i = 0; i <
sizeof(T); i++)
117 valueBytes[i] = temp[i];
120template<
class TDataFormat,
class T>
124template<
class TDataFormat>
128template<
class TDataFormat>
131template<
class TDataFormat>
134template<
class TDataFormat>
138template<
class TDataFormat>
142template<
class TDataFormat>
146template<
class TDataFormat>
150template<
class TDataFormat>
154template<
class TDataFormat>
158template<
class TDataFormat>
162template<
class TDataFormat>
166template<
class TDataFormat,
class T,
class... TMore>
169template<
class TDataFormat,
class T>
173 static uint computeSize(TDataFormat dataFormat);
175 static void encode(TDataFormat dataFormat,
byte *data,
const T &value);
176 static void decode(TDataFormat dataFormat,
const byte *data, T &value);
179template<
class TDataFormat,
class T>
184template<
class TDataFormat,
class T>
185void DataMultipleIO<TDataFormat, T>::encode(TDataFormat dataFormat,
byte *data,
const T &value) {
186 return DataIO<TDataFormat, T>::encode(dataFormat, data, value);
189template<
class TDataFormat,
class T>
190void DataMultipleIO<TDataFormat, T>::decode(TDataFormat dataFormat,
const byte *data, T &value) {
191 return DataIO<TDataFormat, T>::decode(dataFormat, data, value);
194template<
class TDataFormat,
class T, u
int TSize>
198 static uint computeSize(TDataFormat dataFormat);
200 static void encode(TDataFormat dataFormat,
byte *data,
const T (&value)[TSize]);
201 static void decode(TDataFormat dataFormat,
const byte *data, T (&value)[TSize]);
204template<
class TDataFormat,
class T, u
int TSize>
209template<
class TDataFormat,
class T, u
int TSize>
210void DataMultipleIO<TDataFormat, T[TSize]>::encode(TDataFormat dataFormat,
byte *data,
const T (&value)[TSize]) {
211 const uint elementSize = DataIO<TDataFormat, T>::computeSize(dataFormat);
212 for (uint i = 0; i < TSize; i++)
213 DataMultipleIO<TDataFormat, T>::encode(dataFormat, data + elementSize * i, value[i]);
216template<
class TDataFormat,
class T, u
int TSize>
217void DataMultipleIO<TDataFormat, T[TSize]>::decode(TDataFormat dataFormat,
const byte *data, T (&value)[TSize]) {
218 const uint elementSize = DataIO<TDataFormat, T>::computeSize(dataFormat);
219 for (uint i = 0; i < TSize; i++)
220 DataMultipleIO<TDataFormat, T>::decode(dataFormat, data + elementSize * i, value[i]);
223template<
class TDataFormat,
class T,
class... TMore>
227 static uint computeSize(TDataFormat dataFormat);
229 static void encode(TDataFormat dataFormat,
byte *data,
const T &firstValue,
const TMore &...moreValues);
230 static void decode(TDataFormat dataFormat,
const byte *data, T &firstValue, TMore &...moreValues);
233template<
class TDataFormat,
class T,
class... TMore>
238template<
class TDataFormat,
class T,
class... TMore>
239void DataMultipleIO<TDataFormat, T, TMore...>::encode(TDataFormat dataFormat,
byte *data,
const T &firstValue,
const TMore &...moreValues) {
240 DataMultipleIO<TDataFormat, T>::encode(dataFormat, data, firstValue);
241 DataMultipleIO<TDataFormat, TMore...>::encode(dataFormat, data + DataMultipleIO<TDataFormat, T>::computeSize(dataFormat), moreValues...);
244template<
class TDataFormat,
class T,
class... TMore>
245void DataMultipleIO<TDataFormat, T, TMore...>::decode(TDataFormat dataFormat,
const byte *data, T &firstValue, TMore &...moreValues) {
246 DataMultipleIO<TDataFormat, T>::decode(dataFormat, data, firstValue);
247 DataMultipleIO<TDataFormat, TMore...>::decode(dataFormat, data + DataMultipleIO<TDataFormat, T>::computeSize(dataFormat), moreValues...);
Definition: algorithm.h:29
Definition: data-io.h:121
Definition: data-io.h:224