light_zero_copy/
lib.rs

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