| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- // boost heap: integer log2
- //
- // Copyright (C) 2010 Tim Blechmann
- //
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_HEAP_DETAIL_ILOG2_HPP
- #define BOOST_HEAP_DETAIL_ILOG2_HPP
- namespace boost { namespace heap {
- namespace detail {
- template < typename IntType >
- struct log2
- {
- IntType operator()( IntType value )
- {
- IntType l = 0;
- while ( ( value >> l ) > 1 )
- ++l;
- return l;
- }
- };
- #ifdef __GNUC__
- template <>
- struct log2< unsigned int >
- {
- unsigned int operator()( unsigned int value )
- {
- return sizeof( unsigned int ) * 8 - __builtin_clz( value - 1 );
- }
- };
- template <>
- struct log2< unsigned long >
- {
- unsigned long operator()( unsigned long value )
- {
- return sizeof( unsigned long ) * 8 - __builtin_clzl( value - 1 );
- }
- };
- #endif
- } /* namespace detail */
- template < typename IntType >
- IntType log2( IntType value )
- {
- detail::log2< IntType > fn;
- return fn( value );
- }
- }} // namespace boost::heap
- #endif /* BOOST_HEAP_DETAIL_ILOG2_HPP */
|