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#[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 {}