void RleDecoderV1::next()

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;
      }
    }
  }
}