summaryrefslogtreecommitdiff
path: root/src/macros.h
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2007-09-01 08:31:36 +0000
committerrubidium <rubidium@openttd.org>2007-09-01 08:31:36 +0000
commit56ab253307c128cd99342ab1b6809e02b3fe9dcc (patch)
tree6358623fdcb900c9c4bcb968c9388b48c33f1cb5 /src/macros.h
parent0df355bbda0e97edb0c642188db663620dd2e4f6 (diff)
downloadopenttd-56ab253307c128cd99342ab1b6809e02b3fe9dcc.tar.xz
(svn r11031) -Codechange: reduce the amount of duplication of bit counting functions. Based on patches by skidd13, SmatZ and Belugas.
Diffstat (limited to 'src/macros.h')
-rw-r--r--src/macros.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/macros.h b/src/macros.h
index e7944661a..4ff23c1df 100644
--- a/src/macros.h
+++ b/src/macros.h
@@ -421,6 +421,28 @@ static inline int KillFirstBit2x64(int value)
}
/**
+ * Counts the number of set bits in a variable.
+ *
+ * @param value the value to count the number of bits in.
+ * @return the number of bits.
+ */
+template<typename T> static inline 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);
+ }
+
+ return num;
+}
+
+/**
* Returns true if value a has only one bit set to 1
*
* This macro returns true if only one bit is set.