#![no_std]
use core::{mem, slice};
use core::marker::PhantomData;
mod data_view;
pub use self::data_view::DataView;
#[cfg(feature = "derive_pod")]
#[doc(inline)]
pub use ::derive_pod::Pod;
#[cfg(feature = "derive_pod")]
#[doc(hidden)]
pub use ::derive_pod::FieldOffsets;
mod derive_pod;
mod field_offsets;
mod offset_of;
#[macro_use]
mod embed;
pub unsafe trait Pod: 'static {}
#[inline]
pub fn zeroed<T: Pod>() -> T {
unsafe { mem::MaybeUninit::zeroed().assume_init() }
}
#[inline]
pub fn bytes<T: ?Sized + Pod>(src: &T) -> &[u8] {
unsafe { slice::from_raw_parts(src as *const _ as *const u8, mem::size_of_val(src)) }
}
#[inline]
pub fn bytes_mut<T: ?Sized + Pod>(src: &mut T) -> &mut [u8] {
unsafe { slice::from_raw_parts_mut(src as *mut _ as *mut u8, mem::size_of_val(src)) }
}
pub trait PodMethods {
fn zeroed() -> Self where Self: Sized;
fn as_bytes(&self) -> &[u8];
fn as_bytes_mut(&mut self) -> &mut [u8];
fn as_data_view(&self) -> &DataView;
fn as_data_view_mut(&mut self) -> &mut DataView;
}
impl<T: ?Sized + Pod> PodMethods for T {
#[inline]
fn zeroed() -> T where T: Sized {
zeroed()
}
#[inline]
fn as_bytes(&self) -> &[u8] {
bytes(self)
}
#[inline]
fn as_bytes_mut(&mut self) -> &mut [u8] {
bytes_mut(self)
}
#[inline]
fn as_data_view(&self) -> &DataView {
DataView::from(self)
}
#[inline]
fn as_data_view_mut(&mut self) -> &mut DataView {
DataView::from_mut(self)
}
}
unsafe impl Pod for () {}
unsafe impl Pod for i8 {}
unsafe impl Pod for i16 {}
unsafe impl Pod for i32 {}
unsafe impl Pod for i64 {}
unsafe impl Pod for i128 {}
unsafe impl Pod for isize {}
unsafe impl Pod for u8 {}
unsafe impl Pod for u16 {}
unsafe impl Pod for u32 {}
unsafe impl Pod for u64 {}
unsafe impl Pod for u128 {}
unsafe impl Pod for usize {}
unsafe impl Pod for f32 {}
unsafe impl Pod for f64 {}
#[cfg(feature = "int2ptr")]
unsafe impl<T: 'static> Pod for *const T {}
#[cfg(feature = "int2ptr")]
unsafe impl<T: 'static> Pod for *mut T {}
unsafe impl<T: 'static> Pod for PhantomData<T> {}
unsafe impl<T: Pod> Pod for [T] {}
unsafe impl<T: Pod, const N: usize> Pod for [T; N] {}
fn is_aligned<T>(ptr: *const T) -> bool {
let addr: usize = ptr.addr();
addr % mem::align_of::<T>() == 0
}
#[cfg(test)]
mod tests;
#[cfg(doc)]
#[doc = include_str!("../readme.md")]
fn readme() {}
#[doc(hidden)]
#[macro_export]
macro_rules! reveal_const {
($e:expr) => {
const _: [(); 0] = [(); $e];
};
}