Save bitmaps as PNG
[lsnes.git] / include / library / serialization.hpp
blobb49b3453f5fab176b64578c423531395ff330ea9
1 #ifndef _library__serialization__hpp__included__
2 #define _library__serialization__hpp__included__
4 #include <cstdlib>
5 #include <map>
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++)
11 if(be)
12 target[i] = static_cast<T2>(value) >> 8 * (ssize - i - 1);
13 else
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)
20 T2 value = 0;
21 for(size_t i = 0; i < ssize; i++)
22 if(be)
23 value |= static_cast<T2>(source[i]) << 8 * (ssize - i - 1);
24 else
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)
71 short _magic = 258;
72 char magic = *reinterpret_cast<char*>(&_magic);
73 bool do_swap = (endian == -1 && magic == 1) || (endian == 1 && magic == 2);
74 if(do_swap)
75 swap_endian(value);
78 template<typename T> T read_of_endian(const void* value, int endian)
80 T val;
81 memcpy(&val, value, sizeof(T));
82 swap_endian(val, endian);
83 return val;
86 template<typename T> void write_of_endian(void* value, const T& val, int endian)
88 T val2;
89 memcpy(value, &val, sizeof(T));
90 swap_endian(*reinterpret_cast<T*>(value), endian);
93 #endif