Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/utility.h

    r8ca60e4 r5bf685f  
    111111};
    112112
     113// -----------------------------------------------------------------------------
     114// O(1) polymorphic integer ilog2, using clz, which returns the number of leading 0-bits, starting at the most
     115// significant bit (single instruction on x86)
     116
     117template<typename T>
     118inline
     119#if defined(__GNUC__) && __GNUC__ > 4
     120constexpr
     121#endif
     122T ilog2(const T & t) {
     123        if(std::is_integral<T>::value) {
     124                const constexpr int r = sizeof(t) * __CHAR_BIT__ - 1;
     125                if( sizeof(T) == sizeof(unsigned       int) ) return r - __builtin_clz  ( t );
     126                if( sizeof(T) == sizeof(unsigned      long) ) return r - __builtin_clzl ( t );
     127                if( sizeof(T) == sizeof(unsigned long long) ) return r - __builtin_clzll( t );
     128        }
     129        assert(false);
     130        return -1;
     131} // ilog2
     132
    113133// Local Variables: //
    114134// tab-width: 4 //
Note: See TracChangeset for help on using the changeset viewer.