#if !defined(INCLUDED_BYTESTREAMUTILS_H) #define INCLUDED_BYTESTREAMUTILS_H #include #if defined(_MSC_VER) typedef signed short int16_t; typedef unsigned short uint16_t; typedef signed int int32_t; typedef unsigned int uint32_t; #else #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #include #endif template inline void istream_read_little_endian(InputStreamType& istream, Type& value) { istream.read(reinterpret_cast(&value), sizeof(Type)); #if defined(__BIG_ENDIAN__) std::reverse(reinterpret_cast(&value), reinterpret_cast(&value) + sizeof(Type)); #endif } template inline void istream_read_big_endian(InputStreamType& istream, Type& value) { istream.read(reinterpret_cast(&value), sizeof(Type)); #if !defined(__BIG_ENDIAN__) std::reverse(reinterpret_cast(&value), reinterpret_cast(&value) + sizeof(Type)); #endif } template inline void istream_read_byte(InputStreamType& istream, typename InputStreamType::byte_type& b) { istream.read(&b, 1); } template inline int16_t istream_read_int16_le(InputStreamType& istream) { int16_t value; istream_read_little_endian(istream, value); return value; } template inline uint16_t istream_read_uint16_le(InputStreamType& istream) { uint16_t value; istream_read_little_endian(istream, value); return value; } template inline int32_t istream_read_int32_le(InputStreamType& istream) { int32_t value; istream_read_little_endian(istream, value); return value; } template inline uint32_t istream_read_uint32_le(InputStreamType& istream) { uint32_t value; istream_read_little_endian(istream, value); return value; } template inline float istream_read_float32_le(InputStreamType& istream) { float value; istream_read_little_endian(istream, value); return value; } template inline typename InputStreamType::byte_type istream_read_byte(InputStreamType& istream) { typename InputStreamType::byte_type b; istream.read(&b, sizeof(typename InputStreamType::byte_type)); return b; } #endif