20 #ifndef LUNCHBOX_BITOPERATION_H
21 #define LUNCHBOX_BITOPERATION_H
23 #include <lunchbox/compiler.h>
25 #include <lunchbox/uint128_t.h>
28 # pragma warning (push)
29 # pragma warning (disable: 4985) // inconsistent decl of ceil
31 # pragma warning (pop)
33 # include <builtins.h>
34 # include <byteswap.h>
35 #elif defined (LB_GCC_4_3_OR_OLDER) && !defined(__clang__) && !defined( __APPLE__ )
36 # include <byteswap.h>
37 # define LB_GCC_BSWAP_FUNCTION
55 template<
class T >
void byteswap( T& value );
60 template<>
inline int32_t getIndexOfLastBit< uint32_t >( uint32_t value )
63 return ::fls( value ) - 1;
64 #elif defined __GNUC__
65 return value ? (31 - __builtin_clz( value )) : -1;
66 #elif defined _MSC_VER
68 return _BitScanReverse( &i, value ) ? i : -1;
80 template<>
inline int32_t getIndexOfLastBit< uint64_t >( uint64_t value )
83 return value ? (63 - __builtin_clzll( value )) : -1;
86 return _BitScanReverse64( &i, value ) ? i : -1;
98 #if defined(__linux__) && defined(_LP64)
99 template<>
inline int32_t
100 getIndexOfLastBit< unsigned long long >(
unsigned long long value )
106 int32_t getIndexOfLastBit< unsigned long >(
unsigned long value )
110 int32_t getIndexOfLastBit< unsigned long >(
unsigned long value )
115 template<>
inline void byteswap(
void*& ) { }
116 template<>
inline void byteswap(
bool&) { }
117 template<>
inline void byteswap(
char& ) { }
118 template<>
inline void byteswap(
signed char& ) { }
119 template<>
inline void byteswap(
unsigned char& ) { }
120 template<>
inline void byteswap( std::string& ) { }
122 template<>
inline void byteswap( uint32_t& value )
125 value = _byteswap_ulong( value );
126 #elif defined __xlC__
127 __store4r( value, &value );
128 #elif defined LB_GCC_BSWAP_FUNCTION
129 value = bswap_32( value );
131 value = __builtin_bswap32( value );
135 template<>
inline void byteswap( int32_t& value )
136 {
byteswap( reinterpret_cast< uint32_t& >( value )); }
138 template<>
inline void byteswap(
float& value )
139 {
byteswap( reinterpret_cast< uint32_t& >( value )); }
141 template<>
inline void byteswap( uint16_t& value )
144 value = _byteswap_ushort( value );
145 #elif defined __xlC__
146 __store2r( value, &value );
148 value = (uint16_t)(value>>8) | (uint16_t)(value<<8);
152 template<>
inline void byteswap( int16_t& value )
153 {
byteswap( reinterpret_cast< uint16_t& >( value )); }
156 template<>
inline void byteswap(
unsigned long& value )
157 {
byteswap( reinterpret_cast< unsigned long& >( value )); }
160 template<>
inline void byteswap( uint64_t& value )
163 value = _byteswap_uint64( value );
164 #elif defined __xlC__
165 value = __bswap_constant_64( value );
166 #elif defined LB_GCC_BSWAP_FUNCTION
167 value = bswap_64( value );
169 value = __builtin_bswap64( value );
173 template<>
inline void byteswap( int64_t& value )
174 {
byteswap( reinterpret_cast< uint64_t& >( value )); }
176 template<>
inline void byteswap(
double& value )
177 {
byteswap( reinterpret_cast< uint64_t& >( value )); }
179 template<>
inline void byteswap( uint128_t& value )
185 template<
typename T >
186 inline void byteswap(
typename std::vector< T >& value )
188 for(
size_t i = 0; i < value.size(); ++i )
194 #endif //LUNCHBOX_BITOPERATION_H
Basic type definitions not provided by the operating system.
void byteswap(T &value)
Swap the byte order of the given value.
int32_t getIndexOfLastBit(T value)