Codechange: use std::popcount instead of hand written loop

This commit is contained in:
Rubidium 2024-01-18 21:45:42 +01:00 committed by rubidium42
parent ae575a7a5b
commit 1c694e433d
2 changed files with 6 additions and 13 deletions

View File

@ -248,20 +248,13 @@ inline T KillFirstBit(T value)
* @return the number of bits.
*/
template <typename T>
inline uint CountBits(T value)
constexpr uint CountBits(T value)
{
uint num;
/* This loop is only called once for every bit set by clearing the lowest
* bit in each loop. The number of bits is therefore equal to the number of
* times the loop was called. It was found at the following website:
* http://graphics.stanford.edu/~seander/bithacks.html */
for (num = 0; value != 0; num++) {
value &= (T)(value - 1);
if constexpr (std::is_enum_v<T>) {
return std::popcount<std::underlying_type_t<T>>(value);
} else {
return std::popcount(value);
}
return num;
}
/**

View File

@ -126,7 +126,7 @@
std::string text = question->GetEncodedText();
EnforcePreconditionEncodedText(false, text);
uint min_buttons = (type == QT_QUESTION ? 1 : 0);
EnforcePrecondition(false, CountBits(buttons) >= min_buttons && CountBits(buttons) <= 3);
EnforcePrecondition(false, CountBits<uint64_t>(buttons) >= min_buttons && CountBits<uint64_t>(buttons) <= 3);
EnforcePrecondition(false, buttons >= 0 && buttons < (1 << ::GOAL_QUESTION_BUTTON_COUNT));
EnforcePrecondition(false, (int)type < ::GQT_END);
EnforcePrecondition(false, uniqueid >= 0 && uniqueid <= UINT16_MAX);