polars_arrow/array/growable/
fixed_binary.rs1use std::sync::Arc;
2
3use super::Growable;
4use crate::array::growable::utils::{extend_validity, prepare_validity};
5use crate::array::{Array, FixedSizeBinaryArray};
6use crate::bitmap::BitmapBuilder;
7
8pub struct GrowableFixedSizeBinary<'a> {
10 arrays: Vec<&'a FixedSizeBinaryArray>,
11 validity: Option<BitmapBuilder>,
12 values: Vec<u8>,
13 size: usize, }
15
16impl<'a> GrowableFixedSizeBinary<'a> {
17 pub fn new(
21 arrays: Vec<&'a FixedSizeBinaryArray>,
22 mut use_validity: bool,
23 capacity: usize,
24 ) -> Self {
25 if arrays.iter().any(|array| array.null_count() > 0) {
28 use_validity = true;
29 };
30
31 let size = FixedSizeBinaryArray::get_size(arrays[0].dtype());
32 Self {
33 arrays,
34 values: Vec::with_capacity(0),
35 validity: prepare_validity(use_validity, capacity),
36 size,
37 }
38 }
39
40 fn to(&mut self) -> FixedSizeBinaryArray {
41 let validity = std::mem::take(&mut self.validity);
42 let values = std::mem::take(&mut self.values);
43
44 FixedSizeBinaryArray::new(
45 self.arrays[0].dtype().clone(),
46 values.into(),
47 validity.map(|v| v.freeze()),
48 )
49 }
50}
51
52impl<'a> Growable<'a> for GrowableFixedSizeBinary<'a> {
53 unsafe fn extend(&mut self, index: usize, start: usize, len: usize) {
54 let array = *self.arrays.get_unchecked(index);
55 extend_validity(&mut self.validity, array, start, len);
56
57 let values = array.values();
58
59 self.values.extend_from_slice(
60 values.get_unchecked(start * self.size..start * self.size + len * self.size),
61 );
62 }
63
64 fn extend_validity(&mut self, additional: usize) {
65 self.values
66 .extend_from_slice(&vec![0; self.size * additional]);
67 if let Some(validity) = &mut self.validity {
68 validity.extend_constant(additional, false);
69 }
70 }
71
72 #[inline]
73 fn len(&self) -> usize {
74 self.values.len() / self.size
75 }
76
77 fn as_arc(&mut self) -> Arc<dyn Array> {
78 Arc::new(self.to())
79 }
80
81 fn as_box(&mut self) -> Box<dyn Array> {
82 Box::new(self.to())
83 }
84}
85
86impl<'a> From<GrowableFixedSizeBinary<'a>> for FixedSizeBinaryArray {
87 fn from(val: GrowableFixedSizeBinary<'a>) -> Self {
88 FixedSizeBinaryArray::new(
89 val.arrays[0].dtype().clone(),
90 val.values.into(),
91 val.validity.map(|v| v.freeze()),
92 )
93 }
94}