Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-row/src/fixed/boolean.rs
6939 views
1
#![allow(unsafe_op_in_unsafe_fn)]
2
//! Row encoding for Booleans
3
//!
4
//! Each Boolean value is encoded by one byte:
5
//!
6
//! | Value | Encoding |
7
//! |-------|-----------------|
8
//! | None | `0x00` / `0xFF` |
9
//! | False | `0x02` / `0xFD` |
10
//! | True | `0x03` / `0xFC` |
11
12
use std::mem::MaybeUninit;
13
14
use arrow::array::BooleanArray;
15
use arrow::bitmap::Bitmap;
16
use arrow::datatypes::ArrowDataType;
17
18
use crate::row::RowEncodingOptions;
19
20
pub(crate) unsafe fn encode_bool<I: Iterator<Item = Option<bool>>>(
21
buffer: &mut [MaybeUninit<u8>],
22
input: I,
23
opt: RowEncodingOptions,
24
offsets: &mut [usize],
25
) {
26
let null_sentinel = opt.null_sentinel();
27
let true_sentinel = opt.bool_true_sentinel();
28
let false_sentinel = opt.bool_false_sentinel();
29
30
for (offset, opt_value) in offsets.iter_mut().zip(input) {
31
let b = match opt_value {
32
None => null_sentinel,
33
Some(false) => false_sentinel,
34
Some(true) => true_sentinel,
35
};
36
37
*buffer.get_unchecked_mut(*offset) = MaybeUninit::new(b);
38
*offset += 1;
39
}
40
}
41
42
pub(crate) unsafe fn decode_bool(rows: &mut [&[u8]], opt: RowEncodingOptions) -> BooleanArray {
43
let mut has_nulls = false;
44
let null_sentinel = opt.null_sentinel();
45
let true_sentinel = opt.bool_true_sentinel();
46
47
let values = Bitmap::from_trusted_len_iter_unchecked(rows.iter().map(|row| {
48
let b = *row.get_unchecked(0);
49
has_nulls |= b == null_sentinel;
50
b == true_sentinel
51
}));
52
53
if !has_nulls {
54
rows.iter_mut()
55
.for_each(|row| *row = row.get_unchecked(1..));
56
return BooleanArray::new(ArrowDataType::Boolean, values, None);
57
}
58
59
let validity = Bitmap::from_trusted_len_iter_unchecked(rows.iter_mut().map(|row| {
60
let v = *row.get_unchecked(0) != null_sentinel;
61
*row = row.get_unchecked(1..);
62
v
63
}));
64
BooleanArray::new(ArrowDataType::Boolean, values, Some(validity))
65
}
66
67