#ifndef _library__serialization__hpp__included__ #define _library__serialization__hpp__included__ #include #include #include namespace serialization { template struct unsigned_of {}; template<> struct unsigned_of { typedef uint8_t t; }; template<> struct unsigned_of { typedef uint8_t t; }; template<> struct unsigned_of { typedef uint16_t t; }; template<> struct unsigned_of { typedef uint16_t t; }; template<> struct unsigned_of { typedef uint32_t t; }; template<> struct unsigned_of { typedef uint32_t t; }; template<> struct unsigned_of { typedef uint64_t t; }; template<> struct unsigned_of { typedef uint64_t t; }; template void write_common(uint8_t* target, T1 value) { for(size_t i = 0; i < sizeof(T1); i++) if(be) target[i] = static_cast::t>(value) >> 8 * (sizeof(T1) - i - 1); else target[i] = static_cast::t>(value) >> 8 * i; } template T1 read_common(const uint8_t* source) { typename unsigned_of::t value = 0; for(size_t i = 0; i < sizeof(T1); i++) if(be) value |= static_cast::t>(source[i]) << 8 * (sizeof(T1) - i - 1); else value |= static_cast::t>(source[i]) << 8 * i; return static_cast(value); } inline void s8b(void* t, int8_t v) { write_common< int8_t, true>(reinterpret_cast(t), v); } inline void s8l(void* t, int8_t v) { write_common< int8_t, false>(reinterpret_cast(t), v); } inline void u8b(void* t, uint8_t v) { write_common< uint8_t, true>(reinterpret_cast(t), v); } inline void u8l(void* t, uint8_t v) { write_common< uint8_t, false>(reinterpret_cast(t), v); } inline void s16b(void* t, int16_t v) { write_common< int16_t, true>(reinterpret_cast(t), v); } inline void s16l(void* t, int16_t v) { write_common< int16_t, false>(reinterpret_cast(t), v); } inline void u16b(void* t, uint16_t v) { write_common(reinterpret_cast(t), v); } inline void u16l(void* t, uint16_t v) { write_common(reinterpret_cast(t), v); } inline void s32b(void* t, int32_t v) { write_common< int32_t, true>(reinterpret_cast(t), v); } inline void s32l(void* t, int32_t v) { write_common< int32_t, false>(reinterpret_cast(t), v); } inline void u32b(void* t, uint32_t v) { write_common(reinterpret_cast(t), v); } inline void u32l(void* t, uint32_t v) { write_common(reinterpret_cast(t), v); } inline void s64b(void* t, int64_t v) { write_common< int64_t, true>(reinterpret_cast(t), v); } inline void s64l(void* t, int64_t v) { write_common< int64_t, false>(reinterpret_cast(t), v); } inline void u64b(void* t, uint64_t v) { write_common(reinterpret_cast(t), v); } inline void u64l(void* t, uint64_t v) { write_common(reinterpret_cast(t), v); } inline int8_t s8b(const void* t) { return read_common< int8_t, true>(reinterpret_cast(t)); } inline int8_t s8l(const void* t) { return read_common< int8_t, false>(reinterpret_cast(t)); } inline uint8_t u8b(const void* t) { return read_common< uint8_t, true>(reinterpret_cast(t)); } inline uint8_t u8l(const void* t) { return read_common< uint8_t, false>(reinterpret_cast(t)); } inline int16_t s16b(const void* t) { return read_common< int16_t, true>(reinterpret_cast(t)); } inline int16_t s16l(const void* t) { return read_common< int16_t, false>(reinterpret_cast(t)); } inline uint16_t u16b(const void* t) { return read_common(reinterpret_cast(t)); } inline uint16_t u16l(const void* t) { return read_common(reinterpret_cast(t)); } inline int32_t s32b(const void* t) { return read_common< int32_t, true>(reinterpret_cast(t)); } inline int32_t s32l(const void* t) { return read_common< int32_t, false>(reinterpret_cast(t)); } inline uint32_t u32b(const void* t) { return read_common(reinterpret_cast(t)); } inline uint32_t u32l(const void* t) { return read_common(reinterpret_cast(t)); } inline int64_t s64b(const void* t) { return read_common< int64_t, true>(reinterpret_cast(t)); } inline int64_t s64l(const void* t) { return read_common< int64_t, false>(reinterpret_cast(t)); } inline uint64_t u64b(const void* t) { return read_common(reinterpret_cast(t)); } inline uint64_t u64l(const void* t) { return read_common(reinterpret_cast(t)); } template void swap_endian(T& value) { char* _value = reinterpret_cast(&value); for(size_t i = 0; i < sizeof(T)/2; i++) std::swap(_value[i], _value[sizeof(T)-i-1]); } template void swap_endian(T& value, int endian) { short _magic = 258; char magic = *reinterpret_cast(&_magic); bool do_swap = (endian == -1 && magic == 1) || (endian == 1 && magic == 2); if(do_swap) swap_endian(value); } template T read_endian(const void* value, int endian) { T val; memcpy(&val, value, sizeof(T)); swap_endian(val, endian); return val; } template void write_endian(void* value, const T& val, int endian) { T val2; memcpy(value, &val, sizeof(T)); swap_endian(*reinterpret_cast(value), endian); } } #endif