smol_bitmap/
serde.rs

1//! Serde implementations for `SmolBitmap`.
2
3use super::{SmolBitmap, SmolBitmapBuilder};
4use serde::{
5    Deserialize, Deserializer, Serialize, Serializer,
6    de::{self, SeqAccess, Visitor},
7    ser::SerializeSeq,
8};
9
10/// Serde implementation serializing the bitmap as a sequence of u64 words.
11pub mod words {
12    use super::{
13        Deserializer, SeqAccess, Serialize, Serializer, SmolBitmap, SmolBitmapBuilder, Visitor,
14    };
15
16    /// Serialize the bitmap as a sequence of u64 words.
17    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    /// Deserialize the bitmap from a sequence of u64 words.
26    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
55/// Module for serializing and deserializing [`SmolBitmap`] as a sorted set of
56/// integers.
57pub mod sorted_set {
58    use super::{Deserializer, SeqAccess, SerializeSeq, Serializer, SmolBitmap, Visitor, de};
59
60    /// Serialize the [`SmolBitmap`] as a sorted sequence of integers.
61    ///
62    /// This function serializes the bitmap by iterating over its set bits
63    /// and writing each index as an element in the sequence.
64    ///
65    /// # Errors
66    ///
67    /// Returns an error if the serializer fails to serialize the sequence.
68    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    /// Deserialize a [`SmolBitmap`] from a sorted sequence of integers.
81    ///
82    /// This function expects a sorted sequence of integers, where each integer
83    /// represents an index of a set bit in the bitmap.
84    ///
85    /// # Errors
86    ///
87    /// Returns an error if the sequence is not sorted or if deserialization
88    /// fails.
89    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
128/// Module for serializing and deserializing [`SmolBitmap`] as an unordered set
129/// of integers.
130pub mod unordered_set {
131    use super::{Deserializer, SeqAccess, Serializer, SmolBitmap, Visitor, sorted_set};
132
133    /// Serialize the [`SmolBitmap`] as an unordered sequence of integers.
134    ///
135    /// This function serializes the bitmap by iterating over its set bits
136    /// and writing each index as an element in the sequence.
137    ///
138    /// # Errors
139    ///
140    /// Returns an error if the serializer fails to serialize the sequence.
141    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    /// Deserialize a [`SmolBitmap`] from an unordered sequence of integers.
149    ///
150    /// This function expects a sorted sequence of integers, where each integer
151    /// represents an index of a set bit in the bitmap.
152    ///
153    /// # Errors
154    ///
155    /// Returns an error if the sequence is not sorted or if deserialization
156    /// fails.
157    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
186/// Macro to implement byte-based serialization and deserialization for
187/// [`SmolBitmap`].
188macro_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            /// Serialize the [`SmolBitmap`] as bytes.
195            ///
196            /// This function serializes the bitmap's internal byte representation.
197            ///
198            /// # Errors
199            ///
200            /// Returns an error if the serializer fails to serialize the bytes.
201            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            /// Deserialize a [`SmolBitmap`] from bytes.
209            ///
210            /// This function expects a byte slice that represents the bitmap.
211            ///
212            /// # Errors
213            ///
214            /// Returns an error if the byte slice length is not a multiple of 8 or if
215            /// deserialization fails.
216            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
230// Implementations for native-endian, little-endian, and big-endian byte orders.
231impl_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    /// Serialize the [`SmolBitmap`] using little-endian byte order.
252    ///
253    /// # Errors
254    ///
255    /// Returns an error if serialization fails.
256    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    /// Deserialize a [`SmolBitmap`] using little-endian byte order.
266    ///
267    /// # Errors
268    ///
269    /// Returns an error if deserialization fails.
270    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
271    where
272        D: Deserializer<'de>,
273    {
274        le_bytes::deserialize(deserializer)
275    }
276}
277
278/// Helper module for base64 serialization
279mod binser {
280    use super::{Deserializer, Serializer, SmolBitmap, Visitor, de};
281
282    /// Serialize the [`SmolBitmap`] as bytes.
283    ///
284    /// This function serializes the bitmap's internal byte representation.
285    ///
286    /// # Errors
287    ///
288    /// Returns an error if the serializer fails to serialize the bytes.
289    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    /// Deserialize a [`SmolBitmap`] from bytes.
302    ///
303    /// This function expects a byte slice that represents the bitmap.
304    ///
305    /// # Errors
306    ///
307    /// Returns an error if the byte slice length is not a multiple of 8 or if
308    /// deserialization fails.
309    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    // Helper struct for testing different serde formats
383    #[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    // ========================================================================
420    // Words format tests
421    // ========================================================================
422
423    #[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        // Should serialize to at least 2 words
474        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        // Create a pattern that requires external storage
485        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    // ========================================================================
501    // Sorted set format tests
502    // ========================================================================
503
504    #[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    // ========================================================================
598    // Unordered set format tests
599    // ========================================================================
600
601    #[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        // This should succeed unlike sorted_set
613        let json = r#"{"bitmap": [10, 5, 15, 5]}"#; // Note: includes duplicate
614        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); // Duplicate is handled correctly
620    }
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    // ========================================================================
641    // Byte format tests
642    // ========================================================================
643
644    #[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    // ========================================================================
713    // Default implementation tests
714    // ========================================================================
715
716    #[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        // Default implementation should use le_bytes
724        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        // JSON serialization with default implementation
739        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    // ========================================================================
749    // Cross-format compatibility tests
750    // ========================================================================
751
752    #[test]
753    fn test_words_to_sorted_set_conversion() {
754        // Create bitmap and serialize as words
755        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        // Verify the words format
766        assert!(words_json["bitmap"].is_array());
767
768        // Create the same bitmap via sorted set
769        let sorted_wrapper = SortedSetWrapper { bitmap };
770        let sorted_json = serde_json::to_value(&sorted_wrapper).unwrap();
771
772        // They should represent the same data differently
773        assert_ne!(words_json["bitmap"], sorted_json["bitmap"]);
774    }
775
776    // ========================================================================
777    // Edge cases and stress tests
778    // ========================================================================
779
780    #[test]
781    fn test_very_large_bitmap() {
782        let mut bitmap = SmolBitmap::new();
783
784        // Create a sparse bitmap with bits set at powers of 2
785        for i in 0..10 {
786            bitmap.insert(1 << i);
787        }
788
789        // Test all formats
790        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        // Serialize and deserialize each format
804        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        // Verify all deserializations are correct
815        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        // Set all bits in first word
829        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        // Very sparse bitmap
850        bitmap.insert(0);
851        bitmap.insert(1000);
852        bitmap.insert(10000);
853
854        // sorted_set should be efficient for sparse bitmaps
855        let sorted_wrapper = SortedSetWrapper {
856            bitmap: bitmap.clone(),
857        };
858        let json = serde_json::to_string(&sorted_wrapper).unwrap();
859
860        // Should serialize as just 3 numbers
861        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); // Within first byte
875        bitmap.insert(8); // Second byte
876        bitmap.insert(15); // Second byte
877
878        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        // The byte representations should differ due to endianness
889        // but both should deserialize to the same logical bitmap
890        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}