light_zero_copy/
lib.rs

1#![no_std]
2#[cfg(feature = "alloc")]
3extern crate alloc;
4
5pub mod cyclic_vec;
6pub mod errors;
7#[cfg(feature = "std")]
8pub mod num_trait;
9pub mod slice;
10pub mod slice_mut;
11pub mod vec;
12use core::mem::{align_of, size_of};
13#[cfg(feature = "alloc")]
14pub mod traits;
15#[cfg(all(feature = "derive", feature = "mut"))]
16pub use light_zero_copy_derive::ZeroCopyMut;
17#[cfg(feature = "derive")]
18pub use light_zero_copy_derive::{ZeroCopy, ZeroCopyEq};
19#[cfg(feature = "alloc")]
20pub use traits::ZeroCopyNew;
21#[cfg(feature = "alloc")]
22pub use traits::ZeroCopyStructInner;
23#[cfg(feature = "derive")]
24pub use zerocopy::{
25    little_endian::{self, U16, U32, U64},
26    Ref, Unaligned,
27};
28pub use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
29
30#[cfg(feature = "std")]
31extern crate std;
32
33pub fn add_padding<LEN, T>(offset: &mut usize) {
34    let padding = align_of::<T>().saturating_sub(size_of::<LEN>());
35    *offset += padding;
36}
37
38/// Safely converts u32 to usize with platform overflow detection.
39#[inline]
40pub fn u32_to_usize(value: u32) -> Result<usize, errors::ZeroCopyError> {
41    let result = value as usize;
42    if result as u32 != value {
43        return Err(errors::ZeroCopyError::PlatformSizeOverflow);
44    }
45    Ok(result)
46}
47pub trait ZeroCopyTraits: Copy + KnownLayout + Immutable + FromBytes + IntoBytes {}
48
49impl<T> ZeroCopyTraits for T where T: Copy + KnownLayout + Immutable + FromBytes + IntoBytes {}