| 100 | LevelDecoder::~LevelDecoder() = default; |
| 101 | |
| 102 | int LevelDecoder::SetData(Encoding::type encoding, int16_t max_level, |
| 103 | int num_buffered_values, const uint8_t* data, |
| 104 | int32_t data_size) { |
| 105 | max_level_ = max_level; |
| 106 | int32_t num_bytes = 0; |
| 107 | encoding_ = encoding; |
| 108 | num_values_remaining_ = num_buffered_values; |
| 109 | bit_width_ = bit_util::Log2(max_level + 1); |
| 110 | switch (encoding) { |
| 111 | case Encoding::RLE: { |
| 112 | if (data_size < 4) { |
| 113 | throw ParquetException("Received invalid levels (corrupt data page?)"); |
| 114 | } |
| 115 | num_bytes = ::arrow::util::SafeLoadAs<int32_t>(data); |
| 116 | if (num_bytes < 0 || num_bytes > data_size - 4) { |
| 117 | throw ParquetException("Received invalid number of bytes (corrupt data page?)"); |
| 118 | } |
| 119 | const uint8_t* decoder_data = data + 4; |
| 120 | if (!rle_decoder_) { |
| 121 | rle_decoder_ = std::make_unique<::arrow::util::RleBitPackedDecoder<int16_t>>( |
| 122 | decoder_data, num_bytes, bit_width_); |
| 123 | } else { |
| 124 | rle_decoder_->Reset(decoder_data, num_bytes, bit_width_); |
| 125 | } |
| 126 | return 4 + num_bytes; |
| 127 | } |
| 128 | case Encoding::BIT_PACKED: { |
| 129 | int num_bits = 0; |
| 130 | if (MultiplyWithOverflow(num_buffered_values, bit_width_, &num_bits)) { |
| 131 | throw ParquetException( |
| 132 | "Number of buffered values too large (corrupt data page?)"); |
| 133 | } |
| 134 | num_bytes = static_cast<int32_t>(bit_util::BytesForBits(num_bits)); |
| 135 | if (num_bytes < 0 || num_bytes > data_size) { |
| 136 | throw ParquetException("Received invalid number of bytes (corrupt data page?)"); |
| 137 | } |
| 138 | if (!bit_packed_decoder_) { |
| 139 | bit_packed_decoder_ = |
| 140 | std::make_unique<::arrow::bit_util::BitReader>(data, num_bytes); |
| 141 | } else { |
| 142 | bit_packed_decoder_->Reset(data, num_bytes); |
| 143 | } |
| 144 | return num_bytes; |
| 145 | } |
| 146 | default: |
| 147 | throw ParquetException("Unknown encoding type for levels."); |
| 148 | } |
| 149 | return -1; |
| 150 | } |
| 151 | |
| 152 | void LevelDecoder::SetDataV2(int32_t num_bytes, int16_t max_level, |
| 153 | int num_buffered_values, const uint8_t* data) { |
no test coverage detected