narrow/arrow/
bitmap.rs

1//! Interop with [`arrow-rs`] null buffer for bitmaps.
2
3use crate::{Length, bitmap::Bitmap, buffer::BufferType};
4
5impl<Buffer: BufferType> From<Bitmap<Buffer>> for arrow_buffer::BooleanBuffer
6where
7    <Buffer as BufferType>::Buffer<u8>: Into<arrow_buffer::Buffer>,
8{
9    fn from(value: Bitmap<Buffer>) -> Self {
10        Self::new(value.buffer.into(), value.offset, value.bits)
11    }
12}
13
14impl<Buffer: BufferType> From<Bitmap<Buffer>> for arrow_buffer::NullBuffer
15where
16    arrow_buffer::BooleanBuffer: From<Bitmap<Buffer>>,
17{
18    fn from(value: Bitmap<Buffer>) -> Self {
19        Self::new(value.into())
20    }
21}
22
23impl<Buffer: BufferType> From<arrow_buffer::BooleanBuffer> for Bitmap<Buffer>
24where
25    <Buffer as BufferType>::Buffer<u8>: From<arrow_buffer::ScalarBuffer<u8>>,
26{
27    fn from(value: arrow_buffer::BooleanBuffer) -> Self {
28        let bits = value.len();
29        let offset = value.offset();
30        let buffer = value.into_inner();
31        let len = buffer.len();
32        Bitmap {
33            buffer: arrow_buffer::ScalarBuffer::new(buffer, 0, len).into(),
34            bits,
35            offset,
36        }
37    }
38}
39
40impl<Buffer: BufferType> From<arrow_buffer::NullBuffer> for Bitmap<Buffer>
41where
42    Bitmap<Buffer>: From<arrow_buffer::BooleanBuffer>,
43{
44    fn from(value: arrow_buffer::NullBuffer) -> Self {
45        Bitmap::from(value.into_inner())
46    }
47}
48
49impl<Buffer: BufferType> PartialEq<Bitmap<Buffer>> for arrow_buffer::BooleanBuffer {
50    fn eq(&self, other: &Bitmap<Buffer>) -> bool {
51        self.len() == other.len() && self.iter().zip(other).all(|(a, b)| a == b)
52    }
53}
54
55impl<Buffer: BufferType> PartialEq<Bitmap<Buffer>> for arrow_buffer::NullBuffer {
56    fn eq(&self, other: &Bitmap<Buffer>) -> bool {
57        self.inner().eq(other)
58    }
59}
60
61impl<Buffer: BufferType> PartialEq<arrow_buffer::BooleanBuffer> for Bitmap<Buffer> {
62    fn eq(&self, other: &arrow_buffer::BooleanBuffer) -> bool {
63        other.eq(self)
64    }
65}
66
67impl<Buffer: BufferType> PartialEq<arrow_buffer::NullBuffer> for Bitmap<Buffer> {
68    fn eq(&self, other: &arrow_buffer::NullBuffer) -> bool {
69        other.eq(self)
70    }
71}
72
73#[cfg(test)]
74mod test {
75    use crate::buffer::VecBuffer;
76
77    use super::*;
78
79    const INPUT: [bool; 5] = [true, false, true, false, true];
80
81    #[test]
82    fn convert() {
83        fn from<Buffer: BufferType>()
84        where
85            Bitmap<Buffer>: FromIterator<bool>
86                + Into<arrow_buffer::BooleanBuffer>
87                + Into<arrow_buffer::NullBuffer>,
88        {
89            let boolean_buffer: arrow_buffer::BooleanBuffer =
90                INPUT.into_iter().collect::<Bitmap<Buffer>>().into();
91            let null_buffer: arrow_buffer::NullBuffer =
92                INPUT.into_iter().collect::<Bitmap<Buffer>>().into();
93            let bitmap = INPUT.into_iter().collect::<Bitmap<Buffer>>();
94            assert_eq!(bitmap, boolean_buffer);
95            assert_eq!(bitmap, null_buffer);
96        }
97        fn into<Buffer: BufferType>()
98        where
99            Bitmap<Buffer>: From<arrow_buffer::BooleanBuffer> + From<arrow_buffer::NullBuffer>,
100        {
101            let boolean_buffer = INPUT.into_iter().collect::<arrow_buffer::BooleanBuffer>();
102            let null_buffer = INPUT.into_iter().collect::<arrow_buffer::NullBuffer>();
103            assert_eq!(
104                Bitmap::<Buffer>::from(boolean_buffer.clone()),
105                boolean_buffer
106            );
107            assert_eq!(Bitmap::<Buffer>::from(null_buffer.clone()), null_buffer);
108        }
109        from::<VecBuffer>();
110        // from::<ArcBuffer>(); missing Buffer from Arc<[u8]>
111        // from::<BoxBuffer>(); missing Buffer from Box<[u8]>
112        from::<crate::arrow::buffer::ScalarBuffer>();
113        from::<crate::arrow::buffer::BufferBuilder>();
114
115        into::<VecBuffer>();
116        // into::<ArcBuffer>(); missing ScalarBuffer<u8> from Arc<[u8]>
117        // into::<BoxBuffer>(); missing ScalarBuffer<u8> from Box<[u8]>
118        into::<crate::arrow::buffer::ScalarBuffer>();
119        // into::<crate::arrow::buffer::BufferBuilder>(); missing BufferBuilder<u8> from ScalarBuffer<u8>
120    }
121}