#include "boost-compat/static_assert.hpp" #include "boost-compat/remove_cv.hpp" #ifdef HAVE_BOOST #include <boost/type_traits/is_same.hpp> #endif namespace byte_io { template <typename T> inline T no_const( const volatile T v ) { return v; } template<typename T> inline void write( unsigned char* out, const volatile T d ) { write( out, no_const( d ) ); } template <typename T> inline T read( const unsigned char* out ) { //BOOST_STATIC_ASSERT( !( ::boost::is_same<T,typename ::boost::remove_cv<T>::type>::value ) ); return read<typename ::boost::remove_cv<T>::type>( out ); } template<> inline void write<uint8_t>( unsigned char* out, uint8_t d ) { *out = d; } template<> inline uint8_t read<uint8_t>( const unsigned char* in ) { return *in; } template<> struct byte_length_struct<uint8_t> { static const int value = 1; }; template<> inline void write<uint16_t>( unsigned char* out, uint16_t d ) { *out++ = ( ( d >> 0 ) & 0xff ); *out++ = ( ( d >> 8 ) & 0xff ); } template<> inline uint16_t read<uint16_t>( const unsigned char* in ) { uint16_t res = 0; res |= ( ( *in++ & 0xff ) << 0 ); res |= ( ( *in++ & 0xff ) << 8 ); return res; } template<> struct byte_length_struct<uint16_t> { static const int value = 2; }; template<> inline void write<uint32_t>( unsigned char* out, uint32_t d ) { *out++ = ( ( d >> 0 ) & 0xff ); *out++ = ( ( d >> 8 ) & 0xff ); *out++ = ( ( d >> 16 ) & 0xff ); *out++ = ( ( d >> 24 ) & 0xff ); } template<> inline uint32_t read<uint32_t>( const unsigned char* in ) { uint32_t res = 0; res |= ( ( *in++ & 0xff ) << 0 ); res |= ( ( *in++ & 0xff ) << 8 ); res |= ( ( *in++ & 0xff ) << 16 ); res |= ( ( *in++ & 0xff ) << 24 ); return res; } template<> struct byte_length_struct<uint32_t> { static const int value = 4; }; }