diff options
Diffstat (limited to 'src/util/bitset.h')
| -rw-r--r-- | src/util/bitset.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/util/bitset.h b/src/util/bitset.h index d5abb6c1f7c..8f6979881bd 100644 --- a/src/util/bitset.h +++ b/src/util/bitset.h @@ -350,9 +350,25 @@ __bitset_last_bit(const BITSET_WORD *x, int n) return 0; } +/* Get the last bit set in a bitset before last_bit. + */ +static inline int +__bitset_last_bit_before(const BITSET_WORD *x, int last_bit) +{ + int n = last_bit / BITSET_WORDBITS; + int reminder = last_bit % BITSET_WORDBITS; + if (reminder) { + BITSET_WORD last = x[n] & BITFIELD_MASK(reminder); + if (last) + return util_last_bit(last) + n * BITSET_WORDBITS; + } + return __bitset_last_bit(x, n); +} + #define BITSET_FFS(x) __bitset_ffs(x, ARRAY_SIZE(x)) #define BITSET_LAST_BIT(x) __bitset_last_bit(x, ARRAY_SIZE(x)) #define BITSET_LAST_BIT_SIZED(x, size) __bitset_last_bit(x, size) +#define BITSET_LAST_BIT_BEFORE(x, last_bit) __bitset_last_bit_before(x, last_bit) #define BITSET_IS_EMPTY(x) __bitset_is_empty(x, ARRAY_SIZE(x)) static inline unsigned |