math utils: Add utilities to scan bit and clear it
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 15 Dec 2017 15:41:31 +0000 (16:41 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Fri, 15 Dec 2017 15:54:28 +0000 (16:54 +0100)
source/blender/blenlib/BLI_math_bits.h
source/blender/blenlib/intern/math_bits_inline.c

index 248b615e3f8f252c1b88e80b181df7d96c1d1ea5..86213dc271f0cf934b3cd873e89fb3a1e83be984 100644 (file)
@@ -35,10 +35,18 @@ extern "C" {
 MINLINE int bitscan_forward_i(int a);
 MINLINE unsigned int bitscan_forward_uint(unsigned int a);
 
+/* Similar to above, but also clears the bit. */
+MINLINE int bitscan_forward_clear_i(int *a);
+MINLINE unsigned int bitscan_forward_clear_uint(unsigned int *a);
+
 /* Search the value from MSB to LSB for a set bit. Returns index of this bit. */
 MINLINE int bitscan_reverse_i(int a);
 MINLINE unsigned int bitscan_reverse_uint(unsigned int a);
 
+/* Similar to above, but also clears the bit. */
+MINLINE int bitscan_reverse_clear_i(int *a);
+MINLINE unsigned int bitscan_reverse_clear_uint(unsigned int *a);
+
 /* NOTE: Those functions returns 2 to the power of index of highest order bit. */
 MINLINE unsigned int highest_order_bit_uint(unsigned int n);
 MINLINE unsigned short highest_order_bit_s(unsigned short n);
index e967ecbb3a3c2da73f39b9feb345ec58f9102b75..d96cf969dae6c933e00d56a60cd979fc39a8611b 100644 (file)
@@ -44,6 +44,18 @@ MINLINE unsigned int bitscan_forward_uint(unsigned int a)
        return (unsigned int)bitscan_forward_i((int)a);
 }
 
+MINLINE int bitscan_forward_clear_i(int *a)
+{
+       int i = bitscan_forward_i(*a);
+       *a &= (*a) - 1;
+       return i;
+}
+
+MINLINE unsigned int bitscan_forward_clear_uint(unsigned int *a)
+{
+       return (unsigned int)bitscan_forward_clear_i((int *)a);
+}
+
 MINLINE int bitscan_reverse_i(int a)
 {
        BLI_assert(a != 0);
@@ -61,6 +73,19 @@ MINLINE unsigned int bitscan_reverse_uint(unsigned int a)
        return (unsigned int)bitscan_reverse_i((int)a);
 }
 
+MINLINE int bitscan_reverse_clear_i(int *a)
+{
+       int i = bitscan_reverse_i(*a);
+       /* TODO(sergey): This could probably be optimized. */
+       *a &= ~(1 << (sizeof(int) * 8 - i - 1));
+       return i;
+}
+
+MINLINE unsigned int bitscan_reverse_clear_uint(unsigned int *a)
+{
+       return (unsigned int)bitscan_reverse_clear_i((int *)a);
+}
+
 MINLINE unsigned int highest_order_bit_uint(unsigned int n)
 {
        if (n == 0) {