1 use super::*; 2 3 // Note(Lokathor): This is the neat part!! 4 unsafe impl<T: ZeroableInOption> Zeroable for Option<T> {} 5 6 /// Trait for types which are [Zeroable](Zeroable) when wrapped in 7 /// [Option](core::option::Option). 8 /// 9 /// ## Safety 10 /// 11 /// * `Option<YourType>` must uphold the same invariants as 12 /// [Zeroable](Zeroable). 13 pub unsafe trait ZeroableInOption: Sized {} 14 15 unsafe impl ZeroableInOption for NonZeroI8 {} 16 unsafe impl ZeroableInOption for NonZeroI16 {} 17 unsafe impl ZeroableInOption for NonZeroI32 {} 18 unsafe impl ZeroableInOption for NonZeroI64 {} 19 unsafe impl ZeroableInOption for NonZeroI128 {} 20 unsafe impl ZeroableInOption for NonZeroIsize {} 21 unsafe impl ZeroableInOption for NonZeroU8 {} 22 unsafe impl ZeroableInOption for NonZeroU16 {} 23 unsafe impl ZeroableInOption for NonZeroU32 {} 24 unsafe impl ZeroableInOption for NonZeroU64 {} 25 unsafe impl ZeroableInOption for NonZeroU128 {} 26 unsafe impl ZeroableInOption for NonZeroUsize {} 27 28 // Note: this does not create NULL vtable because we get `None` anyway. 29 unsafe impl<T: ?Sized> ZeroableInOption for NonNull<T> {} 30 unsafe impl<T: ?Sized> ZeroableInOption for &'_ T {} 31 unsafe impl<T: ?Sized> ZeroableInOption for &'_ mut T {} 32 33 #[cfg(feature = "extern_crate_alloc")] 34 #[cfg_attr(feature = "nightly_docs", doc(cfg(feature = "extern_crate_alloc")))] 35 unsafe impl<T: ?Sized> ZeroableInOption for alloc::boxed::Box<T> {} 36