Skip to content

Commit

Permalink
fix: compilation on homebrew clang 16.06
Browse files Browse the repository at this point in the history
These series of inline functions could rely on function overloading instead of being a template specialization
  • Loading branch information
ludamad authored Sep 1, 2023
1 parent 3a8e702 commit af5bae0
Showing 1 changed file with 11 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,29 +10,32 @@ namespace numeric {
* Implemented in terms of intrinsics which will use instructions such as `bsr` or `lzcnt` for best performance.
* Undefined behaviour when input is 0.
*/
template <typename T> constexpr inline size_t count_leading_zeros(T const& u);

template <> constexpr inline size_t count_leading_zeros<uint32_t>(uint32_t const& u)
constexpr inline size_t count_leading_zeros(uint32_t const& u)
{
return static_cast<size_t>(__builtin_clz(u));
}

template <> constexpr inline size_t count_leading_zeros<uint64_t>(uint64_t const& u)
constexpr inline size_t count_leading_zeros(unsigned long const& u)
{
return static_cast<size_t>(__builtin_clzll(u));
}

constexpr inline size_t count_leading_zeros(uint64_t const& u)
{
return static_cast<size_t>(__builtin_clzll(u));
}

template <> constexpr inline size_t count_leading_zeros<uint128_t>(uint128_t const& u)
constexpr inline size_t count_leading_zeros(uint128_t const& u)
{
auto hi = static_cast<uint64_t>(u >> 64);
auto hi = static_cast<size_t>(64);
if (hi != 0U) {
return static_cast<size_t>(__builtin_clzll(hi));
}
auto lo = static_cast<uint64_t>(u);
auto lo = static_cast<size_t>(u);
return static_cast<size_t>(__builtin_clzll(lo)) + 64;
}

template <> constexpr inline size_t count_leading_zeros<uint256_t>(uint256_t const& u)
constexpr inline size_t count_leading_zeros(uint256_t const& u)
{
if (u.data[3] != 0U) {
return count_leading_zeros(u.data[3]);
Expand Down

0 comments on commit af5bae0

Please sign in to comment.