vortex_buffer/bit/
arrow.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4//! Conversions between `BitBuffer` and Arrow's `BooleanBuffer`.
5
6use arrow_buffer::BooleanBuffer;
7
8use crate::{Alignment, BitBuffer, ByteBuffer};
9
10impl From<BooleanBuffer> for BitBuffer {
11    fn from(value: BooleanBuffer) -> Self {
12        let offset = value.offset();
13        let len = value.len();
14        let buffer = value.into_inner();
15        let buffer = ByteBuffer::from_arrow_buffer(buffer, Alignment::of::<u8>());
16
17        BitBuffer::new_with_offset(buffer, len, offset)
18    }
19}
20
21impl From<BitBuffer> for BooleanBuffer {
22    fn from(value: BitBuffer) -> Self {
23        let offset = value.offset();
24        let len = value.len();
25        let buffer = value.into_inner();
26
27        BooleanBuffer::new(buffer.into_arrow_buffer(), offset, len)
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use arrow_buffer::{BooleanBuffer, BooleanBufferBuilder};
34
35    use crate::BitBuffer;
36
37    #[test]
38    fn test_from_arrow() {
39        let mut arrow_bools = BooleanBufferBuilder::new(10);
40        arrow_bools.append_n(5, true);
41        arrow_bools.append_n(5, false);
42        let bit_buffer: BitBuffer = arrow_bools.finish().into();
43
44        for i in 0..5 {
45            assert!(bit_buffer.value(i));
46        }
47
48        for i in 5..10 {
49            assert!(!bit_buffer.value(i));
50        }
51
52        // Convert back to Arrow
53        let arrow_bools: BooleanBuffer = bit_buffer.into();
54
55        for i in 0..5 {
56            assert!(arrow_bools.value(i));
57        }
58        for i in 5..10 {
59            assert!(!arrow_bools.value(i));
60        }
61    }
62}