vortex_array/arrays/bool/
patch.rs1use itertools::Itertools;
5use vortex_dtype::match_each_unsigned_integer_ptype;
6use vortex_error::VortexResult;
7
8use crate::ToCanonical;
9use crate::arrays::BoolArray;
10use crate::patches::Patches;
11use crate::vtable::ValidityHelper;
12
13impl BoolArray {
14 pub fn patch(self, patches: &Patches) -> VortexResult<Self> {
15 let len = self.len();
16 let offset = patches.offset();
17 let indices = patches.indices().to_primitive();
18 let values = patches.values().to_bool();
19
20 let patched_validity =
21 self.validity()
22 .clone()
23 .patch(len, offset, indices.as_ref(), values.validity())?;
24
25 let mut own_values = self.into_bit_buffer().into_mut();
26 match_each_unsigned_integer_ptype!(indices.ptype(), |I| {
27 for (idx, value) in indices
28 .as_slice::<I>()
29 .iter()
30 .zip_eq(values.to_bit_buffer().iter())
31 {
32 #[allow(clippy::cast_possible_truncation)]
33 own_values.set_to(*idx as usize - offset, value);
34 }
35 });
36
37 Ok(Self::new(own_values.freeze(), patched_validity))
38 }
39}
40
41#[cfg(test)]
42mod tests {
43 use vortex_buffer::BitBuffer;
44
45 use crate::arrays::BoolArray;
46 use crate::assert_arrays_eq;
47
48 #[test]
49 fn patch_sliced_bools() {
50 let arr = BoolArray::from(BitBuffer::new_set(12));
51 let sliced = arr.slice(4..12).unwrap();
52 let expected = BoolArray::from_iter([true; 8]);
53 assert_arrays_eq!(sliced, expected);
54 }
55
56 #[test]
57 fn patch_sliced_bools_offset() {
58 let arr = BoolArray::from(BitBuffer::new_set(15));
59 let sliced = arr.slice(4..15).unwrap();
60 let expected = BoolArray::from_iter([true; 11]);
61 assert_arrays_eq!(sliced, expected);
62 }
63}