in src/main/java/org/apache/commons/collections4/bloomfilter/SparseBloomFilter.java [151:186]
public boolean forEachBitMap(final LongPredicate consumer) {
Objects.requireNonNull(consumer, "consumer");
final int limit = BitMap.numberOfBitMaps(shape.getNumberOfBits());
/*
* because our indices are always in order we can shorten the time necessary to
* create the longs for the consumer
*/
// the currently constructed bitMap
long bitMap = 0;
// the bitmap we are working on
int idx = 0;
for (final int i : indices) {
while (BitMap.getLongIndex(i) != idx) {
if (!consumer.test(bitMap)) {
return false;
}
bitMap = 0;
idx++;
}
bitMap |= BitMap.getLongBit(i);
}
// we fall through with data in the bitMap
if (!consumer.test(bitMap)) {
return false;
}
// account for hte bitMap in the previous block + the next one
idx++;
// while there are more blocks to generate send zero to the consumer.
while (idx < limit) {
if (!consumer.test(0L)) {
return false;
}
idx++;
}
return true;
}