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    unsafe_code,
276    trivial_casts,
277    trivial_numeric_casts,
278    unused_import_braces,
279    unused_qualifications
280)]
281#![cfg_attr(not(feature = "std"), no_std)]
282
283#[cfg(not(feature = "std"))]
284extern crate alloc;
285
286/// Errors generated from the implementations
287pub mod error;
288pub use error::Error;
289
290/// `EncodeInto` trait
291pub mod enc_into;
292pub use enc_into::EncodeInto;
293
294/// EncodeIntoBuffer trait for zero-allocation encoding
295pub mod enc_into_buffer;
296pub use enc_into_buffer::EncodeIntoBuffer;
297
298/// EncodeIntoArray trait for stack-based encoding
299pub mod enc_into_array;
300pub use enc_into_array::EncodeIntoArray;
301
302/// Null and `TryNull` traits
303pub mod null;
304pub use null::{Null, TryNull};
305
306/// `TryDecodeFrom` trait
307pub mod try_decode_from;
308pub use try_decode_from::TryDecodeFrom;
309
310/// Validated newtype for encoded bytes
311pub mod encoded_bytes;
312pub use encoded_bytes::EncodedBytes;
313
314/// one-stop shop for all exported symbols
315pub mod prelude {
316    pub use super::{
317        enc_into::*, enc_into_array::*, enc_into_buffer::*, encoded_bytes::*, null::*,
318        try_decode_from::*,
319    };
320}
321
322#[cfg(test)]
323mod test {
324    #![allow(
325        clippy::cast_possible_truncation,
326        clippy::cast_sign_loss,
327        clippy::items_after_statements,
328        clippy::significant_drop_tightening,
329        clippy::needless_collect
330    )]
331    use super::prelude::*;
332
333    #[test]
334    fn test_bool() {
335        let tbuf = true.encode_into();
336        let (tval, _) = bool::try_decode_from(&tbuf).unwrap();
337        assert!(tval);
338        let fbuf = false.encode_into();
339        let (fval, _) = bool::try_decode_from(&fbuf).unwrap();
340        assert!(!fval);
341    }
342
343    #[test]
344    fn test_u8() {
345        let buf = 0xff_u8.encode_into();
346        let (num, _) = u8::try_decode_from(&buf).unwrap();
347        assert_eq!(0xff_u8, num);
348    }
349
350    #[test]
351    fn test_u16() {
352        let buf = 0xffee_u16.encode_into();
353        let (num, _) = u16::try_decode_from(&buf).unwrap();
354        assert_eq!(0xffee_u16, num);
355    }
356
357    #[test]
358    fn test_u32() {
359        let buf = 0xffee_ddcc_u32.encode_into();
360        let (num, _) = u32::try_decode_from(&buf).unwrap();
361        assert_eq!(0xffee_ddcc_u32, num);
362    }
363
364    #[test]
365    fn test_u64() {
366        let buf = 0xffee_ddcc_bbaa_9988_u64.encode_into();
367        let (num, _) = u64::try_decode_from(&buf).unwrap();
368        assert_eq!(0xffee_ddcc_bbaa_9988_u64, num);
369    }
370
371    #[test]
372    fn test_u128() {
373        let buf = 0xffee_ddcc_bbaa_9988_7766_5544_3322_1100_u128.encode_into();
374        let (num, _) = u128::try_decode_from(&buf).unwrap();
375        assert_eq!(0xffee_ddcc_bbaa_9988_7766_5544_3322_1100_u128, num);
376    }
377
378    #[cfg(target_pointer_width = "64")]
379    #[test]
380    fn test_usize() {
381        let buf = 0xffee_ddcc_bbaa_9988_usize.encode_into();
382        let (num, _) = usize::try_decode_from(&buf).unwrap();
383        assert_eq!(0xffee_ddcc_bbaa_9988_usize, num);
384    }
385
386    #[cfg(target_pointer_width = "32")]
387    #[test]
388    fn test_usize() {
389        let buf = 0xffeeddcc_usize.encode_into();
390        let (num, _) = usize::try_decode_from(&buf).unwrap();
391        assert_eq!(0xffeeddcc_usize, num);
392    }
393
394    struct Foo(usize);
395
396    impl Null for Foo {
397        fn null() -> Self {
398            Self(0)
399        }
400        fn is_null(&self) -> bool {
401            self.0 == 0
402        }
403    }
404
405    impl TryNull for Foo {
406        type Error = &'static str;
407
408        fn try_null() -> Result<Self, Self::Error> {
409            Ok(Self(0))
410        }
411        fn is_null(&self) -> bool {
412            self.0 == 0
413        }
414    }
415
416    #[test]
417    fn test_null_value() {
418        let f = Foo::null();
419        assert!(Null::is_null(&f));
420    }
421
422    #[test]
423    fn test_try_null_value() {
424        let f = Foo::try_null().unwrap();
425        assert!(TryNull::is_null(&f));
426    }
427
428    // ========================================================================
429    // Error Case Tests
430    // ========================================================================
431
432    #[test]
433    fn test_decode_empty_slice_u8() {
434        let empty: &[u8] = &[];
435        let result = u8::try_decode_from(empty);
436        assert!(result.is_err(), "Should fail to decode from empty slice");
437    }
438
439    #[test]
440    fn test_decode_empty_slice_u16() {
441        let empty: &[u8] = &[];
442        let result = u16::try_decode_from(empty);
443        assert!(result.is_err(), "Should fail to decode from empty slice");
444    }
445
446    #[test]
447    fn test_decode_empty_slice_u32() {
448        let empty: &[u8] = &[];
449        let result = u32::try_decode_from(empty);
450        assert!(result.is_err(), "Should fail to decode from empty slice");
451    }
452
453    #[test]
454    fn test_decode_empty_slice_u64() {
455        let empty: &[u8] = &[];
456        let result = u64::try_decode_from(empty);
457        assert!(result.is_err(), "Should fail to decode from empty slice");
458    }
459
460    #[test]
461    fn test_decode_empty_slice_u128() {
462        let empty: &[u8] = &[];
463        let result = u128::try_decode_from(empty);
464        assert!(result.is_err(), "Should fail to decode from empty slice");
465    }
466
467    #[test]
468    fn test_decode_empty_slice_bool() {
469        let empty: &[u8] = &[];
470        let result = bool::try_decode_from(empty);
471        assert!(result.is_err(), "Should fail to decode from empty slice");
472    }
473
474    #[test]
475    fn test_decode_truncated_varint() {
476        // A varint with continuation bit set but no following byte
477        let truncated = vec![0x80]; // MSB set, indicates more bytes follow
478        let result = u16::try_decode_from(&truncated);
479        assert!(result.is_err(), "Should fail on truncated varint");
480    }
481
482    #[test]
483    fn test_decode_truncated_large_varint() {
484        // Incomplete multi-byte varint
485        let truncated = vec![0xFF, 0xFF]; // Two bytes with continuation bits
486        let result = u32::try_decode_from(&truncated);
487        assert!(result.is_err(), "Should fail on truncated large varint");
488    }
489
490    // ========================================================================
491    // Edge Case Tests
492    // ========================================================================
493
494    #[test]
495    fn test_encode_decode_zero_values() {
496        // Test zero value for all types
497        assert_eq!(0u8.encode_into(), vec![0]);
498        assert_eq!(0u16.encode_into(), vec![0]);
499        assert_eq!(0u32.encode_into(), vec![0]);
500        assert_eq!(0u64.encode_into(), vec![0]);
501        assert_eq!(0u128.encode_into(), vec![0]);
502        assert_eq!(0usize.encode_into(), vec![0]);
503
504        // Verify decode
505        let (val, rest) = u8::try_decode_from(&[0]).unwrap();
506        assert_eq!(val, 0);
507        assert!(rest.is_empty());
508    }
509
510    #[test]
511    fn test_encode_decode_max_u8() {
512        let max = u8::MAX;
513        let encoded = max.encode_into();
514        let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
515        assert_eq!(decoded, max);
516        assert!(remaining.is_empty());
517    }
518
519    #[test]
520    fn test_encode_decode_max_u16() {
521        let max = u16::MAX;
522        let encoded = max.encode_into();
523        let (decoded, remaining) = u16::try_decode_from(&encoded).unwrap();
524        assert_eq!(decoded, max);
525        assert!(remaining.is_empty());
526    }
527
528    #[test]
529    fn test_encode_decode_max_u32() {
530        let max = u32::MAX;
531        let encoded = max.encode_into();
532        let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
533        assert_eq!(decoded, max);
534        assert!(remaining.is_empty());
535    }
536
537    #[test]
538    fn test_encode_decode_max_u64() {
539        let max = u64::MAX;
540        let encoded = max.encode_into();
541        let (decoded, remaining) = u64::try_decode_from(&encoded).unwrap();
542        assert_eq!(decoded, max);
543        assert!(remaining.is_empty());
544    }
545
546    #[test]
547    fn test_encode_decode_max_u128() {
548        let max = u128::MAX;
549        let encoded = max.encode_into();
550        let (decoded, remaining) = u128::try_decode_from(&encoded).unwrap();
551        assert_eq!(decoded, max);
552        assert!(remaining.is_empty());
553    }
554
555    #[test]
556    fn test_varint_boundary_127() {
557        // 127 should encode in 1 byte (last value that fits in 7 bits)
558        let val = 127u8;
559        let encoded = val.encode_into();
560        assert_eq!(encoded.len(), 1);
561        let (decoded, _) = u8::try_decode_from(&encoded).unwrap();
562        assert_eq!(decoded, val);
563    }
564
565    #[test]
566    fn test_varint_boundary_128() {
567        // 128 should require 2 bytes (first value needing continuation)
568        let val = 128u8;
569        let encoded = val.encode_into();
570        assert_eq!(encoded.len(), 2);
571        let (decoded, _) = u8::try_decode_from(&encoded).unwrap();
572        assert_eq!(decoded, val);
573    }
574
575    #[test]
576    fn test_bool_nonzero_as_true() {
577        // Any non-zero value should decode as true
578        let bytes = vec![42];
579        let (val, _) = bool::try_decode_from(&bytes).unwrap();
580        assert!(val);
581    }
582
583    // ========================================================================
584    // Round-Trip Tests
585    // ========================================================================
586
587    #[test]
588    fn test_roundtrip_u8_range() {
589        // Test a range of u8 values
590        for value in [0, 1, 127, 128, 255] {
591            let encoded = value.encode_into();
592            let (decoded, remaining) = u8::try_decode_from(&encoded).unwrap();
593            assert_eq!(decoded, value, "Round-trip failed for u8 value {value}");
594            assert!(remaining.is_empty());
595        }
596    }
597
598    #[test]
599    fn test_roundtrip_u16_range() {
600        // Test various u16 values including boundaries
601        for value in [0, 1, 127, 128, 255, 256, 16383, 16384, 65535] {
602            let encoded = value.encode_into();
603            let (decoded, remaining) = u16::try_decode_from(&encoded).unwrap();
604            assert_eq!(decoded, value, "Round-trip failed for u16 value {value}");
605            assert!(remaining.is_empty());
606        }
607    }
608
609    #[test]
610    fn test_roundtrip_u32_range() {
611        // Test various u32 values
612        for value in [0, 1, 127, 128, 16384, 65536, u32::MAX] {
613            let encoded = value.encode_into();
614            let (decoded, remaining) = u32::try_decode_from(&encoded).unwrap();
615            assert_eq!(decoded, value, "Round-trip failed for u32 value {value}");
616            assert!(remaining.is_empty());
617        }
618    }
619
620    #[test]
621    fn test_roundtrip_u64_range() {
622        // Test various u64 values
623        for value in [0, 1, 127, 128, 65536, u64::from(u32::MAX), u64::MAX] {
624            let encoded = value.encode_into();
625            let (decoded, remaining) = u64::try_decode_from(&encoded).unwrap();
626            assert_eq!(decoded, value, "Round-trip failed for u64 value {value}");
627            assert!(remaining.is_empty());
628        }
629    }
630
631    #[test]
632    fn test_roundtrip_bool() {
633        for value in [true, false] {
634            let encoded = value.encode_into();
635            let (decoded, remaining) = bool::try_decode_from(&encoded).unwrap();
636            assert_eq!(decoded, value, "Round-trip failed for bool {value}");
637            assert!(remaining.is_empty());
638        }
639    }
640
641    #[test]
642    fn test_sequential_decode() {
643        // Encode multiple values into one buffer
644        let mut buffer = Vec::new();
645        buffer.extend_from_slice(&42u8.encode_into());
646        buffer.extend_from_slice(&1000u16.encode_into());
647        buffer.extend_from_slice(&100_000_u32.encode_into());
648
649        // Decode sequentially
650        let (val1, rest) = u8::try_decode_from(&buffer).unwrap();
651        assert_eq!(val1, 42);
652
653        let (val2, rest) = u16::try_decode_from(rest).unwrap();
654        assert_eq!(val2, 1000);
655
656        let (val3, rest) = u32::try_decode_from(rest).unwrap();
657        assert_eq!(val3, 100_000);
658
659        assert!(rest.is_empty(), "Should have consumed all bytes");
660    }
661
662    #[test]
663    fn test_remaining_bytes_returned() {
664        // Verify that decode returns unconsumed bytes
665        let mut buffer = Vec::new();
666        buffer.extend_from_slice(&42u8.encode_into());
667        buffer.extend_from_slice(&[0xFF, 0xEE, 0xDD]); // Extra bytes
668
669        let (val, remaining) = u8::try_decode_from(&buffer).unwrap();
670        assert_eq!(val, 42);
671        assert_eq!(remaining, &[0xFF, 0xEE, 0xDD]);
672    }
673
674    #[test]
675    fn test_encode_length_efficiency() {
676        // Verify varint encoding is space-efficient
677        assert_eq!(0u8.encode_into().len(), 1);
678        assert_eq!(127u8.encode_into().len(), 1);
679        assert_eq!(128u8.encode_into().len(), 2);
680        assert_eq!(255u8.encode_into().len(), 2);
681
682        // Larger values should use more bytes
683        assert!(u16::MAX.encode_into().len() > 1);
684        assert!(u32::MAX.encode_into().len() > 2);
685    }
686
687    // ========================================================================
688    // Property-Based Tests (using proptest)
689    // ========================================================================
690
691    use proptest::prelude::*;
692
693    proptest! {
694        #[test]
695        fn prop_roundtrip_u8(value: u8) {
696            let encoded = value.encode_into();
697            let (decoded, remaining) = u8::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_u16(value: u16) {
704            let encoded = value.encode_into();
705            let (decoded, remaining) = u16::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_u32(value: u32) {
712            let encoded = value.encode_into();
713            let (decoded, remaining) = u32::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_u64(value: u64) {
720            let encoded = value.encode_into();
721            let (decoded, remaining) = u64::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_u128(value: u128) {
728            let encoded = value.encode_into();
729            let (decoded, remaining) = u128::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_usize(value: usize) {
736            let encoded = value.encode_into();
737            let (decoded, remaining) = usize::try_decode_from(&encoded).unwrap();
738            prop_assert_eq!(decoded, value);
739            prop_assert!(remaining.is_empty());
740        }
741
742        #[test]
743        fn prop_roundtrip_bool(value: bool) {
744            let encoded = value.encode_into();
745            let (decoded, remaining) = bool::try_decode_from(&encoded).unwrap();
746            prop_assert_eq!(decoded, value);
747            prop_assert!(remaining.is_empty());
748        }
749
750        #[test]
751        fn prop_encode_not_empty(value: u32) {
752            let encoded = value.encode_into();
753            prop_assert!(!encoded.is_empty());
754        }
755
756        #[test]
757        fn prop_encode_deterministic(value: u64) {
758            let encoded1 = value.encode_into();
759            let encoded2 = value.encode_into();
760            prop_assert_eq!(encoded1, encoded2);
761        }
762
763        #[test]
764        fn prop_small_values_compact(value in 0u32..128) {
765            let encoded = value.encode_into();
766            prop_assert_eq!(encoded.len(), 1, "Values under 128 should encode in 1 byte");
767        }
768
769        #[test]
770        fn prop_sequential_decode(v1: u8, v2: u16, v3: u32) {
771            let mut buffer = Vec::new();
772            buffer.extend_from_slice(&v1.encode_into());
773            buffer.extend_from_slice(&v2.encode_into());
774            buffer.extend_from_slice(&v3.encode_into());
775
776            let (d1, rest) = u8::try_decode_from(&buffer).unwrap();
777            prop_assert_eq!(d1, v1);
778
779            let (d2, rest) = u16::try_decode_from(rest).unwrap();
780            prop_assert_eq!(d2, v2);
781
782            let (d3, rest) = u32::try_decode_from(rest).unwrap();
783            prop_assert_eq!(d3, v3);
784
785            prop_assert!(rest.is_empty());
786        }
787    }
788
789    // ========================================================================
790    // Thread-Safety Tests (Compile-Time Verification)
791    // ========================================================================
792
793    /// Compile-time verification that Error is Send + Sync
794    #[test]
795    fn assert_error_send_sync() {
796        fn is_send<T: Send>() {}
797        fn is_sync<T: Sync>() {}
798        is_send::<crate::Error>();
799        is_sync::<crate::Error>();
800    }
801
802    /// Compile-time verification that `EncodedBytes` is Send + Sync
803    #[test]
804    fn assert_encoded_bytes_send_sync() {
805        fn is_send<T: Send>() {}
806        fn is_sync<T: Sync>() {}
807        is_send::<EncodedBytes>();
808        is_sync::<EncodedBytes>();
809    }
810
811    #[test]
812    fn test_encoded_bytes_valid() {
813        let bytes = vec![42];
814        let encoded = EncodedBytes::try_from(bytes).unwrap();
815        assert_eq!(encoded.as_ref(), &[42]);
816    }
817
818    #[test]
819    fn test_encoded_bytes_invalid_empty() {
820        let empty: Vec<u8> = vec![];
821        assert!(EncodedBytes::try_from(empty).is_err());
822    }
823
824    #[test]
825    fn test_encoded_bytes_invalid_truncated() {
826        let truncated = vec![0x80];
827        assert!(EncodedBytes::try_from(truncated).is_err());
828    }
829
830    #[test]
831    fn test_encoded_bytes_into_vec() {
832        // Use a single varint encoding (128 requires 2 bytes: [0x80, 0x01])
833        let original = 128u8.encode_into();
834        let encoded = EncodedBytes::new(&original).unwrap();
835        let recovered: Vec<u8> = encoded.into();
836        assert_eq!(recovered, original);
837    }
838
839    #[cfg(feature = "std")]
840    #[test]
841    fn test_encoded_bytes_thread_safe() {
842        use std::sync::Arc;
843        use std::thread;
844
845        let encoded = EncodedBytes::new(&[42]).unwrap();
846        let shared = Arc::new(encoded);
847
848        let handles: Vec<_> = (0..4)
849            .map(|_| {
850                let data = Arc::clone(&shared);
851                thread::spawn(move || {
852                    assert_eq!(&data[..], &[42]);
853                })
854            })
855            .collect();
856
857        for handle in handles {
858            handle.join().unwrap();
859        }
860    }
861
862    // ========================================================================
863    // Security Tests - Malicious Input Handling
864    // ========================================================================
865
866    #[test]
867    fn security_test_all_continuation_bits() {
868        // All bytes have continuation bit set (0xFF = all 1s)
869        let malicious = vec![0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
870        let result = u64::try_decode_from(&malicious);
871        // Should fail due to too many bytes or overflow
872        assert!(
873            result.is_err(),
874            "Should reject all-continuation-bit sequence"
875        );
876    }
877
878    #[test]
879    fn security_test_maximum_length_varint_u64() {
880        // u64::MAX encoded as varint (10 bytes)
881        let max_encoded = u64::MAX.encode_into();
882        assert_eq!(max_encoded.len(), 10);
883        let (decoded, remaining) = u64::try_decode_from(&max_encoded).unwrap();
884        assert_eq!(decoded, u64::MAX);
885        assert!(remaining.is_empty());
886    }
887
888    #[test]
889    fn security_test_maximum_length_varint_u128() {
890        // u128::MAX encoded as varint (19 bytes)
891        let max_encoded = u128::MAX.encode_into();
892        assert_eq!(max_encoded.len(), 19);
893        let (decoded, remaining) = u128::try_decode_from(&max_encoded).unwrap();
894        assert_eq!(decoded, u128::MAX);
895        assert!(remaining.is_empty());
896    }
897
898    #[test]
899    fn security_test_single_byte_with_continuation() {
900        // Single byte with continuation bit but no follow-up
901        let malicious = vec![0x80];
902        assert!(u8::try_decode_from(&malicious).is_err());
903        assert!(u16::try_decode_from(&malicious).is_err());
904        assert!(u32::try_decode_from(&malicious).is_err());
905        assert!(u64::try_decode_from(&malicious).is_err());
906    }
907
908    #[test]
909    fn security_test_multiple_continuation_bytes_truncated() {
910        // Multiple continuation bytes that end prematurely
911        let malicious = vec![0xFF, 0xFF, 0xFF];
912        assert!(u32::try_decode_from(&malicious).is_err());
913    }
914
915    #[test]
916    fn security_test_encoded_bytes_rejects_invalid() {
917        // Test that EncodedBytes rejects various invalid inputs
918
919        // Empty
920        assert!(EncodedBytes::try_from(vec![]).is_err());
921
922        // Truncated varint
923        assert!(EncodedBytes::try_from(vec![0x80]).is_err());
924
925        // Trailing bytes after valid varint
926        let mut with_trailing = vec![42];
927        with_trailing.extend_from_slice(&[0xFF, 0xEE]);
928        assert!(EncodedBytes::try_from(with_trailing).is_err());
929
930        // All continuation bits
931        assert!(EncodedBytes::try_from(vec![0xFF, 0xFF, 0xFF]).is_err());
932    }
933
934    #[test]
935    fn security_test_buffer_encoding_no_overflow() {
936        // Ensure buffer encoding doesn't overflow with many values
937        let mut buffer = Vec::new();
938
939        // Encode 1000 values
940        for i in 0u16..1000 {
941            i.encode_into_buffer(&mut buffer);
942        }
943
944        // Should have successfully encoded without panic
945        assert!(buffer.len() > 1000); // At least 1 byte per value, some more
946        assert!(buffer.len() < 3000); // At most 3 bytes per u16 value
947    }
948
949    #[test]
950    fn security_test_array_encoding_bounds() {
951        // Verify array encoding respects bounds for max values
952        let (array, len) = u128::MAX.encode_into_array();
953        assert!(len <= 19, "u128::MAX should not exceed 19 bytes");
954
955        // Verify the encoded data is valid
956        let (decoded, _) = u128::try_decode_from(&array[..len]).unwrap();
957        assert_eq!(decoded, u128::MAX);
958    }
959
960    #[test]
961    fn security_test_bool_decode_nonzero_values() {
962        // Any non-zero value within u8 range should decode as true
963        let nonzero_values = vec![
964            vec![1],          // 1
965            vec![42],         // 42
966            vec![127],        // 127
967            vec![0xFF, 0x01], // 255 (max u8)
968        ];
969
970        for bytes in nonzero_values {
971            let (val, _) = bool::try_decode_from(&bytes).unwrap();
972            assert!(val, "Non-zero value {bytes:?} should decode as true");
973        }
974
975        // Zero should decode as false
976        let (val, _) = bool::try_decode_from(&[0]).unwrap();
977        assert!(!val);
978    }
979
980    #[test]
981    fn security_test_zero_length_slice_rejection() {
982        // Zero-length slices should be rejected for all types
983        let empty: &[u8] = &[];
984
985        assert!(u8::try_decode_from(empty).is_err());
986        assert!(u16::try_decode_from(empty).is_err());
987        assert!(u32::try_decode_from(empty).is_err());
988        assert!(u64::try_decode_from(empty).is_err());
989        assert!(u128::try_decode_from(empty).is_err());
990        assert!(usize::try_decode_from(empty).is_err());
991        assert!(bool::try_decode_from(empty).is_err());
992    }
993
994    #[test]
995    fn security_test_repeated_decoding_no_panic() {
996        // Decode the same malicious data repeatedly to check for panics
997        let malicious = vec![0xFF, 0xFF];
998
999        for _ in 0..100 {
1000            let _ = u32::try_decode_from(&malicious);
1001            let _ = u64::try_decode_from(&malicious);
1002        }
1003    }
1004
1005    #[test]
1006    fn security_test_alternating_bit_patterns() {
1007        // Test various bit patterns that might trigger edge cases
1008        let patterns = vec![
1009            vec![0xAA], // 10101010
1010            vec![0x55], // 01010101
1011            vec![0xAA, 0x55],
1012            vec![0x55, 0xAA],
1013        ];
1014
1015        for pattern in patterns {
1016            // These should either decode successfully or return an error
1017            // but must not panic
1018            let _ = u8::try_decode_from(&pattern);
1019            let _ = u16::try_decode_from(&pattern);
1020        }
1021    }
1022
1023    // ========================================================================
1024    // Security Tests - Fuzzing-Style Property Tests
1025    // ========================================================================
1026
1027    proptest! {
1028        #[test]
1029        fn security_prop_decode_random_bytes(bytes in prop::collection::vec(any::<u8>(), 0..50)) {
1030            // Random bytes should either decode successfully or return an error
1031            // but must not panic
1032            let _ = u8::try_decode_from(&bytes);
1033            let _ = u16::try_decode_from(&bytes);
1034            let _ = u32::try_decode_from(&bytes);
1035            let _ = u64::try_decode_from(&bytes);
1036            let _ = u128::try_decode_from(&bytes);
1037        }
1038
1039        #[test]
1040        fn security_prop_encoded_bytes_validation(bytes in prop::collection::vec(any::<u8>(), 0..100)) {
1041            // EncodedBytes validation should never panic, only return Ok or Err
1042            let result = EncodedBytes::try_from(bytes);
1043
1044            // If it succeeds, the data should be valid
1045            if let Ok(encoded) = result {
1046                // Should be able to decode as u128 (covers all smaller types)
1047                let decode_result = u128::try_decode_from(encoded.as_ref());
1048                prop_assert!(decode_result.is_ok(), "Validated EncodedBytes should be decodable");
1049            }
1050        }
1051
1052        #[test]
1053        fn security_prop_buffer_encoding_no_panic(values in prop::collection::vec(any::<u32>(), 0..1000)) {
1054            // Encoding many values into a buffer should not panic
1055            let mut buffer = Vec::new();
1056            for value in values {
1057                value.encode_into_buffer(&mut buffer);
1058            }
1059
1060            // Buffer should have reasonable size
1061            prop_assert!(buffer.len() < 5000, "Buffer should not grow excessively");
1062        }
1063
1064        #[test]
1065        fn security_prop_array_encoding_never_panics(value: u128) {
1066            // Array encoding should never panic for any value
1067            let (_array, len) = value.encode_into_array();
1068
1069            // Length should be within bounds
1070            prop_assert!(len > 0);
1071            prop_assert!(len <= 19);
1072
1073            // Encode again to get array for decoding
1074            let (array, len) = value.encode_into_array();
1075            let (decoded, _) = u128::try_decode_from(&array[..len]).unwrap();
1076            prop_assert_eq!(decoded, value);
1077        }
1078
1079        #[test]
1080        fn security_prop_decode_never_returns_more_than_input(
1081            bytes in prop::collection::vec(any::<u8>(), 1..100)
1082        ) {
1083            // Decoded remainder should never be larger than input
1084            if let Ok((_, remaining)) = u64::try_decode_from(&bytes) {
1085                prop_assert!(remaining.len() <= bytes.len());
1086            }
1087        }
1088
1089        #[test]
1090        fn security_prop_encode_size_bounded(value: u64) {
1091            // Encoded size should never exceed maximum varint size for the type
1092            let encoded = value.encode_into();
1093            prop_assert!(encoded.len() <= 10, "u64 varint should not exceed 10 bytes");
1094
1095            let (_array, len) = value.encode_into_array();
1096            prop_assert!(len <= 10, "u64 array encoding should not exceed 10 bytes");
1097        }
1098    }
1099
1100    // ========================================================================
1101    // Concurrency Tests - Compile-Time Send + Sync Verification
1102    // ========================================================================
1103
1104    /// Verify that primitive types used with traits are Send + Sync
1105    #[test]
1106    fn assert_primitives_send_sync() {
1107        fn is_send<T: Send>() {}
1108        fn is_sync<T: Sync>() {}
1109
1110        // All integer types should be Send + Sync
1111        is_send::<u8>();
1112        is_sync::<u8>();
1113        is_send::<u16>();
1114        is_sync::<u16>();
1115        is_send::<u32>();
1116        is_sync::<u32>();
1117        is_send::<u64>();
1118        is_sync::<u64>();
1119        is_send::<u128>();
1120        is_sync::<u128>();
1121        is_send::<usize>();
1122        is_sync::<usize>();
1123        is_send::<bool>();
1124        is_sync::<bool>();
1125
1126        // Vec<u8> should be Send + Sync
1127        is_send::<Vec<u8>>();
1128        is_sync::<Vec<u8>>();
1129    }
1130
1131    /// Verify that encoded data types are Send + Sync
1132    #[test]
1133    fn assert_encoded_types_send_sync() {
1134        fn is_send<T: Send>() {}
1135        fn is_sync<T: Sync>() {}
1136
1137        // EncodedBytes should be Send + Sync
1138        is_send::<EncodedBytes>();
1139        is_sync::<EncodedBytes>();
1140
1141        // Error should be Send + Sync
1142        is_send::<crate::Error>();
1143        is_sync::<crate::Error>();
1144    }
1145
1146    // ========================================================================
1147    // Concurrency Tests - Multi-Threaded Encoding
1148    // ========================================================================
1149
1150    #[cfg(feature = "std")]
1151    #[test]
1152    fn concurrency_test_parallel_encode_into() {
1153        use std::sync::Arc;
1154        use std::sync::Mutex;
1155        use std::thread;
1156
1157        // Encode values in parallel threads
1158        let results = Arc::new(Mutex::new(Vec::new()));
1159        let handles: Vec<_> = (0..10)
1160            .map(|i| {
1161                let results = Arc::clone(&results);
1162                thread::spawn(move || {
1163                    let value = i as u32 * 100;
1164                    let encoded = value.encode_into();
1165                    results.lock().unwrap().push((value, encoded));
1166                })
1167            })
1168            .collect();
1169
1170        for handle in handles {
1171            handle.join().unwrap();
1172        }
1173
1174        // Verify all encodings are correct
1175        let results = results.lock().unwrap();
1176        assert_eq!(results.len(), 10);
1177        for (original, encoded) in results.iter() {
1178            let (decoded, _) = u32::try_decode_from(encoded).unwrap();
1179            assert_eq!(*original, decoded);
1180        }
1181    }
1182
1183    #[cfg(feature = "std")]
1184    #[test]
1185    fn concurrency_test_parallel_encode_into_buffer() {
1186        use std::thread;
1187
1188        // Each thread gets its own buffer
1189        let handles: Vec<_> = (0..10)
1190            .map(|i| {
1191                thread::spawn(move || {
1192                    let mut buffer = Vec::new();
1193                    for j in 0u16..100 {
1194                        (i * 100 + j).encode_into_buffer(&mut buffer);
1195                    }
1196                    buffer
1197                })
1198            })
1199            .collect();
1200
1201        for handle in handles {
1202            let buffer = handle.join().unwrap();
1203            assert!(buffer.len() >= 100); // At least 1 byte per value
1204            assert!(buffer.len() < 300); // At most 3 bytes per u16
1205        }
1206    }
1207
1208    #[cfg(feature = "std")]
1209    #[test]
1210    fn concurrency_test_parallel_encode_into_array() {
1211        use std::thread;
1212
1213        // Array encoding is purely stack-based, perfect for parallelism
1214        let handles: Vec<_> = (0..10)
1215            .map(|i| {
1216                thread::spawn(move || {
1217                    let value = i as u64 * 1000;
1218                    let (array, len) = value.encode_into_array();
1219                    (value, array, len)
1220                })
1221            })
1222            .collect();
1223
1224        for handle in handles {
1225            let (original, array, len) = handle.join().unwrap();
1226            let (decoded, _) = u64::try_decode_from(&array[..len]).unwrap();
1227            assert_eq!(original, decoded);
1228        }
1229    }
1230
1231    // ========================================================================
1232    // Concurrency Tests - Multi-Threaded Decoding
1233    // ========================================================================
1234
1235    #[cfg(feature = "std")]
1236    #[test]
1237    fn concurrency_test_shared_decode_data() {
1238        use std::sync::Arc;
1239        use std::thread;
1240
1241        // Pre-encode some data
1242        let mut data = Vec::new();
1243        for i in 0u32..100 {
1244            data.extend_from_slice(&i.encode_into());
1245        }
1246        let shared_data = Arc::new(data);
1247
1248        // Multiple threads decode from the same data
1249        let handles: Vec<_> = (0..4)
1250            .map(|_| {
1251                let data = Arc::clone(&shared_data);
1252                thread::spawn(move || {
1253                    let mut slice = &data[..];
1254                    let mut count = 0;
1255                    while !slice.is_empty() {
1256                        match u32::try_decode_from(slice) {
1257                            Ok((_, remaining)) => {
1258                                count += 1;
1259                                slice = remaining;
1260                            }
1261                            Err(_) => break,
1262                        }
1263                    }
1264                    count
1265                })
1266            })
1267            .collect();
1268
1269        for handle in handles {
1270            let count = handle.join().unwrap();
1271            assert_eq!(count, 100, "All threads should decode 100 values");
1272        }
1273    }
1274
1275    #[cfg(feature = "std")]
1276    #[test]
1277    fn concurrency_test_parallel_decode_different_data() {
1278        use std::thread;
1279
1280        // Each thread decodes different data
1281        let handles: Vec<_> = (0..10)
1282            .map(|i| {
1283                thread::spawn(move || {
1284                    // Create encoded data
1285                    let mut data = Vec::new();
1286                    for j in 0u16..50 {
1287                        (i * 50 + j).encode_into_buffer(&mut data);
1288                    }
1289
1290                    // Decode it
1291                    let mut slice = &data[..];
1292                    let mut decoded_values = Vec::new();
1293                    while !slice.is_empty() {
1294                        match u16::try_decode_from(slice) {
1295                            Ok((value, remaining)) => {
1296                                decoded_values.push(value);
1297                                slice = remaining;
1298                            }
1299                            Err(_) => break,
1300                        }
1301                    }
1302                    decoded_values
1303                })
1304            })
1305            .collect();
1306
1307        for (i, handle) in handles.into_iter().enumerate() {
1308            let values = handle.join().unwrap();
1309            assert_eq!(values.len(), 50);
1310            // Verify first and last values
1311            assert_eq!(values[0], i as u16 * 50);
1312            assert_eq!(values[49], i as u16 * 50 + 49);
1313        }
1314    }
1315
1316    // ========================================================================
1317    // Concurrency Tests - Pipeline Processing
1318    // ========================================================================
1319
1320    #[cfg(feature = "std")]
1321    #[test]
1322    fn concurrency_test_pipeline_encode_decode() {
1323        use std::sync::mpsc;
1324        use std::thread;
1325
1326        let (tx, rx) = mpsc::channel();
1327
1328        // Encoder thread
1329        let encoder = thread::spawn(move || {
1330            for i in 0u32..1000 {
1331                tx.send(i.encode_into()).unwrap();
1332            }
1333        });
1334
1335        // Decoder thread
1336        let decoder = thread::spawn(move || {
1337            let mut sum = 0u64;
1338            for encoded in rx {
1339                let (value, _) = u32::try_decode_from(&encoded).unwrap();
1340                sum += u64::from(value);
1341            }
1342            sum
1343        });
1344
1345        encoder.join().unwrap();
1346        let sum = decoder.join().unwrap();
1347
1348        // Sum of 0..1000 = 999 * 1000 / 2 = 499500
1349        assert_eq!(sum, 499_500);
1350    }
1351
1352    #[cfg(feature = "std")]
1353    #[test]
1354    fn concurrency_test_multi_producer_single_consumer() {
1355        use std::sync::mpsc;
1356        use std::thread;
1357
1358        let (tx, rx) = mpsc::channel();
1359
1360        // Multiple producer threads
1361        let producers: Vec<_> = (0..4)
1362            .map(|thread_id| {
1363                let tx = tx.clone();
1364                thread::spawn(move || {
1365                    for i in 0u16..100 {
1366                        let value = thread_id * 100 + i;
1367                        tx.send(value.encode_into()).unwrap();
1368                    }
1369                })
1370            })
1371            .collect();
1372
1373        // Drop original sender
1374        drop(tx);
1375
1376        // Single consumer thread
1377        let consumer = thread::spawn(move || {
1378            let mut count = 0;
1379            for encoded in rx {
1380                let (value, _) = u16::try_decode_from(&encoded).unwrap();
1381                assert!(value < 400);
1382                count += 1;
1383            }
1384            count
1385        });
1386
1387        for producer in producers {
1388            producer.join().unwrap();
1389        }
1390
1391        let total = consumer.join().unwrap();
1392        assert_eq!(total, 400); // 4 threads * 100 values
1393    }
1394
1395    // ========================================================================
1396    // Concurrency Tests - Stress Testing
1397    // ========================================================================
1398
1399    #[cfg(feature = "std")]
1400    #[test]
1401    fn concurrency_test_stress_parallel_encoding() {
1402        use std::thread;
1403
1404        // Stress test with many threads
1405        let handles: Vec<_> = (0..100)
1406            .map(|i| {
1407                thread::spawn(move || {
1408                    let mut buffer = Vec::new();
1409                    for j in 0u8..255 {
1410                        ((i * 255 + u32::from(j)) % u32::from(u16::MAX))
1411                            .encode_into_buffer(&mut buffer);
1412                    }
1413                    buffer.len()
1414                })
1415            })
1416            .collect();
1417
1418        let mut total_bytes = 0;
1419        for handle in handles {
1420            total_bytes += handle.join().unwrap();
1421        }
1422
1423        // Should have encoded 100 * 255 = 25500 values
1424        assert!(total_bytes >= 25500); // At least 1 byte per value
1425        assert!(total_bytes < 76500); // At most 3 bytes per value
1426    }
1427
1428    #[cfg(feature = "std")]
1429    #[test]
1430    fn concurrency_test_stress_shared_read() {
1431        use std::sync::Arc;
1432        use std::thread;
1433
1434        // Pre-encode a large dataset
1435        let mut data = Vec::new();
1436        for i in 0u32..10000 {
1437            i.encode_into_buffer(&mut data);
1438        }
1439        let shared_data = Arc::new(data);
1440
1441        // Many threads read the same data
1442        let handles: Vec<_> = (0..50)
1443            .map(|_| {
1444                let data = Arc::clone(&shared_data);
1445                thread::spawn(move || {
1446                    let mut slice = &data[..];
1447                    let mut count = 0;
1448                    while !slice.is_empty() {
1449                        if let Ok((_, remaining)) = u32::try_decode_from(slice) {
1450                            count += 1;
1451                            slice = remaining;
1452                        } else {
1453                            break;
1454                        }
1455                    }
1456                    count
1457                })
1458            })
1459            .collect();
1460
1461        for handle in handles {
1462            let count = handle.join().unwrap();
1463            assert_eq!(count, 10000);
1464        }
1465    }
1466
1467    // ========================================================================
1468    // Concurrency Tests - Work Stealing Pattern
1469    // ========================================================================
1470
1471    #[cfg(feature = "std")]
1472    #[test]
1473    fn concurrency_test_work_stealing() {
1474        use std::sync::Arc;
1475        use std::sync::Mutex;
1476        use std::thread;
1477
1478        // Shared work queue
1479        let work_queue = Arc::new(Mutex::new((0u32..1000).collect::<Vec<_>>()));
1480        let results = Arc::new(Mutex::new(Vec::new()));
1481
1482        // Worker threads steal work from queue
1483        let workers: Vec<_> = (0..4)
1484            .map(|_| {
1485                let queue = Arc::clone(&work_queue);
1486                let results = Arc::clone(&results);
1487                thread::spawn(move || {
1488                    loop {
1489                        let work_item = {
1490                            let mut queue = queue.lock().unwrap();
1491                            queue.pop()
1492                        };
1493
1494                        match work_item {
1495                            Some(value) => {
1496                                // Encode and decode
1497                                let encoded = value.encode_into();
1498                                let (decoded, _) = u32::try_decode_from(&encoded).unwrap();
1499                                results.lock().unwrap().push(decoded);
1500                            }
1501                            None => break,
1502                        }
1503                    }
1504                })
1505            })
1506            .collect();
1507
1508        for worker in workers {
1509            worker.join().unwrap();
1510        }
1511
1512        let results = results.lock().unwrap();
1513        assert_eq!(results.len(), 1000);
1514    }
1515}