1 #ifndef _library__serialization__hpp__included__
2 #define _library__serialization__hpp__included__
7 template<typename T1
, typename T2
, size_t ssize
, bool be
>
8 void _write_common(unsigned char* target
, T1 value
)
10 for(size_t i
= 0; i
< ssize
; i
++)
12 target
[i
] = static_cast<T2
>(value
) >> 8 * (ssize
- i
- 1);
14 target
[i
] = static_cast<T2
>(value
) >> 8 * i
;
17 template<typename T1
, typename T2
, size_t ssize
, bool be
>
18 T1
_read_common(const unsigned char* source
)
21 for(size_t i
= 0; i
< ssize
; i
++)
23 value
|= static_cast<T2
>(source
[i
]) << 8 * (ssize
- i
- 1);
25 value
|= static_cast<T2
>(source
[i
]) << 8 * i
;
26 return static_cast<T1
>(value
);
29 #define write8sbe(t, v) _write_common< int8_t, uint8_t, 1, true>(reinterpret_cast<unsigned char*>(t), (v))
30 #define write8sle(t, v) _write_common< int8_t, uint8_t, 1, false>(reinterpret_cast<unsigned char*>(t), (v))
31 #define write8ube(t, v) _write_common< uint8_t, uint8_t, 1, true>(reinterpret_cast<unsigned char*>(t), (v))
32 #define write8ule(t, v) _write_common< uint8_t, uint8_t, 1, false>(reinterpret_cast<unsigned char*>(t), (v))
33 #define write16sbe(t, v) _write_common< int16_t, uint16_t, 2, true>(reinterpret_cast<unsigned char*>(t), (v))
34 #define write16sle(t, v) _write_common< int16_t, uint16_t, 2, false>(reinterpret_cast<unsigned char*>(t), (v))
35 #define write16ube(t, v) _write_common<uint16_t, uint16_t, 2, true>(reinterpret_cast<unsigned char*>(t), (v))
36 #define write16ule(t, v) _write_common<uint16_t, uint16_t, 2, false>(reinterpret_cast<unsigned char*>(t), (v))
37 #define write32sbe(t, v) _write_common< int32_t, uint32_t, 4, true>(reinterpret_cast<unsigned char*>(t), (v))
38 #define write32sle(t, v) _write_common< int32_t, uint32_t, 4, false>(reinterpret_cast<unsigned char*>(t), (v))
39 #define write32ube(t, v) _write_common<uint32_t, uint32_t, 4, true>(reinterpret_cast<unsigned char*>(t), (v))
40 #define write32ule(t, v) _write_common<uint32_t, uint32_t, 4, false>(reinterpret_cast<unsigned char*>(t), (v))
41 #define write64sbe(t, v) _write_common< int64_t, uint64_t, 8, true>(reinterpret_cast<unsigned char*>(t), (v))
42 #define write64sle(t, v) _write_common< int64_t, uint64_t, 8, false>(reinterpret_cast<unsigned char*>(t), (v))
43 #define write64ube(t, v) _write_common<uint64_t, uint64_t, 8, true>(reinterpret_cast<unsigned char*>(t), (v))
44 #define write64ule(t, v) _write_common<uint64_t, uint64_t, 8, false>(reinterpret_cast<unsigned char*>(t), (v))
45 #define read8sbe(t) _read_common< int8_t, uint8_t, 1, true>(reinterpret_cast<const unsigned char*>(t))
46 #define read8sle(t) _read_common< int8_t, uint8_t, 1, false>(reinterpret_cast<const unsigned char*>(t))
47 #define read8ube(t) _read_common< uint8_t, uint8_t, 1, true>(reinterpret_cast<const unsigned char*>(t))
48 #define read8ule(t) _read_common< uint8_t, uint8_t, 1, false>(reinterpret_cast<const unsigned char*>(t))
49 #define read16sbe(t) _read_common< int16_t, uint16_t, 2, true>(reinterpret_cast<const unsigned char*>(t))
50 #define read16sle(t) _read_common< int16_t, uint16_t, 2, false>(reinterpret_cast<const unsigned char*>(t))
51 #define read16ube(t) _read_common<uint16_t, uint16_t, 2, true>(reinterpret_cast<const unsigned char*>(t))
52 #define read16ule(t) _read_common<uint16_t, uint16_t, 2, false>(reinterpret_cast<const unsigned char*>(t))
53 #define read32sbe(t) _read_common< int32_t, uint32_t, 4, true>(reinterpret_cast<const unsigned char*>(t))
54 #define read32sle(t) _read_common< int32_t, uint32_t, 4, false>(reinterpret_cast<const unsigned char*>(t))
55 #define read32ube(t) _read_common<uint32_t, uint32_t, 4, true>(reinterpret_cast<const unsigned char*>(t))
56 #define read32ule(t) _read_common<uint32_t, uint32_t, 4, false>(reinterpret_cast<const unsigned char*>(t))
57 #define read64sbe(t) _read_common< int64_t, uint64_t, 8, true>(reinterpret_cast<const unsigned char*>(t))
58 #define read64sle(t) _read_common< int64_t, uint64_t, 8, false>(reinterpret_cast<const unsigned char*>(t))
59 #define read64ube(t) _read_common<uint64_t, uint64_t, 8, true>(reinterpret_cast<const unsigned char*>(t))
60 #define read64ule(t) _read_common<uint64_t, uint64_t, 8, false>(reinterpret_cast<const unsigned char*>(t))
62 template<typename T
> void swap_endian(T
& value
)
64 char* _value
= reinterpret_cast<char*>(&value
);
65 for(size_t i
= 0; i
< sizeof(T
)/2; i
++)
66 std::swap(_value
[i
], _value
[sizeof(T
)-i
-1]);
69 template<typename T
> void swap_endian(T
& value
, int endian
)
72 char magic
= *reinterpret_cast<char*>(&_magic
);
73 bool do_swap
= (endian
== -1 && magic
== 1) || (endian
== 1 && magic
== 2);
78 template<typename T
> T
read_of_endian(const void* value
, int endian
)
81 memcpy(&val
, value
, sizeof(T
));
82 swap_endian(val
, endian
);
86 template<typename T
> void write_of_endian(void* value
, const T
& val
, int endian
)
89 memcpy(value
, &val
, sizeof(T
));
90 swap_endian(*reinterpret_cast<T
*>(value
), endian
);