Changeset - r28512:cb7396c4e0bc
[Not reviewed]
master
0 2 0
Rubidium - 11 months ago 2024-01-18 20:45:42
rubidium@openttd.org
Codechange: use std::popcount instead of hand written loop
2 files changed with 6 insertions and 13 deletions:
0 comments (0 inline, 0 general)
src/core/bitmath_func.hpp
Show inline comments
 
@@ -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;
 
}
 

	
 
/**
src/script/api/script_goal.cpp
Show inline comments
 
@@ -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);
0 comments (0 inline, 0 general)