25 #ifndef SER4CPP_SERIALIZATIONTEMPLATES_H 26 #define SER4CPP_SERIALIZATIONTEMPLATES_H 28 #include "ser4cpp/container/SequenceTypes.h" 29 #include "ser4cpp/serialization/UInt48Type.h" 47 inline static bool read_from(
rseq_t& input, uint8_t& out)
49 if (input.length() < size)
return false;
56 static bool write_to(
wseq_t& dest, uint8_t value)
58 if (dest.length() < size)
return false;
65 const static size_t size = 1;
66 const static uint8_t min_value = 0;
67 const static uint8_t max_value = 255;
69 typedef uint8_t type_t;
72 inline static uint8_t read(
const uint8_t* start)
77 inline static void write(uint8_t* start, uint8_t value)
83 template <
class T, u
int8_t B0, u
int8_t B1>
86 static_assert(
sizeof(T) == 2,
"bad size");
87 static_assert((B0 <
sizeof(T))&& (B1 <
sizeof(T))&& (B0 != B1),
"bad config");
90 static bool write_to(
wseq_t& dest, T value)
92 if (dest.length() < size)
return false;
99 inline static bool read_from(
rseq_t& input, T& out)
101 if (input.length() < size)
return false;
110 const static size_t size =
sizeof(T);
111 const static T max_value;
112 const static T min_value;
115 static T read(
const uint8_t* data)
117 return (static_cast<T>(data[B0]) << 0) | (static_cast<T>(data[B1]) << 8);
120 static void write(uint8_t* data, T value)
122 data[B0] = static_cast<uint8_t>(value & 0xFF);
123 data[B1] = static_cast<uint8_t>((value >> 8) & 0xFF);
127 template <
class T, u
int8_t B0, u
int8_t B1>
130 template <
class T, u
int8_t B0, u
int8_t B1>
133 template <
class T, u
int8_t B0, u
int8_t B1, u
int8_t B2, u
int8_t B3>
136 static_assert(
sizeof(T) == 4,
"bad size");
137 static_assert((B0 <
sizeof(T))&& (B1 <
sizeof(T))&& (B2 <
sizeof(T))&& (B3 <
sizeof(T)),
"bad config");
140 static bool write_to(
wseq_t& dest, T value)
142 if (dest.length() < size)
return false;
149 inline static bool read_from(
rseq_t& input, T& out)
151 if (input.length() < size)
return false;
160 const static size_t size =
sizeof(T);
161 const static T max_value;
162 const static T min_value;
165 static T read(
const uint8_t* data)
167 return (static_cast<T>(data[B0]) << 0) |
168 (static_cast<T>(data[B1]) << 8) |
169 (static_cast<T>(data[B2]) << 16) |
170 (static_cast<T>(data[B3]) << 24);
173 static void write(uint8_t* data, T value)
175 data[B0] = static_cast<uint8_t>(value & 0xFF);
176 data[B1] = static_cast<uint8_t>((value >> 8) & 0xFF);
177 data[B2] = static_cast<uint8_t>((value >> 16) & 0xFF);
178 data[B3] = static_cast<uint8_t>((value >> 24) & 0xFF);
182 template <
class T, u
int8_t B0, u
int8_t B1, u
int8_t B2, u
int8_t B3>
185 template <
class T, u
int8_t B0, u
int8_t B1, u
int8_t B2, u
int8_t B3>
188 template <
class T, u
int8_t B0, u
int8_t B1, u
int8_t B2, u
int8_t B3, u
int8_t B4, u
int8_t B5, u
int8_t B6, u
int8_t B7>
191 static_assert(
sizeof(T) == 8,
"bad size");
193 (B0 <
sizeof(T))&& (B1 <
sizeof(T))&& (B2 <
sizeof(T))&& (B3 <
sizeof(T))&& (B4 <
sizeof(T))&& (B5 <
sizeof(T))&& (B6 <
sizeof(T))&& (B7 <
sizeof(T)),
198 static bool write_to(
wseq_t& dest, T value)
200 if (dest.length() < size)
return false;
207 inline static bool read_from(
rseq_t& input, T& out)
209 if (input.length() < size)
return false;
218 const static size_t size =
sizeof(T);
219 const static T max_value;
220 const static T min_value;
223 static T read(
const uint8_t* data)
225 return (static_cast<T>(data[B0]) << 0) |
226 (static_cast<T>(data[B1]) << 8) |
227 (static_cast<T>(data[B2]) << 16) |
228 (static_cast<T>(data[B3]) << 24) |
229 (static_cast<T>(data[B4]) << 32) |
230 (static_cast<T>(data[B5]) << 40) |
231 (static_cast<T>(data[B6]) << 48) |
232 (static_cast<T>(data[B7]) << 56);
235 static void write(uint8_t* data, T value)
237 data[B0] = static_cast<uint8_t>(value & 0xFF);
238 data[B1] = static_cast<uint8_t>((value >> 8) & 0xFF);
239 data[B2] = static_cast<uint8_t>((value >> 16) & 0xFF);
240 data[B3] = static_cast<uint8_t>((value >> 24) & 0xFF);
241 data[B4] = static_cast<uint8_t>((value >> 32) & 0xFF);
242 data[B5] = static_cast<uint8_t>((value >> 40) & 0xFF);
243 data[B6] = static_cast<uint8_t>((value >> 48) & 0xFF);
244 data[B7] = static_cast<uint8_t>((value >> 56) & 0xFF);
248 template <
class T, u
int8_t B0, u
int8_t B1, u
int8_t B2, u
int8_t B3, u
int8_t B4, u
int8_t B5, u
int8_t B6, u
int8_t B7>
251 template <
class T, u
int8_t B0, u
int8_t B1, u
int8_t B2, u
int8_t B3, u
int8_t B4, u
int8_t B5, u
int8_t B6, u
int8_t B7>
255 template <u
int8_t B0, u
int8_t B1, u
int8_t B2, u
int8_t B3, u
int8_t B4, u
int8_t B5>
258 static_assert((B0 < 6)&& (B1 < 6)&& (B2 < 6)&& (B3 < 6)&& (B4 < 6)&& (B5 < 6),
"bad config");
263 if (input.length() < size)
return false;
272 if (dest.length() < size)
return false;
280 const static size_t size = 6;
281 const static uint64_t min_value = 0;
282 const static uint64_t max_value = 281474976710655ULL;
284 static inline UInt48Type read(
const uint8_t* data)
287 (static_cast<uint64_t>(data[B0]) << 0) |
288 (static_cast<uint64_t>(data[B1]) << 8) |
289 (static_cast<uint64_t>(data[B2]) << 16) |
290 (static_cast<uint64_t>(data[B3]) << 24) |
291 (static_cast<uint64_t>(data[B4]) << 32) |
292 (static_cast<uint64_t>(data[B5]) << 40));
295 static inline void write(uint8_t* data,
UInt48Type value)
297 if (value > max_value)
302 data[B0] = static_cast<uint8_t>(value & 0xFF);
303 data[B1] = static_cast<uint8_t>((value >> 8) & 0xFF);
304 data[B2] = static_cast<uint8_t>((value >> 16) & 0xFF);
305 data[B3] = static_cast<uint8_t>((value >> 24) & 0xFF);
306 data[B4] = static_cast<uint8_t>((value >> 32) & 0xFF);
307 data[B5] = static_cast<uint8_t>((value >> 40) & 0xFF);
ser4cpp header-only library namespace