1use 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::<crate::arrow::buffer::ScalarBuffer>();
113 from::<crate::arrow::buffer::BufferBuilder>();
114
115 into::<VecBuffer>();
116 into::<crate::arrow::buffer::ScalarBuffer>();
119 }
121}