DoxigAlpha

SingleWordIterator

Fields of this type

Fields

#

Returns the index of the next unvisited set bit

Functions

#
next
Returns the index of the next unvisited set bit

Source

Implementation

#
fn SingleWordIterator(comptime direction: IteratorOptions.Direction) type {
    return struct {
        const IterSelf = @This();
        // all bits which have not yet been iterated over
        bits_remain: MaskInt,

        /// Returns the index of the next unvisited set bit
        /// in the bit set, in ascending order.
        pub fn next(self: *IterSelf) ?usize {
            if (self.bits_remain == 0) return null;

            switch (direction) {
                .forward => {
                    const next_index = @ctz(self.bits_remain);
                    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;
                    self.bits_remain &= (@as(MaskInt, 1) << @as(ShiftInt, @intCast(top_bit))) - 1;
                    return top_bit;
                },
            }
        }
    };
}