Skip to main content

multi_trait/
lib.rs

1// SPDX-License-Identifier: Apache-2.0
2//! # Multitrait
3//!
4//! A lightweight, high-performance library providing common traits for implementing
5//! [multiformats](https://github.com/multiformats/multiformats) types in Rust.
6//!
7//! ## Overview
8//!
9//! This crate provides core traits that standardize encoding, decoding, and
10//! null value handling across multiformats implementations:
11//!
12//! ### Encoding Traits
13//!
14//! - **[`EncodeInto`]**: Encode values into compact varint `Vec<u8>` format
15//! - **[`EncodeIntoBuffer`]**: Zero-allocation encoding into existing buffers
16//! - **[`EncodeIntoArray`]**: Stack-based encoding for `no_std` environments
17//!
18//! ### Decoding Traits
19//!
20//! - **[`TryDecodeFrom`]**: Fallibly decode values from byte slices with remainder tracking
21//!
22//! ### Null Value Traits
23//!
24//! - **[`Null`]**: Define and check for null/default values
25//! - **[`TryNull`]**: Fallible version of `Null` for types requiring validation
26//!
27//! ### Validated Types
28//!
29//! - **[`EncodedBytes`]**: Validated newtype for varint-encoded byte sequences
30//!
31//! ## Features
32//!
33//! - **Zero-copy decoding**: `TryDecodeFrom` returns remaining bytes without allocation
34//! - **Zero-allocation encoding**: `EncodeIntoBuffer` reuses existing buffers
35//! - **Stack-based encoding**: `EncodeIntoArray` for `embedded/no_std` contexts
36//! - **Optimized encoding**: Single-allocation encoding with efficient varint compression
37//! - **`no_std` support**: Works in embedded and constrained environments (with `alloc`)
38//! - **Type-safe errors**: Structured error types with proper error chains
39//! - **Thread-safe**: All traits are `Send + Sync` safe
40//!
41//! ## Quick Start
42//!
43//! ```rust
44//! use multi_trait::{EncodeInto, TryDecodeFrom};
45//!
46//! // Encoding: Convert a value to compact varint bytes
47//! let value = 42u32;
48//! let encoded = value.encode_into();
49//! println!("Encoded {} as {:?}", value, encoded);
50//!
51//! // Decoding: Parse bytes back to original value
52//! let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
53//! assert_eq!(decoded, value);
54//! assert!(remaining.is_empty());
55//! ```
56//!
57//! ## Encoding Example
58//!
59//! The [`EncodeInto`] trait provides efficient varint encoding:
60//!
61//! ```rust
62//! use multi_trait::EncodeInto;
63//!
64//! // Small values use fewer bytes
65//! assert_eq!(0u8.encode_into(), vec![0]);
66//! assert_eq!(127u8.encode_into(), vec![127]);
67//! assert_eq!(128u8.encode_into(), vec![128, 1]); // Requires 2 bytes
68//!
69//! // Works with all unsigned integer types
70//! let large_value = 0xFFFF_FFFF_u32;
71//! let encoded = large_value.encode_into();
72//! println!("Encoded 0x{:X} in {} bytes", large_value, encoded.len());
73//! ```
74//!
75//! ## Decoding Example
76//!
77//! The [`TryDecodeFrom`] trait enables zero-copy parsing with error handling:
78//!
79//! ```rust
80//! use multi_trait::TryDecodeFrom;
81//!
82//! // Decode from byte slice
83//! let bytes = vec![0xFF, 0xFF, 0x03]; // Varint encoding of 65535
84//! let (value, remaining) = u16::try_decode_from(&bytes).unwrap();
85//! assert_eq!(value, 65535);
86//! assert!(remaining.is_empty());
87//!
88//! // Handle errors gracefully
89//! let empty: &[u8] = &[];
90//! let result = u8::try_decode_from(empty);
91//! assert!(result.is_err());
92//! ```
93//!
94//! ## Null Value Handling
95//!
96//! Define sentinel/null values for custom types:
97//!
98//! ```rust
99//! use multi_trait::Null;
100//!
101//! struct MyId(u64);
102//!
103//! impl Null for MyId {
104//!     fn null() -> Self {
105//!         MyId(0)
106//!     }
107//!
108//!     fn is_null(&self) -> bool {
109//!         self.0 == 0
110//!     }
111//! }
112//!
113//! let null_id = MyId::null();
114//! assert!(null_id.is_null());
115//!
116//! let valid_id = MyId(12345);
117//! assert!(!valid_id.is_null());
118//! ```
119//!
120//! ## Error Handling
121//!
122//! All decode operations return a [`Result`] with a structured [`Error`] type:
123//!
124//! ```rust
125//! use multi_trait::{TryDecodeFrom, Error};
126//!
127//! let truncated = vec![0xFF]; // Incomplete varint
128//! match u16::try_decode_from(&truncated) {
129//!     Ok((value, _)) => println!("Decoded: {}", value),
130//!     Err(Error::UnsignedVarintDecode { source }) => {
131//!         eprintln!("Decode failed: {}", source);
132//!     }
133//!     Err(e) => eprintln!("Other error: {}", e),
134//! }
135//! ```
136//!
137//! ## Buffer-Based Encoding (Zero Allocation)
138//!
139//! The [`EncodeIntoBuffer`] trait enables encoding without allocations:
140//!
141//! ```rust
142//! use multi_trait::EncodeIntoBuffer;
143//!
144//! // Create a reusable buffer
145//! let mut buffer = Vec::with_capacity(100);
146//!
147//! // Encode multiple values with no additional allocations
148//! 42u8.encode_into_buffer(&mut buffer);
149//! 1000u16.encode_into_buffer(&mut buffer);
150//! 100000u32.encode_into_buffer(&mut buffer);
151//!
152//! // All three values encoded in one buffer
153//! println!("Encoded {} bytes", buffer.len());
154//! ```
155//!
156//! ## Stack-Based Encoding (No Heap)
157//!
158//! The [`EncodeIntoArray`] trait provides stack-only encoding for embedded systems:
159//!
160//! ```rust
161//! use multi_trait::EncodeIntoArray;
162//!
163//! // Encode to stack-allocated array (no heap)
164//! let (array, len) = 42u8.encode_into_array();
165//! assert_eq!(&array[..len], &[42]);
166//!
167//! // Maximum sizes known at compile time
168//! assert_eq!(<u32 as EncodeIntoArray>::MAX_ENCODED_SIZE, 5);
169//! ```
170//!
171//! ## Type Safety with Validated Newtypes
172//!
173//! The [`EncodedBytes`] newtype provides compile-time guarantees that bytes
174//! represent valid varint encodings:
175//!
176//! ```rust
177//! use multi_trait::EncodedBytes;
178//!
179//! // Validation happens at construction
180//! let valid = vec![42u8];
181//! let encoded = EncodedBytes::try_from(valid).unwrap();
182//!
183//! // Invalid data is rejected
184//! let invalid = vec![0x80]; // Truncated varint
185//! assert!(EncodedBytes::try_from(invalid).is_err());
186//!
187//! // Type system ensures valid data
188//! fn process_encoded(data: EncodedBytes) {
189//!     // No need to validate - type guarantees validity
190//!     println!("Processing {} bytes", data.len());
191//! }
192//! ```
193//!
194//! ## Performance Characteristics
195//!
196//! - **`EncodeInto`**: Single allocation, O(1) complexity for finding varint length
197//! - **`EncodeIntoBuffer`**: Zero allocations (reuses buffer capacity), ideal for hot paths
198//! - **`EncodeIntoArray`**: Zero heap allocations (stack only), deterministic performance
199//! - **`TryDecodeFrom`**: Zero allocations, returns slice references
200//! - **Varint format**: Compact representation, 1-10 bytes per integer depending on value
201//!
202//! ## Thread Safety
203//!
204//! All traits and types in this crate are `Send + Sync`, making them safe to use
205//! in concurrent contexts. This section documents the thread-safety guarantees.
206//!
207//! ### Trait Implementations
208//!
209//! All trait implementations (`EncodeInto`, `TryDecodeFrom`, `Null`, `TryNull`)
210//! are stateless and immutable, providing these guarantees:
211//!
212//! - **`Send`**: Values can be transferred between threads
213//! - **`Sync`**: References can be shared between threads
214//! - **No locks required**: All operations are lock-free
215//! - **No data races**: No mutable state is shared
216//!
217//! ### Type Safety
218//!
219//! The [`EncodedBytes`] newtype is explicitly marked as `Send + Sync`:
220//!
221//! ```rust
222//! use multi_trait::EncodedBytes;
223//! use std::sync::Arc;
224//! use std::thread;
225//!
226//! let encoded = EncodedBytes::new(&[42]).unwrap();
227//! let shared = Arc::new(encoded);
228//!
229//! // Can be shared across threads safely
230//! let handles: Vec<_> = (0..4)
231//!     .map(|_| {
232//!         let data = Arc::clone(&shared);
233//!         thread::spawn(move || {
234//!             assert_eq!(&data[..], &[42]);
235//!         })
236//!     })
237//!     .collect();
238//!
239//! for handle in handles {
240//!     handle.join().unwrap();
241//! }
242//! ```
243//!
244//! ### Concurrency Patterns
245//!
246//! Common patterns that work safely:
247//!
248//! - **Parallel encoding**: Multiple threads can encode different values simultaneously
249//! - **Shared decoding**: Multiple threads can decode from the same source data
250//! - **Pipeline processing**: Encode in one thread, decode in another
251//! - **Work stealing**: Tasks can move between threads freely
252//!
253//! ## Feature Flags
254//!
255//! - **`std`** (default): Enables standard library support
256//!   - Disable for `no_std` environments: `default-features = false`
257//!   - Requires `alloc` when disabled (for `Vec<u8>` support)
258//!
259//! ## no_std Support
260//!
261//! This crate works in `no_std` environments with `alloc`:
262//!
263//! ```toml
264//! [dependencies]
265//! multitrait = { version = "1.0", default-features = false }
266//! ```
267//!
268//! ## Implementation Details
269//!
270//! The crate uses production-quality declarative macros to eliminate code duplication
271//! while maintaining zero runtime overhead. All encoding/decoding implementations
272//! are generated at compile time with full type safety.
273#![warn(missing_docs)]
274#![deny(
275    trivial_casts,
276    trivial_numeric_casts,
277    unused_import_braces,
278    unused_qualifications
279)]
280#![cfg_attr(not(feature = "std"), no_std)]
281
282#[cfg(not(feature = "std"))]
283extern crate alloc;
284
285/// Errors generated from the implementations
286pub mod error;
287pub use error::Error;
288
289/// EncodeInto trait
290pub mod enc_into;
291pub use enc_into::EncodeInto;
292
293/// EncodeIntoBuffer trait for zero-allocation encoding
294pub mod enc_into_buffer;
295pub use enc_into_buffer::EncodeIntoBuffer;
296
297/// EncodeIntoArray trait for stack-based encoding
298pub mod enc_into_array;
299pub use enc_into_array::EncodeIntoArray;
300
301/// Null and TryNull traits
302pub mod null;
303pub use null::{Null, TryNull};
304
305/// TryDecodeFrom trait
306pub mod try_decode_from;
307pub use try_decode_from::TryDecodeFrom;
308
309/// Validated newtype for encoded bytes
310pub mod encoded_bytes;
311pub use encoded_bytes::EncodedBytes;
312
313/// one-stop shop for all exported symbols
314pub mod prelude {
315    pub use super::{
316        enc_into::*, enc_into_array::*, enc_into_buffer::*, encoded_bytes::*, null::*,
317        try_decode_from::*,
318    };
319}
320
321#[cfg(test)]
322mod test {
323    use super::prelude::*;
324
325    #[test]
326    fn test_bool() {
327        let tbuf = true.encode_into();
328        let (tval, _) = bool::try_decode_from(&tbuf).unwrap();
329        assert!(tval);
330        let fbuf = false.encode_into();
331        let (fval, _) = bool::try_decode_from(&fbuf).unwrap();
332        assert!(!fval);
333    }
334
335    #[test]
336    fn test_u8() {
337        let buf = 0xff_u8.encode_into();
338        let (num, _) = u8::try_decode_from(&buf).unwrap();
339        assert_eq!(0xff_u8, num);
340    }
341
342    #[test]
343    fn test_u16() {
344        let buf = 0xffee_u16.encode_into();
345        let (num, _) = u16::try_decode_from(&buf).unwrap();
346        assert_eq!(0xffee_u16, num);
347    }
348
349    #[test]
350    fn test_u32() {
351        let buf = 0xffee_ddcc_u32.encode_into();
352        let (num, _) = u32::try_decode_from(&buf).unwrap();
353        assert_eq!(0xffee_ddcc_u32, num);
354    }
355
356    #[test]
357    fn test_u64() {
358        let buf = 0xffee_ddcc_bbaa_9988_u64.encode_into();
359        let (num, _) = u64::try_decode_from(&buf).unwrap();
360        assert_eq!(0xffee_ddcc_bbaa_9988_u64, num);
361    }
362
363    #[test]
364    fn test_u128() {
365        let buf = 0xffee_ddcc_bbaa_9988_7766_5544_3322_1100_u128.encode_into();
366        let (num, _) = u128::try_decode_from(&buf).unwrap();
367        assert_eq!(0xffee_ddcc_bbaa_9988_7766_5544_3322_1100_u128, num);
368    }
369
370    #[cfg(target_pointer_width = "64")]
371    #[test]
372    fn test_usize() {
373        let buf = 0xffee_ddcc_bbaa_9988_usize.encode_into();
374        let (num, _) = usize::try_decode_from(&buf).unwrap();
375        assert_eq!(0xffee_ddcc_bbaa_9988_usize, num);
376    }
377
378    #[cfg(target_pointer_width = "32")]
379    #[test]
380    fn test_usize() {
381        let buf = 0xffeeddcc_usize.encode_into();
382        let (num, _) = usize::try_decode_from(&buf).unwrap();
383        assert_eq!(0xffeeddcc_usize, num);
384    }
385
386    struct Foo(usize);
387
388    impl Null for Foo {
389        fn null() -> Self {
390            Foo(0)
391        }
392        fn is_null(&self) -> bool {
393            self.0 == 0
394        }
395    }
396
397    impl TryNull for Foo {
398        type Error = &'static str;
399
400        fn try_null() -> Result<Self, Self::Error> {
401            Ok(Foo(0))
402        }
403        fn is_null(&self) -> bool {
404            self.0 == 0
405        }
406    }
407
408    #[test]
409    fn test_null_value() {
410        let f = Foo::null();
411        assert!(Null::is_null(&f));
412    }
413
414    #[test]
415    fn test_try_null_value() {
416        let f = Foo::try_null().unwrap();
417        assert!(TryNull::is_null(&f));
418    }
419
420    // ========================================================================
421    // Error Case Tests
422    // ========================================================================
423
424    #[test]
425    fn test_decode_empty_slice_u8() {
426        let empty: &[u8] = &[];
427        let result = u8::try_decode_from(empty);
428        assert!(result.is_err(), "Should fail to decode from empty slice");
429    }
430
431    #[test]
432    fn test_decode_empty_slice_u16() {
433        let empty: &[u8] = &[];
434        let result = u16::try_decode_from(empty);
435        assert!(result.is_err(), "Should fail to decode from empty slice");
436    }
437
438    #[test]
439    fn test_decode_empty_slice_u32() {
440        let empty: &[u8] = &[];
441        let result = u32::try_decode_from(empty);
442        assert!(result.is_err(), "Should fail to decode from empty slice");
443    }
444
445    #[test]
446    fn test_decode_empty_slice_u64() {
447        let empty: &[u8] = &[];
448        let result = u64::try_decode_from(empty);
449        assert!(result.is_err(), "Should fail to decode from empty slice");
450    }
451
452    #[test]
453    fn test_decode_empty_slice_u128() {
454        let empty: &[u8] = &[];
455        let result = u128::try_decode_from(empty);
456        assert!(result.is_err(), "Should fail to decode from empty slice");
457    }
458
459    #[test]
460    fn test_decode_empty_slice_bool() {
461        let empty: &[u8] = &[];
462        let result = bool::try_decode_from(empty);
463        assert!(result.is_err(), "Should fail to decode from empty slice");
464    }
465
466    #[test]
467    fn test_decode_truncated_varint() {
468        // A varint with continuation bit set but no following byte
469        let truncated = vec![0x80]; // MSB set, indicates more bytes follow
470        let result = u16::try_decode_from(&truncated);
471        assert!(result.is_err(), "Should fail on truncated varint");
472    }
473
474    #[test]
475    fn test_decode_truncated_large_varint() {
476        // Incomplete multi-byte varint
477        let truncated = vec![0xFF, 0xFF]; // Two bytes with continuation bits
478        let result = u32::try_decode_from(&truncated);
479        assert!(result.is_err(), "Should fail on truncated large varint");
480    }
481
482    // ========================================================================
483    // Edge Case Tests
484    // ========================================================================
485
486    #[test]
487    fn test_encode_decode_zero_values() {
488        // Test zero value for all types
489        assert_eq!(0u8.encode_into(), vec![0]);
490        assert_eq!(0u16.encode_into(), vec![0]);
491        assert_eq!(0u32.encode_into(), vec![0]);
492        assert_eq!(0u64.encode_into(), vec![0]);
493        assert_eq!(0u128.encode_into(), vec![0]);
494        assert_eq!(0usize.encode_into(), vec![0]);
495
496        // Verify decode
497        let (val, rest) = u8::try_decode_from(&[0]).unwrap();
498        assert_eq!(val, 0);
499        assert!(rest.is_empty());
500    }
501
502    #[test]
503    fn test_encode_decode_max_u8() {
504        let max = u8::MAX;
505        let encoded = max.encode_into();
506        let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
507        assert_eq!(decoded, max);
508        assert!(remaining.is_empty());
509    }
510
511    #[test]
512    fn test_encode_decode_max_u16() {
513        let max = u16::MAX;
514        let encoded = max.encode_into();
515        let (decoded, remaining) = u16::try_decode_from(&encoded).unwrap();
516        assert_eq!(decoded, max);
517        assert!(remaining.is_empty());
518    }
519
520    #[test]
521    fn test_encode_decode_max_u32() {
522        let max = u32::MAX;
523        let encoded = max.encode_into();
524        let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
525        assert_eq!(decoded, max);
526        assert!(remaining.is_empty());
527    }
528
529    #[test]
530    fn test_encode_decode_max_u64() {
531        let max = u64::MAX;
532        let encoded = max.encode_into();
533        let (decoded, remaining) = u64::try_decode_from(&encoded).unwrap();
534        assert_eq!(decoded, max);
535        assert!(remaining.is_empty());
536    }
537
538    #[test]
539    fn test_encode_decode_max_u128() {
540        let max = u128::MAX;
541        let encoded = max.encode_into();
542        let (decoded, remaining) = u128::try_decode_from(&encoded).unwrap();
543        assert_eq!(decoded, max);
544        assert!(remaining.is_empty());
545    }
546
547    #[test]
548    fn test_varint_boundary_127() {
549        // 127 should encode in 1 byte (last value that fits in 7 bits)
550        let val = 127u8;
551        let encoded = val.encode_into();
552        assert_eq!(encoded.len(), 1);
553        let (decoded, _) = u8::try_decode_from(&encoded).unwrap();
554        assert_eq!(decoded, val);
555    }
556
557    #[test]
558    fn test_varint_boundary_128() {
559        // 128 should require 2 bytes (first value needing continuation)
560        let val = 128u8;
561        let encoded = val.encode_into();
562        assert_eq!(encoded.len(), 2);
563        let (decoded, _) = u8::try_decode_from(&encoded).unwrap();
564        assert_eq!(decoded, val);
565    }
566
567    #[test]
568    fn test_bool_nonzero_as_true() {
569        // Any non-zero value should decode as true
570        let bytes = vec![42];
571        let (val, _) = bool::try_decode_from(&bytes).unwrap();
572        assert!(val);
573    }
574
575    // ========================================================================
576    // Round-Trip Tests
577    // ========================================================================
578
579    #[test]
580    fn test_roundtrip_u8_range() {
581        // Test a range of u8 values
582        for value in [0, 1, 127, 128, 255] {
583            let encoded = value.encode_into();
584            let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
585            assert_eq!(decoded, value, "Round-trip failed for u8 value {}", value);
586            assert!(remaining.is_empty());
587        }
588    }
589
590    #[test]
591    fn test_roundtrip_u16_range() {
592        // Test various u16 values including boundaries
593        for value in [0, 1, 127, 128, 255, 256, 16383, 16384, 65535] {
594            let encoded = value.encode_into();
595            let (decoded, remaining) = u16::try_decode_from(&encoded).unwrap();
596            assert_eq!(decoded, value, "Round-trip failed for u16 value {}", value);
597            assert!(remaining.is_empty());
598        }
599    }
600
601    #[test]
602    fn test_roundtrip_u32_range() {
603        // Test various u32 values
604        for value in [0, 1, 127, 128, 16384, 65536, u32::MAX] {
605            let encoded = value.encode_into();
606            let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
607            assert_eq!(decoded, value, "Round-trip failed for u32 value {}", value);
608            assert!(remaining.is_empty());
609        }
610    }
611
612    #[test]
613    fn test_roundtrip_u64_range() {
614        // Test various u64 values
615        for value in [0, 1, 127, 128, 65536, u32::MAX as u64, u64::MAX] {
616            let encoded = value.encode_into();
617            let (decoded, remaining) = u64::try_decode_from(&encoded).unwrap();
618            assert_eq!(decoded, value, "Round-trip failed for u64 value {}", value);
619            assert!(remaining.is_empty());
620        }
621    }
622
623    #[test]
624    fn test_roundtrip_bool() {
625        for value in [true, false] {
626            let encoded = value.encode_into();
627            let (decoded, remaining) = bool::try_decode_from(&encoded).unwrap();
628            assert_eq!(decoded, value, "Round-trip failed for bool {}", value);
629            assert!(remaining.is_empty());
630        }
631    }
632
633    #[test]
634    fn test_sequential_decode() {
635        // Encode multiple values into one buffer
636        let mut buffer = Vec::new();
637        buffer.extend_from_slice(&42u8.encode_into());
638        buffer.extend_from_slice(&1000u16.encode_into());
639        buffer.extend_from_slice(&100_000_u32.encode_into());
640
641        // Decode sequentially
642        let (val1, rest) = u8::try_decode_from(&buffer).unwrap();
643        assert_eq!(val1, 42);
644
645        let (val2, rest) = u16::try_decode_from(rest).unwrap();
646        assert_eq!(val2, 1000);
647
648        let (val3, rest) = u32::try_decode_from(rest).unwrap();
649        assert_eq!(val3, 100_000);
650
651        assert!(rest.is_empty(), "Should have consumed all bytes");
652    }
653
654    #[test]
655    fn test_remaining_bytes_returned() {
656        // Verify that decode returns unconsumed bytes
657        let mut buffer = Vec::new();
658        buffer.extend_from_slice(&42u8.encode_into());
659        buffer.extend_from_slice(&[0xFF, 0xEE, 0xDD]); // Extra bytes
660
661        let (val, remaining) = u8::try_decode_from(&buffer).unwrap();
662        assert_eq!(val, 42);
663        assert_eq!(remaining, &[0xFF, 0xEE, 0xDD]);
664    }
665
666    #[test]
667    fn test_encode_length_efficiency() {
668        // Verify varint encoding is space-efficient
669        assert_eq!(0u8.encode_into().len(), 1);
670        assert_eq!(127u8.encode_into().len(), 1);
671        assert_eq!(128u8.encode_into().len(), 2);
672        assert_eq!(255u8.encode_into().len(), 2);
673
674        // Larger values should use more bytes
675        assert!(u16::MAX.encode_into().len() > 1);
676        assert!(u32::MAX.encode_into().len() > 2);
677    }
678
679    // ========================================================================
680    // Property-Based Tests (using proptest)
681    // ========================================================================
682
683    use proptest::prelude::*;
684
685    proptest! {
686        #[test]
687        fn prop_roundtrip_u8(value: u8) {
688            let encoded = value.encode_into();
689            let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
690            prop_assert_eq!(decoded, value);
691            prop_assert!(remaining.is_empty());
692        }
693
694        #[test]
695        fn prop_roundtrip_u16(value: u16) {
696            let encoded = value.encode_into();
697            let (decoded, remaining) = u16::try_decode_from(&encoded).unwrap();
698            prop_assert_eq!(decoded, value);
699            prop_assert!(remaining.is_empty());
700        }
701
702        #[test]
703        fn prop_roundtrip_u32(value: u32) {
704            let encoded = value.encode_into();
705            let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
706            prop_assert_eq!(decoded, value);
707            prop_assert!(remaining.is_empty());
708        }
709
710        #[test]
711        fn prop_roundtrip_u64(value: u64) {
712            let encoded = value.encode_into();
713            let (decoded, remaining) = u64::try_decode_from(&encoded).unwrap();
714            prop_assert_eq!(decoded, value);
715            prop_assert!(remaining.is_empty());
716        }
717
718        #[test]
719        fn prop_roundtrip_u128(value: u128) {
720            let encoded = value.encode_into();
721            let (decoded, remaining) = u128::try_decode_from(&encoded).unwrap();
722            prop_assert_eq!(decoded, value);
723            prop_assert!(remaining.is_empty());
724        }
725
726        #[test]
727        fn prop_roundtrip_usize(value: usize) {
728            let encoded = value.encode_into();
729            let (decoded, remaining) = usize::try_decode_from(&encoded).unwrap();
730            prop_assert_eq!(decoded, value);
731            prop_assert!(remaining.is_empty());
732        }
733
734        #[test]
735        fn prop_roundtrip_bool(value: bool) {
736            let encoded = value.encode_into();
737            let (decoded, remaining) = bool::try_decode_from(&encoded).unwrap();
738            prop_assert_eq!(decoded, value);
739            prop_assert!(remaining.is_empty());
740        }
741
742        #[test]
743        fn prop_encode_not_empty(value: u32) {
744            let encoded = value.encode_into();
745            prop_assert!(!encoded.is_empty());
746        }
747
748        #[test]
749        fn prop_encode_deterministic(value: u64) {
750            let encoded1 = value.encode_into();
751            let encoded2 = value.encode_into();
752            prop_assert_eq!(encoded1, encoded2);
753        }
754
755        #[test]
756        fn prop_small_values_compact(value in 0u32..128) {
757            let encoded = value.encode_into();
758            prop_assert_eq!(encoded.len(), 1, "Values under 128 should encode in 1 byte");
759        }
760
761        #[test]
762        fn prop_sequential_decode(v1: u8, v2: u16, v3: u32) {
763            let mut buffer = Vec::new();
764            buffer.extend_from_slice(&v1.encode_into());
765            buffer.extend_from_slice(&v2.encode_into());
766            buffer.extend_from_slice(&v3.encode_into());
767
768            let (d1, rest) = u8::try_decode_from(&buffer).unwrap();
769            prop_assert_eq!(d1, v1);
770
771            let (d2, rest) = u16::try_decode_from(rest).unwrap();
772            prop_assert_eq!(d2, v2);
773
774            let (d3, rest) = u32::try_decode_from(rest).unwrap();
775            prop_assert_eq!(d3, v3);
776
777            prop_assert!(rest.is_empty());
778        }
779    }
780
781    // ========================================================================
782    // Thread-Safety Tests (Compile-Time Verification)
783    // ========================================================================
784
785    /// Compile-time verification that Error is Send + Sync
786    #[test]
787    fn assert_error_send_sync() {
788        fn is_send<T: Send>() {}
789        fn is_sync<T: Sync>() {}
790        is_send::<crate::Error>();
791        is_sync::<crate::Error>();
792    }
793
794    /// Compile-time verification that EncodedBytes is Send + Sync
795    #[test]
796    fn assert_encoded_bytes_send_sync() {
797        fn is_send<T: Send>() {}
798        fn is_sync<T: Sync>() {}
799        is_send::<EncodedBytes>();
800        is_sync::<EncodedBytes>();
801    }
802
803    #[test]
804    fn test_encoded_bytes_valid() {
805        let bytes = vec![42];
806        let encoded = EncodedBytes::try_from(bytes).unwrap();
807        assert_eq!(encoded.as_ref(), &[42]);
808    }
809
810    #[test]
811    fn test_encoded_bytes_invalid_empty() {
812        let empty: Vec<u8> = vec![];
813        assert!(EncodedBytes::try_from(empty).is_err());
814    }
815
816    #[test]
817    fn test_encoded_bytes_invalid_truncated() {
818        let truncated = vec![0x80];
819        assert!(EncodedBytes::try_from(truncated).is_err());
820    }
821
822    #[test]
823    fn test_encoded_bytes_into_vec() {
824        // Use a single varint encoding (128 requires 2 bytes: [0x80, 0x01])
825        let original = 128u8.encode_into();
826        let encoded = EncodedBytes::new(&original).unwrap();
827        let recovered: Vec<u8> = encoded.into();
828        assert_eq!(recovered, original);
829    }
830
831    #[cfg(feature = "std")]
832    #[test]
833    fn test_encoded_bytes_thread_safe() {
834        use std::sync::Arc;
835        use std::thread;
836
837        let encoded = EncodedBytes::new(&[42]).unwrap();
838        let shared = Arc::new(encoded);
839
840        let handles: Vec<_> = (0..4)
841            .map(|_| {
842                let data = Arc::clone(&shared);
843                thread::spawn(move || {
844                    assert_eq!(&data[..], &[42]);
845                })
846            })
847            .collect();
848
849        for handle in handles {
850            handle.join().unwrap();
851        }
852    }
853
854    // ========================================================================
855    // Security Tests - Malicious Input Handling
856    // ========================================================================
857
858    #[test]
859    fn security_test_all_continuation_bits() {
860        // All bytes have continuation bit set (0xFF = all 1s)
861        let malicious = vec![0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
862        let result = u64::try_decode_from(&malicious);
863        // Should fail due to too many bytes or overflow
864        assert!(
865            result.is_err(),
866            "Should reject all-continuation-bit sequence"
867        );
868    }
869
870    #[test]
871    fn security_test_maximum_length_varint_u64() {
872        // u64::MAX encoded as varint (10 bytes)
873        let max_encoded = u64::MAX.encode_into();
874        assert_eq!(max_encoded.len(), 10);
875        let (decoded, remaining) = u64::try_decode_from(&max_encoded).unwrap();
876        assert_eq!(decoded, u64::MAX);
877        assert!(remaining.is_empty());
878    }
879
880    #[test]
881    fn security_test_maximum_length_varint_u128() {
882        // u128::MAX encoded as varint (19 bytes)
883        let max_encoded = u128::MAX.encode_into();
884        assert_eq!(max_encoded.len(), 19);
885        let (decoded, remaining) = u128::try_decode_from(&max_encoded).unwrap();
886        assert_eq!(decoded, u128::MAX);
887        assert!(remaining.is_empty());
888    }
889
890    #[test]
891    fn security_test_single_byte_with_continuation() {
892        // Single byte with continuation bit but no follow-up
893        let malicious = vec![0x80];
894        assert!(u8::try_decode_from(&malicious).is_err());
895        assert!(u16::try_decode_from(&malicious).is_err());
896        assert!(u32::try_decode_from(&malicious).is_err());
897        assert!(u64::try_decode_from(&malicious).is_err());
898    }
899
900    #[test]
901    fn security_test_multiple_continuation_bytes_truncated() {
902        // Multiple continuation bytes that end prematurely
903        let malicious = vec![0xFF, 0xFF, 0xFF];
904        assert!(u32::try_decode_from(&malicious).is_err());
905    }
906
907    #[test]
908    fn security_test_encoded_bytes_rejects_invalid() {
909        // Test that EncodedBytes rejects various invalid inputs
910
911        // Empty
912        assert!(EncodedBytes::try_from(vec![]).is_err());
913
914        // Truncated varint
915        assert!(EncodedBytes::try_from(vec![0x80]).is_err());
916
917        // Trailing bytes after valid varint
918        let mut with_trailing = vec![42];
919        with_trailing.extend_from_slice(&[0xFF, 0xEE]);
920        assert!(EncodedBytes::try_from(with_trailing).is_err());
921
922        // All continuation bits
923        assert!(EncodedBytes::try_from(vec![0xFF, 0xFF, 0xFF]).is_err());
924    }
925
926    #[test]
927    fn security_test_buffer_encoding_no_overflow() {
928        // Ensure buffer encoding doesn't overflow with many values
929        let mut buffer = Vec::new();
930
931        // Encode 1000 values
932        for i in 0u16..1000 {
933            i.encode_into_buffer(&mut buffer);
934        }
935
936        // Should have successfully encoded without panic
937        assert!(buffer.len() > 1000); // At least 1 byte per value, some more
938        assert!(buffer.len() < 3000); // At most 3 bytes per u16 value
939    }
940
941    #[test]
942    fn security_test_array_encoding_bounds() {
943        // Verify array encoding respects bounds for max values
944        let (array, len) = u128::MAX.encode_into_array();
945        assert!(len <= 19, "u128::MAX should not exceed 19 bytes");
946
947        // Verify the encoded data is valid
948        let (decoded, _) = u128::try_decode_from(&array[..len]).unwrap();
949        assert_eq!(decoded, u128::MAX);
950    }
951
952    #[test]
953    fn security_test_bool_decode_nonzero_values() {
954        // Any non-zero value within u8 range should decode as true
955        let nonzero_values = vec![
956            vec![1],          // 1
957            vec![42],         // 42
958            vec![127],        // 127
959            vec![0xFF, 0x01], // 255 (max u8)
960        ];
961
962        for bytes in nonzero_values {
963            let (val, _) = bool::try_decode_from(&bytes).unwrap();
964            assert!(val, "Non-zero value {:?} should decode as true", bytes);
965        }
966
967        // Zero should decode as false
968        let (val, _) = bool::try_decode_from(&[0]).unwrap();
969        assert!(!val);
970    }
971
972    #[test]
973    fn security_test_zero_length_slice_rejection() {
974        // Zero-length slices should be rejected for all types
975        let empty: &[u8] = &[];
976
977        assert!(u8::try_decode_from(empty).is_err());
978        assert!(u16::try_decode_from(empty).is_err());
979        assert!(u32::try_decode_from(empty).is_err());
980        assert!(u64::try_decode_from(empty).is_err());
981        assert!(u128::try_decode_from(empty).is_err());
982        assert!(usize::try_decode_from(empty).is_err());
983        assert!(bool::try_decode_from(empty).is_err());
984    }
985
986    #[test]
987    fn security_test_repeated_decoding_no_panic() {
988        // Decode the same malicious data repeatedly to check for panics
989        let malicious = vec![0xFF, 0xFF];
990
991        for _ in 0..100 {
992            let _ = u32::try_decode_from(&malicious);
993            let _ = u64::try_decode_from(&malicious);
994        }
995    }
996
997    #[test]
998    fn security_test_alternating_bit_patterns() {
999        // Test various bit patterns that might trigger edge cases
1000        let patterns = vec![
1001            vec![0xAA], // 10101010
1002            vec![0x55], // 01010101
1003            vec![0xAA, 0x55],
1004            vec![0x55, 0xAA],
1005        ];
1006
1007        for pattern in patterns {
1008            // These should either decode successfully or return an error
1009            // but must not panic
1010            let _ = u8::try_decode_from(&pattern);
1011            let _ = u16::try_decode_from(&pattern);
1012        }
1013    }
1014
1015    // ========================================================================
1016    // Security Tests - Fuzzing-Style Property Tests
1017    // ========================================================================
1018
1019    proptest! {
1020        #[test]
1021        fn security_prop_decode_random_bytes(bytes in prop::collection::vec(any::<u8>(), 0..50)) {
1022            // Random bytes should either decode successfully or return an error
1023            // but must not panic
1024            let _ = u8::try_decode_from(&bytes);
1025            let _ = u16::try_decode_from(&bytes);
1026            let _ = u32::try_decode_from(&bytes);
1027            let _ = u64::try_decode_from(&bytes);
1028            let _ = u128::try_decode_from(&bytes);
1029        }
1030
1031        #[test]
1032        fn security_prop_encoded_bytes_validation(bytes in prop::collection::vec(any::<u8>(), 0..100)) {
1033            // EncodedBytes validation should never panic, only return Ok or Err
1034            let result = EncodedBytes::try_from(bytes);
1035
1036            // If it succeeds, the data should be valid
1037            if let Ok(encoded) = result {
1038                // Should be able to decode as u128 (covers all smaller types)
1039                let decode_result = u128::try_decode_from(encoded.as_ref());
1040                prop_assert!(decode_result.is_ok(), "Validated EncodedBytes should be decodable");
1041            }
1042        }
1043
1044        #[test]
1045        fn security_prop_buffer_encoding_no_panic(values in prop::collection::vec(any::<u32>(), 0..1000)) {
1046            // Encoding many values into a buffer should not panic
1047            let mut buffer = Vec::new();
1048            for value in values {
1049                value.encode_into_buffer(&mut buffer);
1050            }
1051
1052            // Buffer should have reasonable size
1053            prop_assert!(buffer.len() < 5000, "Buffer should not grow excessively");
1054        }
1055
1056        #[test]
1057        fn security_prop_array_encoding_never_panics(value: u128) {
1058            // Array encoding should never panic for any value
1059            let (_array, len) = value.encode_into_array();
1060
1061            // Length should be within bounds
1062            prop_assert!(len > 0);
1063            prop_assert!(len <= 19);
1064
1065            // Encode again to get array for decoding
1066            let (array, len) = value.encode_into_array();
1067            let (decoded, _) = u128::try_decode_from(&array[..len]).unwrap();
1068            prop_assert_eq!(decoded, value);
1069        }
1070
1071        #[test]
1072        fn security_prop_decode_never_returns_more_than_input(
1073            bytes in prop::collection::vec(any::<u8>(), 1..100)
1074        ) {
1075            // Decoded remainder should never be larger than input
1076            if let Ok((_, remaining)) = u64::try_decode_from(&bytes) {
1077                prop_assert!(remaining.len() <= bytes.len());
1078            }
1079        }
1080
1081        #[test]
1082        fn security_prop_encode_size_bounded(value: u64) {
1083            // Encoded size should never exceed maximum varint size for the type
1084            let encoded = value.encode_into();
1085            prop_assert!(encoded.len() <= 10, "u64 varint should not exceed 10 bytes");
1086
1087            let (_array, len) = value.encode_into_array();
1088            prop_assert!(len <= 10, "u64 array encoding should not exceed 10 bytes");
1089        }
1090    }
1091
1092    // ========================================================================
1093    // Concurrency Tests - Compile-Time Send + Sync Verification
1094    // ========================================================================
1095
1096    /// Verify that primitive types used with traits are Send + Sync
1097    #[test]
1098    fn assert_primitives_send_sync() {
1099        fn is_send<T: Send>() {}
1100        fn is_sync<T: Sync>() {}
1101
1102        // All integer types should be Send + Sync
1103        is_send::<u8>();
1104        is_sync::<u8>();
1105        is_send::<u16>();
1106        is_sync::<u16>();
1107        is_send::<u32>();
1108        is_sync::<u32>();
1109        is_send::<u64>();
1110        is_sync::<u64>();
1111        is_send::<u128>();
1112        is_sync::<u128>();
1113        is_send::<usize>();
1114        is_sync::<usize>();
1115        is_send::<bool>();
1116        is_sync::<bool>();
1117
1118        // Vec<u8> should be Send + Sync
1119        is_send::<Vec<u8>>();
1120        is_sync::<Vec<u8>>();
1121    }
1122
1123    /// Verify that encoded data types are Send + Sync
1124    #[test]
1125    fn assert_encoded_types_send_sync() {
1126        fn is_send<T: Send>() {}
1127        fn is_sync<T: Sync>() {}
1128
1129        // EncodedBytes should be Send + Sync
1130        is_send::<EncodedBytes>();
1131        is_sync::<EncodedBytes>();
1132
1133        // Error should be Send + Sync
1134        is_send::<crate::Error>();
1135        is_sync::<crate::Error>();
1136    }
1137
1138    // ========================================================================
1139    // Concurrency Tests - Multi-Threaded Encoding
1140    // ========================================================================
1141
1142    #[cfg(feature = "std")]
1143    #[test]
1144    fn concurrency_test_parallel_encode_into() {
1145        use std::sync::Arc;
1146        use std::sync::Mutex;
1147        use std::thread;
1148
1149        // Encode values in parallel threads
1150        let results = Arc::new(Mutex::new(Vec::new()));
1151        let handles: Vec<_> = (0..10)
1152            .map(|i| {
1153                let results = Arc::clone(&results);
1154                thread::spawn(move || {
1155                    let value = i as u32 * 100;
1156                    let encoded = value.encode_into();
1157                    results.lock().unwrap().push((value, encoded));
1158                })
1159            })
1160            .collect();
1161
1162        for handle in handles {
1163            handle.join().unwrap();
1164        }
1165
1166        // Verify all encodings are correct
1167        let results = results.lock().unwrap();
1168        assert_eq!(results.len(), 10);
1169        for (original, encoded) in results.iter() {
1170            let (decoded, _) = u32::try_decode_from(encoded).unwrap();
1171            assert_eq!(*original, decoded);
1172        }
1173    }
1174
1175    #[cfg(feature = "std")]
1176    #[test]
1177    fn concurrency_test_parallel_encode_into_buffer() {
1178        use std::thread;
1179
1180        // Each thread gets its own buffer
1181        let handles: Vec<_> = (0..10)
1182            .map(|i| {
1183                thread::spawn(move || {
1184                    let mut buffer = Vec::new();
1185                    for j in 0u16..100 {
1186                        (i * 100 + j).encode_into_buffer(&mut buffer);
1187                    }
1188                    buffer
1189                })
1190            })
1191            .collect();
1192
1193        for handle in handles {
1194            let buffer = handle.join().unwrap();
1195            assert!(buffer.len() >= 100); // At least 1 byte per value
1196            assert!(buffer.len() < 300); // At most 3 bytes per u16
1197        }
1198    }
1199
1200    #[cfg(feature = "std")]
1201    #[test]
1202    fn concurrency_test_parallel_encode_into_array() {
1203        use std::thread;
1204
1205        // Array encoding is purely stack-based, perfect for parallelism
1206        let handles: Vec<_> = (0..10)
1207            .map(|i| {
1208                thread::spawn(move || {
1209                    let value = i as u64 * 1000;
1210                    let (array, len) = value.encode_into_array();
1211                    (value, array, len)
1212                })
1213            })
1214            .collect();
1215
1216        for handle in handles {
1217            let (original, array, len) = handle.join().unwrap();
1218            let (decoded, _) = u64::try_decode_from(&array[..len]).unwrap();
1219            assert_eq!(original, decoded);
1220        }
1221    }
1222
1223    // ========================================================================
1224    // Concurrency Tests - Multi-Threaded Decoding
1225    // ========================================================================
1226
1227    #[cfg(feature = "std")]
1228    #[test]
1229    fn concurrency_test_shared_decode_data() {
1230        use std::sync::Arc;
1231        use std::thread;
1232
1233        // Pre-encode some data
1234        let mut data = Vec::new();
1235        for i in 0u32..100 {
1236            data.extend_from_slice(&i.encode_into());
1237        }
1238        let shared_data = Arc::new(data);
1239
1240        // Multiple threads decode from the same data
1241        let handles: Vec<_> = (0..4)
1242            .map(|_| {
1243                let data = Arc::clone(&shared_data);
1244                thread::spawn(move || {
1245                    let mut slice = &data[..];
1246                    let mut count = 0;
1247                    while !slice.is_empty() {
1248                        match u32::try_decode_from(slice) {
1249                            Ok((_, remaining)) => {
1250                                count += 1;
1251                                slice = remaining;
1252                            }
1253                            Err(_) => break,
1254                        }
1255                    }
1256                    count
1257                })
1258            })
1259            .collect();
1260
1261        for handle in handles {
1262            let count = handle.join().unwrap();
1263            assert_eq!(count, 100, "All threads should decode 100 values");
1264        }
1265    }
1266
1267    #[cfg(feature = "std")]
1268    #[test]
1269    fn concurrency_test_parallel_decode_different_data() {
1270        use std::thread;
1271
1272        // Each thread decodes different data
1273        let handles: Vec<_> = (0..10)
1274            .map(|i| {
1275                thread::spawn(move || {
1276                    // Create encoded data
1277                    let mut data = Vec::new();
1278                    for j in 0u16..50 {
1279                        (i * 50 + j).encode_into_buffer(&mut data);
1280                    }
1281
1282                    // Decode it
1283                    let mut slice = &data[..];
1284                    let mut decoded_values = Vec::new();
1285                    while !slice.is_empty() {
1286                        match u16::try_decode_from(slice) {
1287                            Ok((value, remaining)) => {
1288                                decoded_values.push(value);
1289                                slice = remaining;
1290                            }
1291                            Err(_) => break,
1292                        }
1293                    }
1294                    decoded_values
1295                })
1296            })
1297            .collect();
1298
1299        for (i, handle) in handles.into_iter().enumerate() {
1300            let values = handle.join().unwrap();
1301            assert_eq!(values.len(), 50);
1302            // Verify first and last values
1303            assert_eq!(values[0], i as u16 * 50);
1304            assert_eq!(values[49], i as u16 * 50 + 49);
1305        }
1306    }
1307
1308    // ========================================================================
1309    // Concurrency Tests - Pipeline Processing
1310    // ========================================================================
1311
1312    #[cfg(feature = "std")]
1313    #[test]
1314    fn concurrency_test_pipeline_encode_decode() {
1315        use std::sync::mpsc;
1316        use std::thread;
1317
1318        let (tx, rx) = mpsc::channel();
1319
1320        // Encoder thread
1321        let encoder = thread::spawn(move || {
1322            for i in 0u32..1000 {
1323                tx.send(i.encode_into()).unwrap();
1324            }
1325        });
1326
1327        // Decoder thread
1328        let decoder = thread::spawn(move || {
1329            let mut sum = 0u64;
1330            for encoded in rx {
1331                let (value, _) = u32::try_decode_from(&encoded).unwrap();
1332                sum += value as u64;
1333            }
1334            sum
1335        });
1336
1337        encoder.join().unwrap();
1338        let sum = decoder.join().unwrap();
1339
1340        // Sum of 0..1000 = 999 * 1000 / 2 = 499500
1341        assert_eq!(sum, 499_500);
1342    }
1343
1344    #[cfg(feature = "std")]
1345    #[test]
1346    fn concurrency_test_multi_producer_single_consumer() {
1347        use std::sync::mpsc;
1348        use std::thread;
1349
1350        let (tx, rx) = mpsc::channel();
1351
1352        // Multiple producer threads
1353        let producers: Vec<_> = (0..4)
1354            .map(|thread_id| {
1355                let tx = tx.clone();
1356                thread::spawn(move || {
1357                    for i in 0u16..100 {
1358                        let value = thread_id * 100 + i;
1359                        tx.send(value.encode_into()).unwrap();
1360                    }
1361                })
1362            })
1363            .collect();
1364
1365        // Drop original sender
1366        drop(tx);
1367
1368        // Single consumer thread
1369        let consumer = thread::spawn(move || {
1370            let mut count = 0;
1371            for encoded in rx {
1372                let (value, _) = u16::try_decode_from(&encoded).unwrap();
1373                assert!(value < 400);
1374                count += 1;
1375            }
1376            count
1377        });
1378
1379        for producer in producers {
1380            producer.join().unwrap();
1381        }
1382
1383        let total = consumer.join().unwrap();
1384        assert_eq!(total, 400); // 4 threads * 100 values
1385    }
1386
1387    // ========================================================================
1388    // Concurrency Tests - Stress Testing
1389    // ========================================================================
1390
1391    #[cfg(feature = "std")]
1392    #[test]
1393    fn concurrency_test_stress_parallel_encoding() {
1394        use std::thread;
1395
1396        // Stress test with many threads
1397        let handles: Vec<_> = (0..100)
1398            .map(|i| {
1399                thread::spawn(move || {
1400                    let mut buffer = Vec::new();
1401                    for j in 0u8..255 {
1402                        ((i * 255 + j as u32) % u16::MAX as u32).encode_into_buffer(&mut buffer);
1403                    }
1404                    buffer.len()
1405                })
1406            })
1407            .collect();
1408
1409        let mut total_bytes = 0;
1410        for handle in handles {
1411            total_bytes += handle.join().unwrap();
1412        }
1413
1414        // Should have encoded 100 * 255 = 25500 values
1415        assert!(total_bytes >= 25500); // At least 1 byte per value
1416        assert!(total_bytes < 76500); // At most 3 bytes per value
1417    }
1418
1419    #[cfg(feature = "std")]
1420    #[test]
1421    fn concurrency_test_stress_shared_read() {
1422        use std::sync::Arc;
1423        use std::thread;
1424
1425        // Pre-encode a large dataset
1426        let mut data = Vec::new();
1427        for i in 0u32..10000 {
1428            i.encode_into_buffer(&mut data);
1429        }
1430        let shared_data = Arc::new(data);
1431
1432        // Many threads read the same data
1433        let handles: Vec<_> = (0..50)
1434            .map(|_| {
1435                let data = Arc::clone(&shared_data);
1436                thread::spawn(move || {
1437                    let mut slice = &data[..];
1438                    let mut count = 0;
1439                    while !slice.is_empty() {
1440                        if let Ok((_, remaining)) = u32::try_decode_from(slice) {
1441                            count += 1;
1442                            slice = remaining;
1443                        } else {
1444                            break;
1445                        }
1446                    }
1447                    count
1448                })
1449            })
1450            .collect();
1451
1452        for handle in handles {
1453            let count = handle.join().unwrap();
1454            assert_eq!(count, 10000);
1455        }
1456    }
1457
1458    // ========================================================================
1459    // Concurrency Tests - Work Stealing Pattern
1460    // ========================================================================
1461
1462    #[cfg(feature = "std")]
1463    #[test]
1464    fn concurrency_test_work_stealing() {
1465        use std::sync::Arc;
1466        use std::sync::Mutex;
1467        use std::thread;
1468
1469        // Shared work queue
1470        let work_queue = Arc::new(Mutex::new((0u32..1000).collect::<Vec<_>>()));
1471        let results = Arc::new(Mutex::new(Vec::new()));
1472
1473        // Worker threads steal work from queue
1474        let workers: Vec<_> = (0..4)
1475            .map(|_| {
1476                let queue = Arc::clone(&work_queue);
1477                let results = Arc::clone(&results);
1478                thread::spawn(move || {
1479                    loop {
1480                        let work_item = {
1481                            let mut queue = queue.lock().unwrap();
1482                            queue.pop()
1483                        };
1484
1485                        match work_item {
1486                            Some(value) => {
1487                                // Encode and decode
1488                                let encoded = value.encode_into();
1489                                let (decoded, _) = u32::try_decode_from(&encoded).unwrap();
1490                                results.lock().unwrap().push(decoded);
1491                            }
1492                            None => break,
1493                        }
1494                    }
1495                })
1496            })
1497            .collect();
1498
1499        for worker in workers {
1500            worker.join().unwrap();
1501        }
1502
1503        let results = results.lock().unwrap();
1504        assert_eq!(results.len(), 1000);
1505    }
1506}