vortex_array/arrays/bool/
patch.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use itertools::Itertools;
5use vortex_dtype::match_each_unsigned_integer_ptype;
6
7use crate::ToCanonical;
8use crate::arrays::BoolArray;
9use crate::patches::Patches;
10use crate::vtable::ValidityHelper;
11
12impl BoolArray {
13    pub fn patch(self, patches: &Patches) -> Self {
14        let len = self.len();
15        let offset = patches.offset();
16        let indices = patches.indices().to_primitive();
17        let values = patches.values().to_bool();
18
19        let patched_validity =
20            self.validity()
21                .clone()
22                .patch(len, offset, indices.as_ref(), values.validity());
23
24        let mut own_values = self.into_bit_buffer().into_mut();
25        match_each_unsigned_integer_ptype!(indices.ptype(), |I| {
26            for (idx, value) in indices
27                .as_slice::<I>()
28                .iter()
29                .zip_eq(values.bit_buffer().iter())
30            {
31                #[allow(clippy::cast_possible_truncation)]
32                own_values.set_to(*idx as usize - offset, value);
33            }
34        });
35
36        Self::from_bit_buffer(own_values.freeze(), patched_validity)
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use vortex_buffer::BitBuffer;
43
44    use crate::ToCanonical;
45    use crate::arrays::BoolArray;
46
47    #[test]
48    fn patch_sliced_bools() {
49        let arr = BoolArray::from(BitBuffer::new_set(12));
50        let sliced = arr.slice(4..12);
51        let values = sliced.to_bool().into_bit_buffer().into_mut();
52        assert_eq!(values.len(), 8);
53        assert_eq!(values.as_slice(), &[255, 255]);
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);
60        let values = sliced.to_bool().into_bit_buffer().into_mut();
61        assert_eq!(values.len(), 11);
62        assert_eq!(values.as_slice(), &[255, 255]);
63    }
64}