use crate::arrow::buffer::bit_util::iter_set_bits_rev;
pub trait ValuesBuffer: Default {
fn pad_nulls(
&mut self,
read_offset: usize,
values_read: usize,
levels_read: usize,
valid_mask: &[u8],
);
}
impl<T: Copy + Default> ValuesBuffer for Vec<T> {
fn pad_nulls(
&mut self,
read_offset: usize,
values_read: usize,
levels_read: usize,
valid_mask: &[u8],
) {
self.resize(read_offset + levels_read, T::default());
let values_range = read_offset..read_offset + values_read;
for (value_pos, level_pos) in values_range.rev().zip(iter_set_bits_rev(valid_mask)) {
debug_assert!(level_pos >= value_pos);
if level_pos <= value_pos {
break;
}
self[level_pos] = self[value_pos];
}
}
}