- unsigned long unit_number = pos / BS_UNIT_SIZE_BITS;
- unsigned long bit_in_unit = pos & BS_UNIT_MASK;
- unsigned long in_unit_mask = (1 << bit_in_unit) - 1;
+ bitset_pos_t unit_number = pos / BS_UNIT_SIZE_BITS;
+ bitset_pos_t res;
+
+ if(pos >= bs->size)
+ return -1;
+
+ {
+ bitset_pos_t bit_in_unit = pos & BS_UNIT_MASK;
+ bitset_pos_t in_unit_mask = (1 << bit_in_unit) - 1;
+
+ /*
+ * Mask out the bits smaller than pos in the current unit.
+ * We are only interested in bits set higher than pos.
+ */
+ bitset_unit_t curr_unit = bs->data[unit_number];
+
+ /*
+ * Find the next bit set in the unit.
+ * Mind that this function returns 0, if the unit is -1 and
+ * counts the bits from 1 on.
+ */
+ bitset_pos_t next_in_this_unit =
+ _bitset_inside_ntz_value((set ? curr_unit : ~curr_unit) & ~in_unit_mask);
+
+ /* If there is a bit set in the current unit, exit. */
+ if (next_in_this_unit < BS_UNIT_SIZE_BITS) {
+ res = next_in_this_unit + unit_number * BS_UNIT_SIZE_BITS;
+ return res < bs->size ? res : -1;
+ }