From: Akim Demaille Date: Sun, 29 Nov 2020 16:04:14 +0000 (+0100) Subject: bitset: use integer_length in list implementation X-Git-Tag: v1.0~3452 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=d5db0bb5237cfcf3bf0712dc8ba1d66e230c513d;p=gnulib.git bitset: use integer_length in list implementation * lib/bitset/list.c (lbitset_list_reverse): Use BITSET_FOR_EACH_BIT_REVERSE. --- diff --git a/ChangeLog b/ChangeLog index b03ea1cd77..8fc0e65d46 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2020-11-29 Akim Demaille + + bitset: use integer_length in list implementation + * lib/bitset/list.c (lbitset_list_reverse): Use + BITSET_FOR_EACH_BIT_REVERSE. + 2020-11-29 Akim Demaille bitset: use integer_length in vector implementation diff --git a/lib/bitset/list.c b/lib/bitset/list.c index e931fe1cae..9a5d482823 100644 --- a/lib/bitset/list.c +++ b/lib/bitset/list.c @@ -604,25 +604,23 @@ lbitset_list_reverse (bitset bset, bitset_bindex *list, bitset_word *srcp = elt->words; for (; (windex - elt->index) < LBITSET_ELT_WORDS; - windex--, bitoff -= BITSET_WORD_BITS, - bitcnt = BITSET_WORD_BITS - 1) + windex--) { - bitset_word word = - srcp[windex - elt->index] << (BITSET_WORD_BITS - 1 - bitcnt); - - for (; word; bitcnt--) + bitset_word word = srcp[windex - elt->index]; + 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; } elt = elt->prev;