| 742 | |
| 743 | template <typename T> |
| 744 | inline int32_t RleBatchDecoder<T>::GetValues(int32_t num_values_to_consume, T* values) { |
| 745 | DCHECK_GT(num_values_to_consume, 0); |
| 746 | DCHECK(values != nullptr); |
| 747 | |
| 748 | int32_t num_consumed = 0; |
| 749 | while (num_consumed < num_values_to_consume) { |
| 750 | // Add RLE encoded values by repeating the current value this number of times. |
| 751 | int32_t num_repeats = NextNumRepeats(); |
| 752 | if (num_repeats > 0) { |
| 753 | int32_t num_repeats_to_set = |
| 754 | std::min(num_repeats, num_values_to_consume - num_consumed); |
| 755 | T repeated_value = GetRepeatedValue(num_repeats_to_set); |
| 756 | for (int i = 0; i < num_repeats_to_set; ++i) { |
| 757 | values[num_consumed + i] = repeated_value; |
| 758 | } |
| 759 | num_consumed += num_repeats_to_set; |
| 760 | continue; |
| 761 | } |
| 762 | |
| 763 | // Add remaining literal values, if any. |
| 764 | int32_t num_literals = NextNumLiterals(); |
| 765 | if (num_literals == 0) break; |
| 766 | int32_t num_literals_to_set = |
| 767 | std::min(num_literals, num_values_to_consume - num_consumed); |
| 768 | if (!GetLiteralValues(num_literals_to_set, values + num_consumed)) { |
| 769 | return 0; |
| 770 | } |
| 771 | num_consumed += num_literals_to_set; |
| 772 | } |
| 773 | return num_consumed; |
| 774 | } |
| 775 | |
| 776 | template <typename T> |
| 777 | inline int32_t RleBatchDecoder<T>::SkipValues(int32_t num_values) { |