Advertisement
spacechase0

Templated Endian Swapping

Oct 15th, 2011
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.72 KB | None | 0 0
  1. #include <type_traits>
  2.  
  3. // Warning: Untested :P
  4. namespace util
  5. {
  6.     template< typename T, size_t S = sizeof( T ) >
  7.     typename std::enable_if< std::is_integral< T >::value, T >::type
  8.     SwapBytes( T t )
  9.     {
  10.         T toReturn;
  11.        
  12.         for ( size_t i = 0; i < S; ++i )
  13.         {
  14.             sf::Uint8 byte = ( t >> ( i * 8 ) ) & 0xff;
  15.             toReturn += byte << ( ( S - 1 - i ) * 8 );
  16.         }
  17.        
  18.         return toReturn;
  19.     }
  20.    
  21.     template< typename T, size_t S = sizeof( T ) >
  22.     typename std::enable_if< std::is_floatingpoint< T >::value, T >::type
  23.     SwapBytes( T t )
  24.     {
  25.         union
  26.         {
  27.             T f2;
  28.             unsigned char b[ S ];
  29.         } dat1, dat2;
  30.  
  31.         dat1.f2 = t;
  32.         for ( size_t i = 0; i < S; ++i )
  33.         {
  34.             dat2.b[ i ] = dat1.b[ S - 1 - i ];
  35.         }
  36.        
  37.         return dat2.f2;
  38.     }
  39. }
  40.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement