1use super::{SmolBitmap, SmolBitmapBuilder};
4use serde::{
5 Deserialize, Deserializer, Serialize, Serializer,
6 de::{self, SeqAccess, Visitor},
7 ser::SerializeSeq,
8};
9
10pub mod words {
12 use super::{
13 Deserializer, SeqAccess, Serialize, Serializer, SmolBitmap, SmolBitmapBuilder, Visitor,
14 };
15
16 pub fn serialize<S>(b: &SmolBitmap, serializer: S) -> Result<S::Ok, S::Error>
18 where
19 S: Serializer,
20 {
21 let slice: &[u64] = b.as_slice_rtrim();
22 slice.serialize(serializer)
23 }
24
25 pub fn deserialize<'de, D>(deserializer: D) -> Result<SmolBitmap, D::Error>
27 where
28 D: Deserializer<'de>,
29 {
30 struct SmolBitmapVisitor;
31
32 impl<'de> Visitor<'de> for SmolBitmapVisitor {
33 type Value = SmolBitmap;
34
35 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
36 formatter.write_str("a sequence of u64 words")
37 }
38
39 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
40 where
41 A: SeqAccess<'de>,
42 {
43 let mut builder = SmolBitmapBuilder::with_capacity(seq.size_hint().unwrap_or(0));
44 while let Some(word) = seq.next_element::<u64>()? {
45 builder.push(word);
46 }
47 Ok(builder.into())
48 }
49 }
50
51 deserializer.deserialize_seq(SmolBitmapVisitor)
52 }
53}
54
55pub mod sorted_set {
58 use super::{Deserializer, SeqAccess, SerializeSeq, Serializer, SmolBitmap, Visitor, de};
59
60 pub fn serialize<S>(b: &SmolBitmap, serializer: S) -> Result<S::Ok, S::Error>
69 where
70 S: Serializer,
71 {
72 let n = b.cardinality();
73 let mut ser = serializer.serialize_seq(Some(n))?;
74 for i in b {
75 ser.serialize_element(&i)?;
76 }
77 ser.end()
78 }
79
80 pub fn deserialize<'de, D>(deserializer: D) -> Result<SmolBitmap, D::Error>
90 where
91 D: Deserializer<'de>,
92 {
93 struct SmolBitmapVisitor;
94
95 impl<'de> Visitor<'de> for SmolBitmapVisitor {
96 type Value = SmolBitmap;
97
98 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
99 formatter.write_str("a sorted sequence of integers")
100 }
101
102 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
103 where
104 A: SeqAccess<'de>,
105 {
106 let mut b = SmolBitmap::new();
107 let mut last = None;
108 while let Some(word) = seq.next_element::<usize>()? {
109 if let Some(last) = last
110 && last >= word
111 {
112 return Err(de::Error::invalid_value(
113 de::Unexpected::Unsigned(word as u64),
114 &"sorted sequence",
115 ));
116 }
117 last = Some(word);
118 b.insert(word);
119 }
120 Ok(b)
121 }
122 }
123
124 deserializer.deserialize_seq(SmolBitmapVisitor)
125 }
126}
127
128pub mod unordered_set {
131 use super::{Deserializer, SeqAccess, Serializer, SmolBitmap, Visitor, sorted_set};
132
133 pub fn serialize<S>(b: &SmolBitmap, serializer: S) -> Result<S::Ok, S::Error>
142 where
143 S: Serializer,
144 {
145 sorted_set::serialize(b, serializer)
146 }
147
148 pub fn deserialize<'de, D>(deserializer: D) -> Result<SmolBitmap, D::Error>
158 where
159 D: Deserializer<'de>,
160 {
161 struct SmolBitmapVisitor;
162
163 impl<'de> Visitor<'de> for SmolBitmapVisitor {
164 type Value = SmolBitmap;
165
166 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
167 formatter.write_str("a sequence of integers")
168 }
169
170 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
171 where
172 A: SeqAccess<'de>,
173 {
174 let mut b = SmolBitmap::new();
175 while let Some(word) = seq.next_element::<usize>()? {
176 b.insert(word);
177 }
178 Ok(b)
179 }
180 }
181
182 deserializer.deserialize_seq(SmolBitmapVisitor)
183 }
184}
185
186macro_rules! impl_bytes {
189 ($mod:ident, $from_fn:ident, $to_fn:ident, $doc:literal) => {
190 #[doc = $doc]
191 pub mod $mod {
192 use super::*;
193
194 pub fn serialize<S>(b: &SmolBitmap, serializer: S) -> Result<S::Ok, S::Error>
202 where
203 S: Serializer,
204 {
205 binser::serialize(b.$to_fn().as_ref(), serializer)
206 }
207
208 pub fn deserialize<'de, D>(deserializer: D) -> Result<SmolBitmap, D::Error>
217 where
218 D: Deserializer<'de>,
219 {
220 binser::deserialize(
221 deserializer,
222 #[inline(always)]
223 |bytes| SmolBitmap::$from_fn(bytes),
224 )
225 }
226 }
227 };
228}
229
230impl_bytes!(
232 ne_bytes,
233 from_ne_bytes,
234 to_ne_bytes,
235 "Serialize and deserialize [`SmolBitmap`] using native-endian byte order."
236);
237impl_bytes!(
238 le_bytes,
239 from_le_bytes,
240 to_le_bytes,
241 "Serialize and deserialize [`SmolBitmap`] using little-endian byte order."
242);
243impl_bytes!(
244 be_bytes,
245 from_be_bytes,
246 to_be_bytes,
247 "Serialize and deserialize [`SmolBitmap`] using big-endian byte order."
248);
249
250impl Serialize for SmolBitmap {
251 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
257 where
258 S: Serializer,
259 {
260 le_bytes::serialize(self, serializer)
261 }
262}
263
264impl<'de> Deserialize<'de> for SmolBitmap {
265 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
271 where
272 D: Deserializer<'de>,
273 {
274 le_bytes::deserialize(deserializer)
275 }
276}
277
278mod binser {
280 use super::{Deserializer, Serializer, SmolBitmap, Visitor, de};
281
282 pub fn serialize<S>(bytes: &[u8], serializer: S) -> Result<S::Ok, S::Error>
290 where
291 S: Serializer,
292 {
293 if serializer.is_human_readable() {
294 let encoded = data_encoding::BASE64.encode(bytes);
295 serializer.serialize_str(&encoded)
296 } else {
297 serializer.serialize_bytes(bytes)
298 }
299 }
300
301 pub fn deserialize<'de, D, P>(deserializer: D, parse: P) -> Result<SmolBitmap, D::Error>
310 where
311 D: Deserializer<'de>,
312 P: FnOnce(&[u8]) -> (SmolBitmap, &[u8]),
313 {
314 if deserializer.is_human_readable() {
315 struct SmolBitmapVisitor<P>(P);
316
317 impl<P> Visitor<'_> for SmolBitmapVisitor<P>
318 where
319 P: FnOnce(&[u8]) -> (SmolBitmap, &[u8]),
320 {
321 type Value = SmolBitmap;
322
323 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
324 formatter.write_str("bytes representation of a bitmap")
325 }
326
327 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
328 where
329 E: de::Error,
330 {
331 let decoded = data_encoding::BASE64
332 .decode(v.as_bytes())
333 .map_err(E::custom)?;
334 let (bitmap, leftover) = (self.0)(&decoded);
335 if !leftover.is_empty() {
336 return Err(de::Error::invalid_length(
337 decoded.len(),
338 &"multiple of 8 bytes",
339 ));
340 }
341 Ok(bitmap)
342 }
343 }
344
345 deserializer.deserialize_str(SmolBitmapVisitor(parse))
346 } else {
347 struct SmolBitmapVisitor<P>(P);
348
349 impl<P> Visitor<'_> for SmolBitmapVisitor<P>
350 where
351 P: FnOnce(&[u8]) -> (SmolBitmap, &[u8]),
352 {
353 type Value = SmolBitmap;
354
355 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
356 formatter.write_str("bytes representation of a bitmap")
357 }
358
359 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
360 where
361 E: de::Error,
362 {
363 if !v.len().is_multiple_of(8) {
364 return Err(de::Error::invalid_length(v.len(), &"multiple of 8 bytes"));
365 }
366 let (bitmap, _) = (self.0)(v);
367 Ok(bitmap)
368 }
369 }
370
371 deserializer.deserialize_bytes(SmolBitmapVisitor(parse))
372 }
373 }
374}
375
376#[cfg(all(test, feature = "serde"))]
377mod tests {
378 use super::*;
379 use ::serde::{Deserialize, Serialize};
380 use serde_test::{Token, assert_tokens};
381
382 #[derive(Debug, Serialize, Deserialize, PartialEq)]
384 struct WordsWrapper {
385 #[serde(with = "words")]
386 bitmap: SmolBitmap,
387 }
388
389 #[derive(Debug, Serialize, Deserialize, PartialEq)]
390 struct SortedSetWrapper {
391 #[serde(with = "sorted_set")]
392 bitmap: SmolBitmap,
393 }
394
395 #[derive(Debug, Serialize, Deserialize, PartialEq)]
396 struct UnorderedSetWrapper {
397 #[serde(with = "unordered_set")]
398 bitmap: SmolBitmap,
399 }
400
401 #[derive(Debug, Serialize, Deserialize, PartialEq)]
402 struct NeBytesWrapper {
403 #[serde(with = "ne_bytes")]
404 bitmap: SmolBitmap,
405 }
406
407 #[derive(Debug, Serialize, Deserialize, PartialEq)]
408 struct LeBytesWrapper {
409 #[serde(with = "le_bytes")]
410 bitmap: SmolBitmap,
411 }
412
413 #[derive(Debug, Serialize, Deserialize, PartialEq)]
414 struct BeBytesWrapper {
415 #[serde(with = "be_bytes")]
416 bitmap: SmolBitmap,
417 }
418
419 #[test]
424 fn test_words_empty() {
425 let bitmap = SmolBitmap::new();
426 let wrapper = WordsWrapper { bitmap };
427
428 assert_tokens(
429 &wrapper,
430 &[
431 Token::Struct {
432 name: "WordsWrapper",
433 len: 1,
434 },
435 Token::Str("bitmap"),
436 Token::Seq { len: Some(0) },
437 Token::SeqEnd,
438 Token::StructEnd,
439 ],
440 );
441 }
442
443 #[test]
444 fn test_words_single_word() {
445 let mut bitmap = SmolBitmap::new();
446 bitmap.insert(0);
447 bitmap.insert(63);
448 let wrapper = WordsWrapper { bitmap };
449
450 assert_tokens(
451 &wrapper,
452 &[
453 Token::Struct {
454 name: "WordsWrapper",
455 len: 1,
456 },
457 Token::Str("bitmap"),
458 Token::Seq { len: Some(1) },
459 Token::U64((1u64 << 63) | 1),
460 Token::SeqEnd,
461 Token::StructEnd,
462 ],
463 );
464 }
465
466 #[test]
467 fn test_words_multiple_words() {
468 let mut bitmap = SmolBitmap::new();
469 bitmap.insert(0);
470 bitmap.insert(64);
471 let wrapper = WordsWrapper { bitmap };
472
473 let serialized = serde_json::to_string(&wrapper).unwrap();
475 let deserialized: WordsWrapper = serde_json::from_str(&serialized).unwrap();
476
477 assert!(deserialized.bitmap.get(0));
478 assert!(deserialized.bitmap.get(64));
479 }
480
481 #[test]
482 fn test_words_roundtrip_large() {
483 let mut bitmap = SmolBitmap::new();
484 for i in (0..300).step_by(3) {
486 bitmap.insert(i);
487 }
488
489 let wrapper = WordsWrapper {
490 bitmap: bitmap.clone(),
491 };
492 let serialized = serde_json::to_string(&wrapper).unwrap();
493 let deserialized: WordsWrapper = serde_json::from_str(&serialized).unwrap();
494
495 for i in 0..300 {
496 assert_eq!(deserialized.bitmap.get(i), bitmap.get(i));
497 }
498 }
499
500 #[test]
505 fn test_sorted_set_empty() {
506 let bitmap = SmolBitmap::new();
507 let wrapper = SortedSetWrapper { bitmap };
508
509 assert_tokens(
510 &wrapper,
511 &[
512 Token::Struct {
513 name: "SortedSetWrapper",
514 len: 1,
515 },
516 Token::Str("bitmap"),
517 Token::Seq { len: Some(0) },
518 Token::SeqEnd,
519 Token::StructEnd,
520 ],
521 );
522 }
523
524 #[test]
525 fn test_sorted_set_single_bit() {
526 let mut bitmap = SmolBitmap::new();
527 bitmap.insert(42);
528 let wrapper = SortedSetWrapper { bitmap };
529
530 assert_tokens(
531 &wrapper,
532 &[
533 Token::Struct {
534 name: "SortedSetWrapper",
535 len: 1,
536 },
537 Token::Str("bitmap"),
538 Token::Seq { len: Some(1) },
539 Token::U64(42),
540 Token::SeqEnd,
541 Token::StructEnd,
542 ],
543 );
544 }
545
546 #[test]
547 fn test_sorted_set_multiple_bits() {
548 let mut bitmap = SmolBitmap::new();
549 bitmap.insert(5);
550 bitmap.insert(10);
551 bitmap.insert(15);
552 let wrapper = SortedSetWrapper { bitmap };
553
554 assert_tokens(
555 &wrapper,
556 &[
557 Token::Struct {
558 name: "SortedSetWrapper",
559 len: 1,
560 },
561 Token::Str("bitmap"),
562 Token::Seq { len: Some(3) },
563 Token::U64(5),
564 Token::U64(10),
565 Token::U64(15),
566 Token::SeqEnd,
567 Token::StructEnd,
568 ],
569 );
570 }
571
572 #[test]
573 fn test_sorted_set_deserialize_unsorted_fails() {
574 let json = r#"{"bitmap": [10, 5, 15]}"#;
575 let result: Result<SortedSetWrapper, _> = serde_json::from_str(json);
576 assert!(result.is_err());
577 }
578
579 #[test]
580 fn test_sorted_set_roundtrip() {
581 let mut bitmap = SmolBitmap::new();
582 for i in [1, 5, 10, 63, 64, 100] {
583 bitmap.insert(i);
584 }
585
586 let wrapper = SortedSetWrapper {
587 bitmap: bitmap.clone(),
588 };
589 let serialized = serde_json::to_string(&wrapper).unwrap();
590 let deserialized: SortedSetWrapper = serde_json::from_str(&serialized).unwrap();
591
592 for i in 0..=100 {
593 assert_eq!(deserialized.bitmap.get(i), bitmap.get(i));
594 }
595 }
596
597 #[test]
602 fn test_unordered_set_empty() {
603 let bitmap = SmolBitmap::new();
604 let wrapper = UnorderedSetWrapper { bitmap };
605
606 let serialized = serde_json::to_string(&wrapper).unwrap();
607 assert_eq!(serialized, r#"{"bitmap":[]}"#);
608 }
609
610 #[test]
611 fn test_unordered_set_accepts_unsorted() {
612 let json = r#"{"bitmap": [10, 5, 15, 5]}"#; let deserialized: UnorderedSetWrapper = serde_json::from_str(json).unwrap();
615
616 assert!(deserialized.bitmap.get(5));
617 assert!(deserialized.bitmap.get(10));
618 assert!(deserialized.bitmap.get(15));
619 assert_eq!(deserialized.bitmap.count_ones(), 3); }
621
622 #[test]
623 fn test_unordered_set_roundtrip() {
624 let mut bitmap = SmolBitmap::new();
625 for i in [100, 5, 63, 1, 10, 64] {
626 bitmap.insert(i);
627 }
628
629 let wrapper = UnorderedSetWrapper {
630 bitmap: bitmap.clone(),
631 };
632 let serialized = serde_json::to_string(&wrapper).unwrap();
633 let deserialized: UnorderedSetWrapper = serde_json::from_str(&serialized).unwrap();
634
635 for i in 0..=100 {
636 assert_eq!(deserialized.bitmap.get(i), bitmap.get(i));
637 }
638 }
639
640 #[test]
645 fn test_le_bytes_empty() {
646 let bitmap = SmolBitmap::new();
647 let wrapper = LeBytesWrapper { bitmap };
648
649 let serialized = postcard::to_allocvec(&wrapper).unwrap();
650 let deserialized: LeBytesWrapper = postcard::from_bytes(&serialized).unwrap();
651
652 assert_eq!(deserialized.bitmap.count_ones(), 0);
653 }
654
655 #[test]
656 fn test_le_bytes_roundtrip() {
657 let mut bitmap = SmolBitmap::new();
658 bitmap.insert(0);
659 bitmap.insert(7);
660 bitmap.insert(8);
661 bitmap.insert(15);
662 bitmap.insert(64);
663
664 let wrapper = LeBytesWrapper {
665 bitmap: bitmap.clone(),
666 };
667 let serialized = postcard::to_allocvec(&wrapper).unwrap();
668 let deserialized: LeBytesWrapper = postcard::from_bytes(&serialized).unwrap();
669
670 for i in 0..=100 {
671 assert_eq!(deserialized.bitmap.get(i), bitmap.get(i));
672 }
673 }
674
675 #[test]
676 fn test_be_bytes_roundtrip() {
677 let mut bitmap = SmolBitmap::new();
678 bitmap.insert(0);
679 bitmap.insert(63);
680 bitmap.insert(64);
681 bitmap.insert(127);
682
683 let wrapper = BeBytesWrapper {
684 bitmap: bitmap.clone(),
685 };
686 let serialized = postcard::to_allocvec(&wrapper).unwrap();
687 let deserialized: BeBytesWrapper = postcard::from_bytes(&serialized).unwrap();
688
689 for i in 0..=127 {
690 assert_eq!(deserialized.bitmap.get(i), bitmap.get(i));
691 }
692 }
693
694 #[test]
695 fn test_ne_bytes_roundtrip() {
696 let mut bitmap = SmolBitmap::new();
697 for i in (0..200).step_by(7) {
698 bitmap.insert(i);
699 }
700
701 let wrapper = NeBytesWrapper {
702 bitmap: bitmap.clone(),
703 };
704 let serialized = postcard::to_allocvec(&wrapper).unwrap();
705 let deserialized: NeBytesWrapper = postcard::from_bytes(&serialized).unwrap();
706
707 for i in 0..200 {
708 assert_eq!(deserialized.bitmap.get(i), bitmap.get(i));
709 }
710 }
711
712 #[test]
717 fn test_default_impl_uses_le_bytes() {
718 let mut bitmap = SmolBitmap::new();
719 bitmap.insert(0);
720 bitmap.insert(63);
721 bitmap.insert(64);
722
723 let serialized = postcard::to_allocvec(&bitmap).unwrap();
725 let deserialized: SmolBitmap = postcard::from_bytes(&serialized).unwrap();
726
727 assert!(deserialized.get(0));
728 assert!(deserialized.get(63));
729 assert!(deserialized.get(64));
730 }
731
732 #[test]
733 fn test_default_impl_json() {
734 let mut bitmap = SmolBitmap::new();
735 bitmap.insert(10);
736 bitmap.insert(20);
737
738 let json = serde_json::to_string(&bitmap).unwrap();
740 let deserialized: SmolBitmap = serde_json::from_str(&json).unwrap();
741 println!("json: {json}");
742 println!("deserialized: {deserialized:?}");
743 assert!(deserialized.get(10));
744 assert!(deserialized.get(20));
745 assert_eq!(deserialized.count_ones(), 2);
746 }
747
748 #[test]
753 fn test_words_to_sorted_set_conversion() {
754 let mut bitmap = SmolBitmap::new();
756 bitmap.insert(5);
757 bitmap.insert(10);
758 bitmap.insert(15);
759
760 let words_wrapper = WordsWrapper {
761 bitmap: bitmap.clone(),
762 };
763 let words_json = serde_json::to_value(&words_wrapper).unwrap();
764
765 assert!(words_json["bitmap"].is_array());
767
768 let sorted_wrapper = SortedSetWrapper { bitmap };
770 let sorted_json = serde_json::to_value(&sorted_wrapper).unwrap();
771
772 assert_ne!(words_json["bitmap"], sorted_json["bitmap"]);
774 }
775
776 #[test]
781 fn test_very_large_bitmap() {
782 let mut bitmap = SmolBitmap::new();
783
784 for i in 0..10 {
786 bitmap.insert(1 << i);
787 }
788
789 let words_wrapper = WordsWrapper {
791 bitmap: bitmap.clone(),
792 };
793 let sorted_wrapper = SortedSetWrapper {
794 bitmap: bitmap.clone(),
795 };
796 let unordered_wrapper = UnorderedSetWrapper {
797 bitmap: bitmap.clone(),
798 };
799 let le_wrapper = LeBytesWrapper {
800 bitmap: bitmap.clone(),
801 };
802
803 let w_json = serde_json::to_string(&words_wrapper).unwrap();
805 let s_json = serde_json::to_string(&sorted_wrapper).unwrap();
806 let u_json = serde_json::to_string(&unordered_wrapper).unwrap();
807 let l_bytes = postcard::to_allocvec(&le_wrapper).unwrap();
808
809 let w_deser: WordsWrapper = serde_json::from_str(&w_json).unwrap();
810 let s_deser: SortedSetWrapper = serde_json::from_str(&s_json).unwrap();
811 let u_deser: UnorderedSetWrapper = serde_json::from_str(&u_json).unwrap();
812 let l_deser: LeBytesWrapper = postcard::from_bytes(&l_bytes).unwrap();
813
814 for i in 0..10 {
816 let bit_pos = 1 << i;
817 assert!(w_deser.bitmap.get(bit_pos));
818 assert!(s_deser.bitmap.get(bit_pos));
819 assert!(u_deser.bitmap.get(bit_pos));
820 assert!(l_deser.bitmap.get(bit_pos));
821 }
822 }
823
824 #[test]
825 fn test_all_bits_in_word() {
826 let mut bitmap = SmolBitmap::new();
827
828 for i in 0..64 {
830 bitmap.insert(i);
831 }
832
833 let wrapper = WordsWrapper {
834 bitmap: bitmap.clone(),
835 };
836 let serialized = serde_json::to_string(&wrapper).unwrap();
837 let deserialized: WordsWrapper = serde_json::from_str(&serialized).unwrap();
838
839 assert_eq!(deserialized.bitmap.count_ones(), 64);
840 for i in 0..64 {
841 assert!(deserialized.bitmap.get(i));
842 }
843 }
844
845 #[test]
846 fn test_sparse_bitmap() {
847 let mut bitmap = SmolBitmap::new();
848
849 bitmap.insert(0);
851 bitmap.insert(1000);
852 bitmap.insert(10000);
853
854 let sorted_wrapper = SortedSetWrapper {
856 bitmap: bitmap.clone(),
857 };
858 let json = serde_json::to_string(&sorted_wrapper).unwrap();
859
860 assert!(json.contains("[0,1000,10000]"));
862
863 let deserialized: SortedSetWrapper = serde_json::from_str(&json).unwrap();
864 assert!(deserialized.bitmap.get(0));
865 assert!(deserialized.bitmap.get(1000));
866 assert!(deserialized.bitmap.get(10000));
867 assert_eq!(deserialized.bitmap.count_ones(), 3);
868 }
869
870 #[test]
871 fn test_endianness_differences() {
872 let mut bitmap = SmolBitmap::new();
873 bitmap.insert(0);
874 bitmap.insert(7); bitmap.insert(8); bitmap.insert(15); let le_wrapper = LeBytesWrapper {
879 bitmap: bitmap.clone(),
880 };
881 let be_wrapper = BeBytesWrapper {
882 bitmap: bitmap.clone(),
883 };
884
885 let le_bytes = postcard::to_allocvec(&le_wrapper).unwrap();
886 let be_bytes = postcard::to_allocvec(&be_wrapper).unwrap();
887
888 let le_deser: LeBytesWrapper = postcard::from_bytes(&le_bytes).unwrap();
891 let be_deser: BeBytesWrapper = postcard::from_bytes(&be_bytes).unwrap();
892
893 for i in 0..16 {
894 assert_eq!(le_deser.bitmap.get(i), be_deser.bitmap.get(i));
895 }
896 }
897}