vppinfra: add few uword_bitmap_* functions 62/42362/2
authorDamjan Marion <[email protected]>
Thu, 13 Feb 2025 14:37:13 +0000 (14:37 +0000)
committerDamjan Marion <[email protected]>
Thu, 13 Feb 2025 22:32:46 +0000 (23:32 +0100)
Change-Id: I592668a385489d0eaccd9e7693121ff25090e353
Type: improvement
Signed-off-by: Damjan Marion <[email protected]>
src/vppinfra/bitops.h

index c1122f5..bf73bd9 100644 (file)
@@ -195,6 +195,13 @@ next_with_same_number_of_set_bits (uword x)
   return ripple | ones;
 }
 
+static_always_inline void
+uword_bitmap_clear (uword *bmp, uword n_uwords)
+{
+  while (n_uwords--)
+    bmp++[0] = 0;
+}
+
 #define foreach_set_bit_index(i, v)                                           \
   for (uword _tmp = (v) + 0 * (uword) (i = get_lowest_set_bit_index (v));     \
        _tmp;                                                                  \
@@ -273,6 +280,34 @@ uword_bitmap_find_first_set (uword *bmp)
   return (b - bmp) * uword_bits + get_lowest_set_bit_index (b[0]);
 }
 
+always_inline uword
+uword_bitmap_get_multiple (uword *bmp, uword i, uword n_bits)
+{
+  uword rv;
+
+  bmp += i / uword_bits;
+  i %= uword_bits;
+
+  rv = (bmp[0] >> i);
+  rv &= pow2_mask (n_bits);
+
+  if (i + n_bits <= uword_bits)
+    return rv;
+
+  n_bits -= uword_bits - i;
+  rv |= (bmp[1] & pow2_mask (n_bits)) << (uword_bits - i);
+
+  return rv;
+}
+
+always_inline uword
+uword_bitmap_get_multiple_no_check (uword *bmp, uword i, uword n_bits)
+{
+  bmp += i / uword_bits;
+  i %= uword_bits;
+  return ((bmp[0] >> i) & pow2_mask (n_bits));
+}
+
 static_always_inline u32
 bit_extract_u32 (u32 v, u32 mask)
 {