15#if (__GNUC__ && (__BYTE_ORDER_ == __ORDER_BIG_ENDIAN__)) || (__clang__ && __BIG_ENDIAN__)
16#error Serializer.h is incompatible with big-endian architectures!
25 static_assert((
sizeof(Uint32) == 4 &&
alignof(Uint32) <= 4),
"Int32 is sized differently on this platform and will not serialize properly.");
26 static_assert((
sizeof(Uint64) == 8 &&
alignof(Uint64) <= 8),
"Int64 is sized differently on this platform and will not serialize properly.");
27 static_assert((
sizeof(
Color) == 4 &&
alignof(
Color) <= 1),
"Color is padded differently on this platform and will not serialize properly.");
28 static_assert((
sizeof(
vector2f) == 8 &&
alignof(
vector2f) <= 4),
"Vector2f is padded differently on this platform and will not serialize properly.");
29 static_assert((
sizeof(
vector2d) == 16 &&
alignof(
vector2d) <= 8),
"Vector2d is padded differently on this platform and will not serialize properly.");
30 static_assert((
sizeof(
vector3f) == 12 &&
alignof(
vector3f) <= 4),
"Vector3f is padded differently on this platform and will not serialize properly.");
31 static_assert((
sizeof(
vector3d) == 24 &&
alignof(
vector3d) <= 8),
"Vector3d is padded differently on this platform and will not serialize properly.");
32 static_assert((
sizeof(
Quaternionf) == 16 &&
alignof(
Quaternionf) <= 4),
"Quaternionf is padded differently on this platform and will not serialize properly.");
33 static_assert((
sizeof(
Aabb) == 56 &&
alignof(
Aabb) <= 8),
"Aabb is padded differently on this platform and will not serialize properly.");
38 const std::string &
GetData() {
return m_str; }
43 m_str.append(
reinterpret_cast<const char *
>(&obj),
sizeof(T));
48 writeObject<Uint32>(obj.size());
49 m_str.append(obj.c_str(), obj.size());
59 Uint32 len = strlen(s);
82 assert(range.
Size() < SDL_MAX_UINT32);
88 void Byte(Uint8 x) { *
this << x; }
89 void Bool(
bool x) { *
this << x; }
90 void Int16(Uint16 x) { *
this << x; }
91 void Int32(Uint32 x) { *
this << x; }
92 void Int64(Uint64 x) { *
this << x; }
93 void Float(
float f) { *
this << f; }
94 void Double(
double f) { *
this << f; }
95 void String(
const char *s) { *
this << s; }
96 void String(
const std::string &s) { *
this << s; }
104 void WrSection(
const std::string §ion_label,
const std::string §ion_data) { *
this << section_label << section_data; }
111 template <
typename T>
122 m_streamVersion(-1) {}
133 return m_data.
end >= m_at + needed_size;
138 assert(pos >= 0 && std::size_t(pos) < m_data.
Size());
139 m_at = m_data.
begin + pos;
142 std::size_t
Pos() {
return std::size_t(m_at - m_data.
begin); }
144 template <
typename T>
148 if (!
Check(
sizeof(T)))
149 throw std::out_of_range(
"Serializer::Reader encountered truncated stream.");
152 out = *
reinterpret_cast<const T *
>(m_at);
159 out = std::string(range.
begin, range.
Size());
160 if (!out.empty() && *(out.end() - 1) ==
'\0')
173 template <
typename T>
184 if (len > (m_data.
end - m_at))
185 throw std::out_of_range(
"Serializer::Reader encountered truncated stream.");
187 auto range =
ByteRange(m_at, m_at + len);
193 bool Bool() {
return obj<bool>(); }
194 Uint8
Byte() {
return obj<Uint8>(); }
195 Uint16
Int16() {
return obj<Uint16>(); }
196 Uint32
Int32() {
return obj<Uint32>(); }
197 Uint64
Int64() {
return obj<Uint64>(); }
198 float Float() {
return obj<float>(); }
199 double Double() {
return obj<double>(); }
201 std::string
String() {
return obj<std::string>(); }
Color4ub Color
Definition Color.h:212
Quaternion< float > Quaternionf
Definition Quaternion.h:277
T y
Definition Quaternion.h:17
T x
Definition Quaternion.h:17
T w
Definition Quaternion.h:17
T z
Definition Quaternion.h:17
Definition Serializer.h:110
bool AtEnd()
Definition Serializer.h:129
void readObject(std::string &out)
Definition Serializer.h:156
void readObject(vector2f &vec)
Definition Serializer.h:164
Reader RdSection(const std::string §ion_label_expected)
Definition Serializer.cpp:9
Uint64 Int64()
Definition Serializer.h:197
Reader & operator>>(T &out)
Definition Serializer.h:174
std::size_t Pos()
Definition Serializer.h:142
Uint8 Byte()
Definition Serializer.h:194
Quaternionf RdQuaternionf()
Definition Serializer.h:209
std::string String()
Definition Serializer.h:201
void readObject(Quaternionf &quat)
Definition Serializer.h:169
void Seek(int pos)
Definition Serializer.h:136
void readObject(vector3f &vec)
Definition Serializer.h:166
Reader(const ByteRange &data)
Definition Serializer.h:124
void readObject(Aabb &aabb)
Definition Serializer.h:171
void readObject(Color &col)
Definition Serializer.h:168
void readObject(vector2d &vec)
Definition Serializer.h:165
void readObject(vector3d &vec)
Definition Serializer.h:167
vector3f Vector3f()
Definition Serializer.h:206
bool Bool()
Definition Serializer.h:193
Reader()
Definition Serializer.h:120
vector2d Vector2d()
Definition Serializer.h:205
Uint32 Int32()
Definition Serializer.h:196
vector2f Vector2f()
Definition Serializer.h:204
vector3d Vector3d()
Definition Serializer.h:207
bool Check(std::size_t needed_size)
Definition Serializer.h:131
void SetStreamVersion(int x)
Definition Serializer.h:214
float Float()
Definition Serializer.h:198
ByteRange Blob()
Definition Serializer.h:180
void readObject(Quaterniond &quat)
Definition Serializer.h:170
Color Color4UB()
Definition Serializer.h:203
int StreamVersion() const
Definition Serializer.h:213
void readObject(T &out)
Definition Serializer.h:145
Uint16 Int16()
Definition Serializer.h:195
double Double()
Definition Serializer.h:199
Definition Serializer.h:35
void writeObject(const Color &col)
Definition Serializer.h:68
const std::string & GetData()
Definition Serializer.h:38
void writeObject(const vector3f &vec)
Definition Serializer.h:66
void Double(double f)
Definition Serializer.h:94
void writeObject(const vector2d &vec)
Definition Serializer.h:65
void Byte(Uint8 x)
Definition Serializer.h:88
void Bool(bool x)
Definition Serializer.h:89
void WrSection(const std::string §ion_label, const std::string §ion_data)
Definition Serializer.h:104
void Color4UB(const Color &c)
Definition Serializer.h:103
void Vector3d(vector3d vec)
Definition Serializer.h:101
void Blob(ByteRange range)
Definition Serializer.h:80
Writer()
Definition Serializer.h:37
void Vector2d(vector2d vec)
Definition Serializer.h:99
void Vector2f(vector2f vec)
Definition Serializer.h:98
void String(const char *s)
Definition Serializer.h:95
void Int16(Uint16 x)
Definition Serializer.h:90
void writeObject(const vector3d &vec)
Definition Serializer.h:67
void Int32(Uint32 x)
Definition Serializer.h:91
void writeObject(const vector2f &vec)
Definition Serializer.h:64
void Int64(Uint64 x)
Definition Serializer.h:92
void writeObject(const T &obj)
Definition Serializer.h:41
void Vector3f(vector3f vec)
Definition Serializer.h:100
void writeObject(const char *s)
Definition Serializer.h:52
void writeObject(const std::string &obj)
Definition Serializer.h:46
void Float(float f)
Definition Serializer.h:93
void writeObject(const Aabb &aabb)
Definition Serializer.h:71
void String(const std::string &s)
Definition Serializer.h:96
Writer & operator<<(const T &obj)
Definition Serializer.h:74
void WrQuaternionf(const Quaternionf &q)
Definition Serializer.h:102
void writeObject(const Quaterniond &quat)
Definition Serializer.h:70
void writeObject(const Quaternionf &quat)
Definition Serializer.h:69
T y
Definition vector2.h:26
T x
Definition vector2.h:26
T y
Definition vector3.h:18
T x
Definition vector3.h:18
T z
Definition vector3.h:18
vector3d max
Definition Aabb.h:10
vector3d min
Definition Aabb.h:10
double radius
Definition Aabb.h:11
Definition ByteRange.h:12
size_t Size() const
Definition ByteRange.h:34
const char * end
Definition ByteRange.h:31
const char * begin
Definition ByteRange.h:30
Uint8 a
Definition Color.h:68
Uint8 b
Definition Color.h:68
Uint8 g
Definition Color.h:68
Uint8 r
Definition Color.h:68
vector2< float > vector2f
Definition vector2.h:133
vector2< double > vector2d
Definition vector2.h:134
vector3< float > vector3f
Definition vector3.h:289
vector3< double > vector3d
Definition vector3.h:290