]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/bitops.h
Doc: Documented growing arrays, generic allocators and related things
[libucw.git] / ucw / bitops.h
index c1e6371027a5d39e6fef6dca8883af6e8f922280..ffc788c5f1b60f58d230f6593893d0a989a00071 100644 (file)
@@ -2,6 +2,7 @@
  *     UCW Library -- Bit Operations
  *
  *     (c) 2005 Martin Mares <mj@ucw.cz>
+ *     (c) 2012 Pavel Charvat <pchar@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
 #ifndef _UCW_BITOPS_H
 #define _UCW_BITOPS_H
 
+#ifdef CONFIG_UCW_CLEAN_ABI
+#define bit_fls ucw_bit_fls
+#define ffs_table ucw_ffs_table
+#endif
+
 /* Find highest bit set (i.e., the floor of the binary logarithm) (bit-fls.c) */
 
 int bit_fls(u32 x);            /* bit_fls(0)=-1 */
@@ -37,4 +43,28 @@ static inline uns bit_ffs(uns w)
 
 #endif
 
+/* Count the number of bits set */
+
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+
+static inline uns bit_count(uns w)
+{
+  return __builtin_popcount(w);
+}
+
+#else
+
+static inline uns bit_count(uns w)
+{
+  uns n = 0;
+  while (w)
+    {
+      w &= w - 1;
+      n++;
+    }
+  return n;
+}
+
+#endif
+
 #endif