arrow2/array/growable/
utils.rs

1use crate::{array::Array, bitmap::MutableBitmap, offset::Offset};
2
3// function used to extend nulls from arrays. This function's lifetime is bound to the array
4// because it reads nulls from it.
5pub(super) type ExtendNullBits<'a> = Box<dyn Fn(&mut MutableBitmap, usize, usize) + 'a>;
6
7pub(super) fn build_extend_null_bits(array: &dyn Array, use_validity: bool) -> ExtendNullBits {
8    if let Some(bitmap) = array.validity() {
9        Box::new(move |validity, start, len| {
10            debug_assert!(start + len <= bitmap.len());
11            let (slice, offset, _) = bitmap.as_slice();
12            // safety: invariant offset + length <= slice.len()
13            unsafe {
14                validity.extend_from_slice_unchecked(slice, start + offset, len);
15            }
16        })
17    } else if use_validity {
18        Box::new(|validity, _, len| {
19            validity.extend_constant(len, true);
20        })
21    } else {
22        Box::new(|_, _, _| {})
23    }
24}
25
26#[inline]
27pub(super) fn extend_offset_values<O: Offset>(
28    buffer: &mut Vec<u8>,
29    offsets: &[O],
30    values: &[u8],
31    start: usize,
32    len: usize,
33) {
34    let start_values = offsets[start].to_usize();
35    let end_values = offsets[start + len].to_usize();
36    let new_values = &values[start_values..end_values];
37    buffer.extend_from_slice(new_values);
38}