Use std::countl_zero instead of __builtin_clzll (#7025)
This commit is contained in:
parent
5f67e715af
commit
f636dbfd44
@ -1,50 +1,24 @@
|
|||||||
#ifndef OSRM_UTIL_MSB_HPP
|
#ifndef OSRM_UTIL_MSB_HPP
|
||||||
#define OSRM_UTIL_MSB_HPP
|
#define OSRM_UTIL_MSB_HPP
|
||||||
|
|
||||||
|
#include <bit>
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
|
|
||||||
#include <climits>
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <utility>
|
#include <limits>
|
||||||
|
|
||||||
namespace osrm::util
|
namespace osrm::util
|
||||||
{
|
{
|
||||||
|
|
||||||
// get the msb of an integer
|
|
||||||
// return 0 for integers without msb
|
|
||||||
template <typename T> std::size_t msb(T value)
|
template <typename T> std::size_t msb(T value)
|
||||||
{
|
{
|
||||||
|
BOOST_ASSERT(value > 0);
|
||||||
|
|
||||||
static_assert(std::is_integral<T>::value && !std::is_signed<T>::value, "Integer required.");
|
static_assert(std::is_integral<T>::value && !std::is_signed<T>::value, "Integer required.");
|
||||||
std::size_t msb = 0;
|
constexpr auto MSB_INDEX = std::numeric_limits<unsigned char>::digits * sizeof(T) - 1;
|
||||||
while (value > 0)
|
|
||||||
{
|
return MSB_INDEX - std::countl_zero(value);
|
||||||
value >>= 1u;
|
|
||||||
msb++;
|
|
||||||
}
|
|
||||||
BOOST_ASSERT(msb > 0);
|
|
||||||
return msb - 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (defined(__clang__) || defined(__GNUC__) || defined(__GNUG__))
|
|
||||||
inline std::size_t msb(unsigned long long v)
|
|
||||||
{
|
|
||||||
BOOST_ASSERT(v > 0);
|
|
||||||
constexpr auto MSB_INDEX = CHAR_BIT * sizeof(unsigned long long) - 1;
|
|
||||||
return MSB_INDEX - __builtin_clzll(v);
|
|
||||||
}
|
|
||||||
inline std::size_t msb(unsigned long v)
|
|
||||||
{
|
|
||||||
BOOST_ASSERT(v > 0);
|
|
||||||
constexpr auto MSB_INDEX = CHAR_BIT * sizeof(unsigned long) - 1;
|
|
||||||
return MSB_INDEX - __builtin_clzl(v);
|
|
||||||
}
|
|
||||||
inline std::size_t msb(unsigned int v)
|
|
||||||
{
|
|
||||||
BOOST_ASSERT(v > 0);
|
|
||||||
constexpr auto MSB_INDEX = CHAR_BIT * sizeof(unsigned int) - 1;
|
|
||||||
return MSB_INDEX - __builtin_clz(v);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
} // namespace osrm::util
|
} // namespace osrm::util
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user