in velox/dwio/dwrf/common/RLEv1.cpp [102:200]
void RleDecoderV1<isSigned>::next(
int64_t* const data,
const uint64_t numValues,
const uint64_t* const nulls) {
uint64_t position = 0;
// skipNulls()
if (nulls) {
// Skip over null values.
while (position < numValues && bits::isBitNull(nulls, position)) {
++position;
}
}
while (position < numValues) {
// If we are out of values, read more.
if (remainingValues == 0) {
readHeader();
}
// How many do we read out of this block?
uint64_t count = std::min(numValues - position, remainingValues);
uint64_t consumed = 0;
if (repeating) {
if (nulls) {
for (uint64_t i = 0; i < count; ++i) {
if (!bits::isBitNull(nulls, position + i)) {
data[position + i] = value + static_cast<int64_t>(consumed) * delta;
consumed += 1;
}
}
} else {
for (uint64_t i = 0; i < count; ++i) {
data[position + i] = value + static_cast<int64_t>(i) * delta;
}
consumed = count;
}
value += static_cast<int64_t>(consumed) * delta;
} else {
int64_t* datap = data + position;
int64_t* const datapEnd = datap + count;
if (nulls) {
int32_t idx = position;
if (!IntDecoder<isSigned>::useVInts) {
while (datap != datapEnd) {
if (LIKELY(!bits::isBitNull(nulls, idx++))) {
*(datap++) = IntDecoder<isSigned>::readLongLE();
++consumed;
} else {
*(datap++) = 0;
}
}
} else if constexpr (isSigned) {
while (datap != datapEnd) {
if (LIKELY(!bits::isBitNull(nulls, idx++))) {
*(datap++) = IntDecoder<isSigned>::readVsLong();
++consumed;
} else {
*(datap++) = 0;
}
}
} else {
while (datap != datapEnd) {
if (LIKELY(!bits::isBitNull(nulls, idx++))) {
*(datap++) =
static_cast<int64_t>(IntDecoder<isSigned>::readVuLong());
++consumed;
} else {
*(datap++) = 0;
}
}
}
} else {
if (!IntDecoder<isSigned>::useVInts) {
while (datap != datapEnd) {
*(datap++) = IntDecoder<isSigned>::readLongLE();
}
} else if constexpr (isSigned) {
while (datap != datapEnd) {
*(datap++) = IntDecoder<isSigned>::readVsLong();
}
} else {
while (datap != datapEnd) {
*(datap++) =
static_cast<int64_t>(IntDecoder<isSigned>::readVuLong());
}
}
consumed = count;
}
}
remainingValues -= consumed;
position += count;
// skipNulls()
if (nulls) {
// Skip over null values.
while (position < numValues && bits::isBitNull(nulls, position)) {
++position;
}
}
}
}