1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
use bitvec::prelude::*;
use super::grib_section::GribSection;
use crate::utils::read_u32_from_bytes;
use std::iter::Iterator;
use std::vec::Vec;
pub struct BitmapSection<'a> {
data: &'a [u8],
}
impl<'a> BitmapSection<'a> {
pub fn from_data(data: &'a [u8]) -> Self {
BitmapSection { data }
}
pub fn has_bitmap(&self) -> bool {
self.data[5] == 0
}
pub fn raw_bitmap_data(&self) -> &[u8] {
&self.data[6..]
}
pub fn map_data(&self, unmapped_data: Vec<f64>) -> Vec<f64> {
let mut nan_count: usize = 0;
let bitmask = self.raw_bitmap_data().view_bits::<Msb0>();
let mut data = Vec::new();
data.resize(bitmask.len(), 0.0);
if unmapped_data.is_empty() {
return data;
}
for (i, mask) in bitmask.iter().enumerate() {
data[i] = match *mask {
true => unmapped_data[i - nan_count],
_ => {
nan_count += 1;
f64::NAN
}
};
}
data
}
pub fn data_index(&self, index: usize) -> Option<usize> {
if !self.has_bitmap() {
return Some(index);
}
// 110101011 01101101
// 012345678
// 5 - 2 = 3
let bitmask = self.raw_bitmap_data().view_bits::<Msb0>();
if bitmask.len() <= index || !bitmask[index] {
return None;
}
let mut nan_count: usize = 0;
for i in (0..index).rev() {
if !bitmask[i] {
nan_count += 1;
}
}
Some(index - nan_count)
// EXPERIMENTAL
// let raw_bitmap = self.raw_bitmap_data();
// let mut index_counter: usize = 0;
// for i in 0..raw_bitmap.len() {
// let valid_count = positive_bit_count(&raw_bitmap[i]);
// if index > i * 8 {
// // println!("{}: {}", index_counter, valid_count);
// index_counter += valid_count as usize;
// continue;
// }
// let bits = byte_to_bits(&raw_bitmap[i]);
// let stop_index = (i*8) - index;
// index_counter += raw_bitmap[0..stop_index].iter().sum::<u8>() as usize;
// break;
// }
// Some(index_counter.into())
}
}
impl<'a> GribSection for BitmapSection<'a> {
fn len(&self) -> usize {
read_u32_from_bytes(&self.data[0..4], 0).unwrap_or(0) as usize
}
fn number(&self) -> u8 {
self.data[4]
}
}