in processing/src/main/java/org/apache/druid/extendedset/intset/ImmutableConciseSet.java [281:340]
private static void addAndCompact(IntList set, int wordToAdd)
{
int length = set.length();
if (set.isEmpty()) {
set.add(wordToAdd);
return;
}
int last = set.get(length - 1);
int newWord = 0;
if (ConciseSetUtils.isLiteral(last)) {
if (ConciseSetUtils.isLiteralWithSingleOneBit(last)) {
int position = Integer.numberOfTrailingZeros(last) + 1;
if (ConciseSetUtils.isAllZerosLiteral(wordToAdd)) {
newWord = 0x00000001 | (position << 25);
} else if (ConciseSetUtils.isZeroSequence(wordToAdd) && ConciseSetUtils.getFlippedBit(wordToAdd) == -1) {
newWord = (wordToAdd + 1) | (position << 25);
}
} else if (ConciseSetUtils.isAllZerosLiteral(last)) {
if (ConciseSetUtils.isAllZerosLiteral(wordToAdd)) {
newWord = 0x00000001;
} else if (ConciseSetUtils.isZeroSequence(wordToAdd) && ConciseSetUtils.getFlippedBit(wordToAdd) == -1) {
newWord = wordToAdd + 1;
}
} else if (ConciseSetUtils.isLiteralWithSingleZeroBit(last)) {
int position = Integer.numberOfTrailingZeros(~last) + 1;
if (ConciseSetUtils.isAllOnesLiteral(wordToAdd)) {
newWord = 0x40000001 | (position << 25);
} else if (ConciseSetUtils.isOneSequence(wordToAdd) && ConciseSetUtils.getFlippedBit(wordToAdd) == -1) {
newWord = (wordToAdd + 1) | (position << 25);
}
} else if (ConciseSetUtils.isAllOnesLiteral(last)) {
if (ConciseSetUtils.isAllOnesLiteral(wordToAdd)) {
newWord = 0x40000001;
} else if (ConciseSetUtils.isOneSequence(wordToAdd) && ConciseSetUtils.getFlippedBit(wordToAdd) == -1) {
newWord = wordToAdd + 1;
}
}
} else if (ConciseSetUtils.isZeroSequence(last)) {
if (ConciseSetUtils.isAllZerosLiteral(wordToAdd)) {
newWord = last + 1;
} else if (ConciseSetUtils.isZeroSequence(wordToAdd) && ConciseSetUtils.getFlippedBit(wordToAdd) == -1) {
newWord = last + ConciseSetUtils.getSequenceNumWords(wordToAdd);
}
} else {
assert ConciseSetUtils.isOneSequence(last);
if (ConciseSetUtils.isAllOnesLiteral(wordToAdd)) {
newWord = last + 1;
} else if (ConciseSetUtils.isOneSequence(wordToAdd) && ConciseSetUtils.getFlippedBit(wordToAdd) == -1) {
newWord = last + ConciseSetUtils.getSequenceNumWords(wordToAdd);
}
}
if (newWord != 0) {
set.set(length - 1, newWord);
} else {
set.add(wordToAdd);
}
}