X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=libs%2Fbytestreamutils.h;h=69ec3755f9c0ca1da77eecc976f53f2d0f7d55d4;hb=HEAD;hp=156333a17cd6d599f7eff919250005977da8d6dd;hpb=7fc621fc78d0e040dc2c12f38dc53dd9048215dc;p=xonotic%2Fnetradiant.git diff --git a/libs/bytestreamutils.h b/libs/bytestreamutils.h index 156333a1..69ec3755 100644 --- a/libs/bytestreamutils.h +++ b/libs/bytestreamutils.h @@ -22,7 +22,9 @@ #if !defined( INCLUDED_BYTESTREAMUTILS_H ) #define INCLUDED_BYTESTREAMUTILS_H -#if defined( __GNUC__ ) +#include "globaldefs.h" + +#if GDEF_COMPILER_GNU #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 @@ -55,18 +57,20 @@ typedef unsigned int uint32_t; 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 + istream.read(reinterpret_cast( &value ), sizeof(Type)); + if (GDEF_ARCH_ENDIAN_BIG) { + std::reverse(reinterpret_cast( &value ), + reinterpret_cast( &value ) + sizeof(Type)); + } } 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 + istream.read(reinterpret_cast( &value ), sizeof(Type)); + if (!GDEF_ARCH_ENDIAN_BIG) { + std::reverse(reinterpret_cast( &value ), + reinterpret_cast( &value ) + sizeof(Type)); + } } template @@ -82,6 +86,13 @@ inline int16_t istream_read_int16_le( InputStreamType& istream ){ return value; } +template +inline int16_t istream_read_int16_be( InputStreamType& istream ){ + int16_t value; + istream_read_big_endian( istream, value ); + return value; +} + template inline uint16_t istream_read_uint16_le( InputStreamType& istream ){ uint16_t value; @@ -89,6 +100,13 @@ inline uint16_t istream_read_uint16_le( InputStreamType& istream ){ return value; } +template +inline uint16_t istream_read_uint16_be( InputStreamType& istream ){ + uint16_t value; + istream_read_big_endian( istream, value ); + return value; +} + template inline int32_t istream_read_int32_le( InputStreamType& istream ){ int32_t value; @@ -96,6 +114,13 @@ inline int32_t istream_read_int32_le( InputStreamType& istream ){ return value; } +template +inline int32_t istream_read_int32_be( InputStreamType& istream ){ + int32_t value; + istream_read_big_endian( istream, value ); + return value; +} + template inline uint32_t istream_read_uint32_le( InputStreamType& istream ){ uint32_t value; @@ -103,6 +128,13 @@ inline uint32_t istream_read_uint32_le( InputStreamType& istream ){ return value; } +template +inline uint32_t istream_read_uint32_be( InputStreamType& istream ){ + uint32_t value; + istream_read_big_endian( istream, value ); + return value; +} + template inline float istream_read_float32_le( InputStreamType& istream ){ float value; @@ -110,6 +142,13 @@ inline float istream_read_float32_le( InputStreamType& istream ){ return value; } +template +inline float istream_read_float32_be( InputStreamType& istream ){ + float value; + istream_read_big_endian( istream, value ); + return value; +} + template inline typename InputStreamType::byte_type istream_read_byte( InputStreamType& istream ){ typename InputStreamType::byte_type b;