* lib/bitset/table.c (tbitset_list_reverse): Use BITSET_FOR_EACH_BIT_REVERSE. --- ChangeLog | 6 ++++++ lib/bitset/table.c | 19 +++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/ChangeLog b/ChangeLog index c0013145d..b7c97e437 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2020-11-29 Akim Demaille <[email protected]> + + bitset: use integrer_length in table implementation + * lib/bitset/table.c (tbitset_list_reverse): Use + BITSET_FOR_EACH_BIT_REVERSE. + 2020-11-29 Akim Demaille <[email protected]> bitset: use integrer_length in list implementation diff --git a/lib/bitset/table.c b/lib/bitset/table.c index 48c88e02b..16781958a 100644 --- a/lib/bitset/table.c +++ b/lib/bitset/table.c @@ -562,19 +562,18 @@ tbitset_list_reverse (bitset bset, bitset_bindex *list, do { - for (bitset_word word = srcp[woffset] << (BITSET_WORD_BITS - 1 - bitcnt); - word; bitcnt--) + bitset_word word = srcp[woffset]; + if (bitcnt + 1 < BITSET_WORD_BITS) + /* We're starting in the middle of a word: smash bits to ignore. */ + word &= ((bitset_word) 1 << (bitcnt + 1)) - 1; + BITSET_FOR_EACH_BIT_REVERSE(pos, word) { - if (word & BITSET_MSB) + list[count++] = bitoff + pos; + if (count >= num) { - list[count++] = bitoff + bitcnt; - if (count >= num) - { - *next = n_bits - (bitoff + bitcnt); - return count; - } + *next = n_bits - (bitoff + pos); + return count; } - word <<= 1; } bitoff -= BITSET_WORD_BITS; bitcnt = BITSET_WORD_BITS - 1; -- 2.29.2
