Use c++20 has_single_bit for POT test

This commit is contained in:
kd-11 2021-08-02 23:06:54 +03:00 committed by kd-11
parent 99b6963fab
commit 8aec943093
2 changed files with 6 additions and 7 deletions

View File

@ -13,6 +13,12 @@ namespace utils
{ {
return std::span<T>(bless<T>(span.data()), sizeof(U) * span.size() / sizeof(T)); return std::span<T>(bless<T>(span.data()), sizeof(U) * span.size() / sizeof(T));
} }
template <typename T>
bool is_power_of_2(T value)
{
return std::has_single_bit(value);
}
} }
namespace namespace

View File

@ -385,13 +385,6 @@ namespace utils
return static_cast<T>(value / align + (value > 0 ? T{(value % align) > (align / 2)} : 0 - T{(value % align) < (align / 2)})); return static_cast<T>(value / align + (value > 0 ? T{(value % align) > (align / 2)} : 0 - T{(value % align) < (align / 2)}));
} }
// Returns true if input is an unsigned integer with a power of 2
template <typename T> requires(std::is_integral_v<T> && std::is_unsigned_v<T>)
constexpr T is_power_of_2(T value)
{
return !(value & (value - 1));
}
// Hack. Pointer cast util to workaround UB. Use with extreme care. // Hack. Pointer cast util to workaround UB. Use with extreme care.
template <typename T, typename U> template <typename T, typename U>
[[nodiscard]] T* bless(U* ptr) [[nodiscard]] T* bless(U* ptr)