1use bitflags::bitflags;
4
5bitflags! {
6 #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
51 pub struct Fields: u32 {
52 const Z = 1 << 0;
54 const INTENSITY = 1 << 1;
56 const CLASSIFICATION = 1 << 2;
58 const FLAGS = 1 << 3;
60 const SCAN_ANGLE = 1 << 4;
62 const USER_DATA = 1 << 5;
64 const POINT_SOURCE_ID = 1 << 6;
66 const GPS_TIME = 1 << 7;
68 const RGB = 1 << 8;
70 const NIR = 1 << 9;
72 const WAVEPACKET = 1 << 10;
74 const EXTRA_BYTES = 1 << 11;
76
77 const ALL = Self::Z.bits()
80 | Self::INTENSITY.bits()
81 | Self::CLASSIFICATION.bits()
82 | Self::FLAGS.bits()
83 | Self::SCAN_ANGLE.bits()
84 | Self::USER_DATA.bits()
85 | Self::POINT_SOURCE_ID.bits()
86 | Self::GPS_TIME.bits()
87 | Self::RGB.bits()
88 | Self::NIR.bits()
89 | Self::WAVEPACKET.bits()
90 | Self::EXTRA_BYTES.bits();
91 }
92}
93
94impl Fields {
95 pub(crate) fn to_laz_selection(self) -> laz::DecompressionSelection {
101 let mut sel = laz::DecompressionSelection::xy_returns_channel();
102 if self.contains(Fields::Z) {
103 sel = sel.decompress_z();
104 }
105 if self.contains(Fields::INTENSITY) {
106 sel = sel.decompress_intensity();
107 }
108 if self.contains(Fields::CLASSIFICATION) {
109 sel = sel.decompress_classification();
110 }
111 if self.contains(Fields::FLAGS) {
112 sel = sel.decompress_flags();
113 }
114 if self.contains(Fields::SCAN_ANGLE) {
115 sel = sel.decompress_scan_angle();
116 }
117 if self.contains(Fields::USER_DATA) {
118 sel = sel.decompress_user_data();
119 }
120 if self.contains(Fields::POINT_SOURCE_ID) {
121 sel = sel.decompress_point_source_id();
122 }
123 if self.contains(Fields::GPS_TIME) {
124 sel = sel.decompress_gps_time();
125 }
126 if self.contains(Fields::RGB) {
127 sel = sel.decompress_rgb();
128 }
129 if self.contains(Fields::NIR) {
130 sel = sel.decompress_nir();
131 }
132 if self.contains(Fields::WAVEPACKET) {
133 sel = sel.decompress_wavepacket();
134 }
135 if self.contains(Fields::EXTRA_BYTES) {
136 sel = sel.decompress_extra_bytes();
137 }
138 sel
139 }
140}
141
142#[cfg(test)]
143mod tests {
144 use super::*;
145
146 #[test]
147 fn all_contains_every_layer() {
148 assert!(Fields::ALL.contains(Fields::Z));
149 assert!(Fields::ALL.contains(Fields::INTENSITY));
150 assert!(Fields::ALL.contains(Fields::CLASSIFICATION));
151 assert!(Fields::ALL.contains(Fields::FLAGS));
152 assert!(Fields::ALL.contains(Fields::SCAN_ANGLE));
153 assert!(Fields::ALL.contains(Fields::USER_DATA));
154 assert!(Fields::ALL.contains(Fields::POINT_SOURCE_ID));
155 assert!(Fields::ALL.contains(Fields::GPS_TIME));
156 assert!(Fields::ALL.contains(Fields::RGB));
157 assert!(Fields::ALL.contains(Fields::NIR));
158 assert!(Fields::ALL.contains(Fields::WAVEPACKET));
159 assert!(Fields::ALL.contains(Fields::EXTRA_BYTES));
160 }
161
162 #[test]
163 fn composition() {
164 let f = Fields::Z | Fields::GPS_TIME;
165 assert!(f.contains(Fields::Z));
166 assert!(f.contains(Fields::GPS_TIME));
167 assert!(!f.contains(Fields::RGB));
168 assert!(!f.contains(Fields::INTENSITY));
169 }
170
171 #[test]
172 fn empty_mask_has_no_layers_set() {
173 let sel = Fields::empty().to_laz_selection();
174 assert!(!sel.should_decompress_z());
175 assert!(!sel.should_decompress_classification());
176 assert!(!sel.should_decompress_intensity());
177 assert!(!sel.should_decompress_gps_time());
178 assert!(!sel.should_decompress_rgb());
179 }
180
181 #[test]
182 fn selective_mask_enables_only_requested_layers() {
183 let sel = (Fields::Z | Fields::GPS_TIME).to_laz_selection();
184 assert!(sel.should_decompress_z());
185 assert!(sel.should_decompress_gps_time());
186 assert!(!sel.should_decompress_rgb());
187 assert!(!sel.should_decompress_intensity());
188 assert!(!sel.should_decompress_classification());
189 assert!(!sel.should_decompress_nir());
190 }
191
192 #[test]
193 fn all_mask_enables_every_layer() {
194 let sel = Fields::ALL.to_laz_selection();
195 assert!(sel.should_decompress_z());
196 assert!(sel.should_decompress_intensity());
197 assert!(sel.should_decompress_classification());
198 assert!(sel.should_decompress_flags());
199 assert!(sel.should_decompress_scan_angle());
200 assert!(sel.should_decompress_user_data());
201 assert!(sel.should_decompress_point_source_id());
202 assert!(sel.should_decompress_gps_time());
203 assert!(sel.should_decompress_rgb());
204 assert!(sel.should_decompress_nir());
205 assert!(sel.should_decompress_wavepacket());
206 assert!(sel.should_decompress_extra_bytes());
207 }
208}