]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/bytestreamutils.h
allow undo “make detail/structural”, <3 @SpiKe, thanks @Garux, fix #76
[xonotic/netradiant.git] / libs / bytestreamutils.h
index 156333a17cd6d599f7eff919250005977da8d6dd..69ec3755f9c0ca1da77eecc976f53f2d0f7d55d4 100644 (file)
@@ -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<typename InputStreamType, typename Type>
 inline void istream_read_little_endian( InputStreamType& istream, Type& value ){
-       istream.read( reinterpret_cast<typename InputStreamType::byte_type*>( &value ), sizeof( Type ) );
-#if defined( __BIG_ENDIAN__ )
-       std::reverse( reinterpret_cast<typename InputStreamType::byte_type*>( &value ), reinterpret_cast<typename InputStreamType::byte_type*>( &value ) + sizeof( Type ) );
-#endif
+       istream.read(reinterpret_cast<typename InputStreamType::byte_type *>( &value ), sizeof(Type));
+       if (GDEF_ARCH_ENDIAN_BIG) {
+               std::reverse(reinterpret_cast<typename InputStreamType::byte_type *>( &value ),
+                                        reinterpret_cast<typename InputStreamType::byte_type *>( &value ) + sizeof(Type));
+       }
 }
 
 template<typename InputStreamType, typename Type>
 inline void istream_read_big_endian( InputStreamType& istream, Type& value ){
-       istream.read( reinterpret_cast<typename InputStreamType::byte_type*>( &value ), sizeof( Type ) );
-#if !defined( __BIG_ENDIAN__ )
-       std::reverse( reinterpret_cast<typename InputStreamType::byte_type*>( &value ), reinterpret_cast<typename InputStreamType::byte_type*>( &value ) + sizeof( Type ) );
-#endif
+       istream.read(reinterpret_cast<typename InputStreamType::byte_type *>( &value ), sizeof(Type));
+       if (!GDEF_ARCH_ENDIAN_BIG) {
+               std::reverse(reinterpret_cast<typename InputStreamType::byte_type *>( &value ),
+                                        reinterpret_cast<typename InputStreamType::byte_type *>( &value ) + sizeof(Type));
+       }
 }
 
 template<typename InputStreamType>
@@ -82,6 +86,13 @@ inline int16_t istream_read_int16_le( InputStreamType& istream ){
        return value;
 }
 
+template<typename InputStreamType>
+inline int16_t istream_read_int16_be( InputStreamType& istream ){
+       int16_t value;
+       istream_read_big_endian( istream, value );
+       return value;
+}
+
 template<typename InputStreamType>
 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<typename InputStreamType>
+inline uint16_t istream_read_uint16_be( InputStreamType& istream ){
+       uint16_t value;
+       istream_read_big_endian( istream, value );
+       return value;
+}
+
 template<typename InputStreamType>
 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<typename InputStreamType>
+inline int32_t istream_read_int32_be( InputStreamType& istream ){
+       int32_t value;
+       istream_read_big_endian( istream, value );
+       return value;
+}
+
 template<typename InputStreamType>
 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<typename InputStreamType>
+inline uint32_t istream_read_uint32_be( InputStreamType& istream ){
+       uint32_t value;
+       istream_read_big_endian( istream, value );
+       return value;
+}
+
 template<typename InputStreamType>
 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<typename InputStreamType>
+inline float istream_read_float32_be( InputStreamType& istream ){
+       float value;
+       istream_read_big_endian( istream, value );
+       return value;
+}
+
 template<typename InputStreamType>
 inline typename InputStreamType::byte_type istream_read_byte( InputStreamType& istream ){
        typename InputStreamType::byte_type b;