| 410 | |
| 411 | template <typename T> |
| 412 | void TestRleBitPackedParser(std::vector<uint8_t> bytes, rle_size_t bit_width, |
| 413 | std::vector<T> expected) { |
| 414 | auto parser = |
| 415 | RleBitPackedParser(bytes.data(), static_cast<rle_size_t>(bytes.size()), bit_width); |
| 416 | EXPECT_FALSE(parser.exhausted()); |
| 417 | |
| 418 | // Try to decode all data of all runs in the decoded vector |
| 419 | decltype(expected) decoded = {}; |
| 420 | auto rle_decoder = RleRunDecoder<T>(); |
| 421 | auto bit_packed_decoder = BitPackedRunDecoder<T>(); |
| 422 | |
| 423 | struct { |
| 424 | decltype(rle_decoder)* rle_decoder_ptr_; |
| 425 | decltype(bit_packed_decoder)* bit_packed_decoder_ptr_; |
| 426 | decltype(decoded)* decoded_ptr_; |
| 427 | decltype(bit_width) bit_width_; |
| 428 | |
| 429 | auto OnRleRun(RleRun run) { |
| 430 | rle_decoder_ptr_->Reset(run, bit_width_); |
| 431 | |
| 432 | const auto n_decoded = decoded_ptr_->size(); |
| 433 | const auto n_to_decode = rle_decoder_ptr_->remaining(); |
| 434 | decoded_ptr_->resize(n_decoded + n_to_decode); |
| 435 | EXPECT_EQ(rle_decoder_ptr_->GetBatch(decoded_ptr_->data() + n_decoded, n_to_decode, |
| 436 | bit_width_), |
| 437 | n_to_decode); |
| 438 | EXPECT_EQ(rle_decoder_ptr_->remaining(), 0); |
| 439 | |
| 440 | return RleBitPackedParser::ControlFlow::Continue; |
| 441 | } |
| 442 | |
| 443 | auto OnBitPackedRun(BitPackedRun run) { |
| 444 | bit_packed_decoder_ptr_->Reset(run, bit_width_); |
| 445 | |
| 446 | const auto n_decoded = decoded_ptr_->size(); |
| 447 | const auto n_to_decode = bit_packed_decoder_ptr_->remaining(); |
| 448 | decoded_ptr_->resize(n_decoded + n_to_decode); |
| 449 | EXPECT_EQ(bit_packed_decoder_ptr_->GetBatch(decoded_ptr_->data() + n_decoded, |
| 450 | n_to_decode, bit_width_), |
| 451 | n_to_decode); |
| 452 | EXPECT_EQ(bit_packed_decoder_ptr_->remaining(), 0); |
| 453 | |
| 454 | return RleBitPackedParser::ControlFlow::Continue; |
| 455 | } |
| 456 | } handler{&rle_decoder, &bit_packed_decoder, &decoded, bit_width}; |
| 457 | |
| 458 | // Iterate over all runs |
| 459 | parser.Parse(handler); |
| 460 | |
| 461 | EXPECT_TRUE(parser.exhausted()); |
| 462 | EXPECT_EQ(decoded.size(), expected.size()); |
| 463 | EXPECT_EQ(decoded, expected); |
| 464 | } |
| 465 | |
| 466 | void TestRleBitPackedParserError(std::span<const uint8_t> bytes, rle_size_t bit_width) { |
| 467 | auto parser = |
nothing calls this directly
no test coverage detected