Remove duplication of layout size check
This commit is contained in:
parent
079d3eb22f
commit
11694905b4
@ -68,6 +68,13 @@ pub const fn from_size_align(size: usize, align: usize) -> Result<Self, LayoutEr
|
|||||||
return Err(LayoutError);
|
return Err(LayoutError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SAFETY: just checked that align is a power of two.
|
||||||
|
Layout::from_size_valid_align(size, unsafe { ValidAlign::new_unchecked(align) })
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Internal helper constructor to skip revalidating alignment validity.
|
||||||
|
#[inline]
|
||||||
|
const fn from_size_valid_align(size: usize, align: ValidAlign) -> Result<Self, LayoutError> {
|
||||||
// (power-of-two implies align != 0.)
|
// (power-of-two implies align != 0.)
|
||||||
|
|
||||||
// Rounded up size is:
|
// Rounded up size is:
|
||||||
@ -82,23 +89,11 @@ pub const fn from_size_align(size: usize, align: usize) -> Result<Self, LayoutEr
|
|||||||
//
|
//
|
||||||
// Above implies that checking for summation overflow is both
|
// Above implies that checking for summation overflow is both
|
||||||
// necessary and sufficient.
|
// necessary and sufficient.
|
||||||
if size > isize::MAX as usize - (align - 1) {
|
|
||||||
return Err(LayoutError);
|
|
||||||
}
|
|
||||||
|
|
||||||
// SAFETY: the conditions for `from_size_align_unchecked` have been
|
|
||||||
// checked above.
|
|
||||||
unsafe { Ok(Layout::from_size_align_unchecked(size, align)) }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Internal helper constructor to skip revalidating alignment validity.
|
|
||||||
#[inline]
|
|
||||||
const fn from_size_valid_align(size: usize, align: ValidAlign) -> Result<Self, LayoutError> {
|
|
||||||
// See above for the correctness of this check.
|
|
||||||
if size > isize::MAX as usize - (align.as_nonzero().get() - 1) {
|
if size > isize::MAX as usize - (align.as_nonzero().get() - 1) {
|
||||||
return Err(LayoutError);
|
return Err(LayoutError);
|
||||||
}
|
}
|
||||||
// SAFTEY: as above, this check is sufficient.
|
|
||||||
|
// SAFETY: Layout::size invariants checked above.
|
||||||
Ok(Layout { size, align })
|
Ok(Layout { size, align })
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,8 +108,8 @@ const fn from_size_valid_align(size: usize, align: ValidAlign) -> Result<Self, L
|
|||||||
#[must_use]
|
#[must_use]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Self {
|
pub const unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Self {
|
||||||
// SAFETY: the caller must ensure that `align` is a power of two.
|
// SAFETY: the caller is required to uphold the preconditions.
|
||||||
Layout { size, align: unsafe { ValidAlign::new_unchecked(align) } }
|
unsafe { Layout { size, align: ValidAlign::new_unchecked(align) } }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The minimum size in bytes for a memory block of this layout.
|
/// The minimum size in bytes for a memory block of this layout.
|
||||||
|
Loading…
Reference in New Issue
Block a user