1use crate::{
2 Layout,
3 data::type_props::USIZE_HIGH_BIT,
4 error::{AlignErr, LayoutErr}
5};
6
7#[cfg(feature = "metadata")]
8#[must_use = "this returns a new pointer"]
10pub const fn with_meta<T: ?Sized, U: ?Sized>(ptr: *mut T, meta: *const U) -> *mut U {
11 core::ptr::from_raw_parts_mut(ptr.cast::<()>(), core::ptr::metadata(meta))
12}
13
14#[cfg(feature = "metadata")]
15#[must_use = "this returns a new pointer"]
17pub const fn with_meta_const<T: ?Sized, U: ?Sized>(ptr: *const T, meta: *const U) -> *const U {
18 core::ptr::from_raw_parts(ptr.cast::<()>(), core::ptr::metadata(meta))
19}
20
21#[cfg_attr(not(feature = "dev"), doc(hidden))]
27pub const fn lay_from_size_align(size: usize, align: usize) -> Result<Layout, LayoutErr> {
28 tri!(do check_lay(size, align));
29
30 Ok(unsafe { Layout::from_size_align_unchecked(size, align) })
32}
33
34#[cfg_attr(not(feature = "dev"), doc(hidden))]
43pub const fn check_lay(size: usize, align: usize) -> Result<(), LayoutErr> {
44 if align == 0 {
45 return Err(LayoutErr::Align(AlignErr::ZeroAlign));
46 } else if !align.is_power_of_two() {
47 return Err(LayoutErr::Align(AlignErr::NonPowerOfTwoAlign(align)));
48 } else if size > USIZE_HIGH_BIT - align {
49 return Err(LayoutErr::ExceedsMax);
50 }
51 Ok(())
52}