Skip to content

Commit

Permalink
Enable Vec's calloc optimization for Option<NonZero>
Browse files Browse the repository at this point in the history
  • Loading branch information
scottmcm committed May 27, 2021
1 parent 3bcaeb0 commit 04d34a9
Showing 1 changed file with 33 additions and 0 deletions.
33 changes: 33 additions & 0 deletions library/alloc/src/vec/is_zero.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,36 @@ unsafe impl<T: ?Sized> IsZero for Option<Box<T>> {
self.is_none()
}
}

// `Option<num::NonZeroU32>` and similar have a representation guarantee that
// they're the same size as the corresponding `u32` type, as well as a guarantee
// that transmuting between `NonZeroU32` and `Option<num::NonZeroU32>` works.
// While the documentation officially makes in UB to transmute from `None`,
// we're the standard library so we can make extra inferences, and we know that
// the only niche available to represent `None` is the one that's all zeros.

macro_rules! impl_is_zero_option_of_nonzero {
($($t:ident,)+) => {$(
unsafe impl IsZero for Option<core::num::$t> {
#[inline]
fn is_zero(&self) -> bool {
self.is_none()
}
}
)+};
}

impl_is_zero_option_of_nonzero!(
NonZeroU8,
NonZeroU16,
NonZeroU32,
NonZeroU64,
NonZeroU128,
NonZeroI8,
NonZeroI16,
NonZeroI32,
NonZeroI64,
NonZeroI128,
NonZeroUsize,
NonZeroIsize,
);

0 comments on commit 04d34a9

Please sign in to comment.