| 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 | |