Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-arrow/src/bitmap/utils/fmt.rs
6939 views
1
use std::fmt::Write;
2
3
use super::is_set;
4
5
/// Formats `bytes` taking into account an offset and length of the form
6
pub fn fmt(
7
bytes: &[u8],
8
offset: usize,
9
length: usize,
10
f: &mut std::fmt::Formatter<'_>,
11
) -> std::fmt::Result {
12
assert!(offset < 8);
13
14
write!(f, "Bitmap {{ len: {length}, offset: {offset}, bytes: [")?;
15
let mut remaining = length;
16
if remaining == 0 {
17
f.write_str("] }")?;
18
return Ok(());
19
}
20
21
let first = bytes[0];
22
let bytes = &bytes[1..];
23
let empty_before = 8usize.saturating_sub(remaining + offset);
24
f.write_str("0b")?;
25
for _ in 0..empty_before {
26
f.write_char('_')?;
27
}
28
let until = std::cmp::min(8, offset + remaining);
29
for i in offset..until {
30
if is_set(first, offset + until - 1 - i) {
31
f.write_char('1')?;
32
} else {
33
f.write_char('0')?;
34
}
35
}
36
for _ in 0..offset {
37
f.write_char('_')?;
38
}
39
remaining -= until - offset;
40
41
if remaining == 0 {
42
f.write_str("] }")?;
43
return Ok(());
44
}
45
46
let number_of_bytes = remaining / 8;
47
for byte in &bytes[..number_of_bytes] {
48
f.write_str(", ")?;
49
f.write_fmt(format_args!("{byte:#010b}"))?;
50
}
51
remaining -= number_of_bytes * 8;
52
if remaining == 0 {
53
f.write_str("] }")?;
54
return Ok(());
55
}
56
57
let last = bytes[std::cmp::min((length + offset).div_ceil(8), bytes.len() - 1)];
58
let remaining = (length + offset) % 8;
59
f.write_str(", ")?;
60
f.write_str("0b")?;
61
for _ in 0..(8 - remaining) {
62
f.write_char('_')?;
63
}
64
for i in 0..remaining {
65
if is_set(last, remaining - 1 - i) {
66
f.write_char('1')?;
67
} else {
68
f.write_char('0')?;
69
}
70
}
71
f.write_str("] }")
72
}
73
74