DoxigAlpha

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;
        },
    }
}