next
Returns the index of the next unvisited set bit in the bit set, in ascending order.
Function parameters
Parameters
- self:*Self
A bit set with runtime-known size, backed by an allocated slice
Types
- DynamicBitSetUnmanaged
- A bit set with runtime-known size, backed by an allocated slice
- DynamicBitSet
- A bit set with runtime-known size, backed by an allocated slice
- IteratorOptions
- Options for configuring an iterator over a bit set
- Range
- A range of indices within a bitset.
Returns the optimal static bit set type for the specified number
Functions
- StaticBitSet
- Returns the optimal static bit set type for the specified number
- IntegerBitSet
- A bit set with static size, which is backed by a single integer.
- ArrayBitSet
- A bit set with static size, which is backed by an array of usize.
Source
Implementation
pub fn next(self: *Self) ?usize {
while (self.bits_remain == 0) {
if (self.words_remain.len == 0) return null;
self.nextWord(false);
switch (direction) {
.forward => self.bit_offset += @bitSizeOf(MaskInt),
.reverse => self.bit_offset -= @bitSizeOf(MaskInt),
}
}
switch (direction) {
.forward => {
const next_index = @ctz(self.bits_remain) + self.bit_offset;
self.bits_remain &= self.bits_remain - 1;
return next_index;
},
.reverse => {
const leading_zeroes = @clz(self.bits_remain);
const top_bit = (@bitSizeOf(MaskInt) - 1) - leading_zeroes;
const no_top_bit_mask = (@as(MaskInt, 1) << @as(ShiftInt, @intCast(top_bit))) - 1;
self.bits_remain &= no_top_bit_mask;
return top_bit + self.bit_offset;
},
}
}