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;
9use crate::BitBuffer;
10use crate::ByteBuffer;
11
12impl From<BooleanBuffer> for BitBuffer {
13    fn from(value: BooleanBuffer) -> Self {
14        let offset = value.offset();
15        let len = value.len();
16        let buffer = value.into_inner();
17        let buffer = ByteBuffer::from_arrow_buffer(buffer, Alignment::of::<u8>());
18
19        BitBuffer::new_with_offset(buffer, len, offset)
20    }
21}
22
23impl From<BitBuffer> for BooleanBuffer {
24    fn from(value: BitBuffer) -> Self {
25        let (offset, len, 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;
34    use arrow_buffer::BooleanBufferBuilder;
35
36    use crate::BitBuffer;
37
38    #[test]
39    fn test_from_arrow() {
40        let mut arrow_bools = BooleanBufferBuilder::new(10);
41        arrow_bools.append_n(5, true);
42        arrow_bools.append_n(5, false);
43        let bit_buffer: BitBuffer = arrow_bools.finish().into();
44
45        for i in 0..5 {
46            assert!(bit_buffer.value(i));
47        }
48
49        for i in 5..10 {
50            assert!(!bit_buffer.value(i));
51        }
52
53        // Convert back to Arrow
54        let arrow_bools: BooleanBuffer = bit_buffer.into();
55
56        for i in 0..5 {
57            assert!(arrow_bools.value(i));
58        }
59        for i in 5..10 {
60            assert!(!arrow_bools.value(i));
61        }
62    }
63}