33use crate :: cmp:: Ordering ;
44use crate :: fmt;
55use crate :: hash:: { Hash , Hasher } ;
6- use crate :: marker:: StructuralPartialEq ;
6+ use crate :: marker:: { StructuralEq , StructuralPartialEq } ;
77use crate :: ops:: { BitOr , BitOrAssign , Div , Neg , Rem } ;
88use crate :: str:: FromStr ;
99
@@ -30,9 +30,7 @@ mod private {
3030 issue = "none"
3131) ]
3232#[ const_trait]
33- pub trait ZeroablePrimitive : Sized + Copy + private:: Sealed {
34- type NonZero ;
35- }
33+ pub trait ZeroablePrimitive : Sized + Copy + private:: Sealed { }
3634
3735macro_rules! impl_zeroable_primitive {
3836 ( $NonZero: ident ( $primitive: ty ) ) => {
@@ -48,9 +46,7 @@ macro_rules! impl_zeroable_primitive {
4846 reason = "implementation detail which may disappear or be replaced at any time" ,
4947 issue = "none"
5048 ) ]
51- impl const ZeroablePrimitive for $primitive {
52- type NonZero = $NonZero;
53- }
49+ impl const ZeroablePrimitive for $primitive { }
5450 } ;
5551}
5652
@@ -67,12 +63,23 @@ impl_zeroable_primitive!(NonZeroI64(i64));
6763impl_zeroable_primitive ! ( NonZeroI128 ( i128 ) ) ;
6864impl_zeroable_primitive ! ( NonZeroIsize ( isize ) ) ;
6965
70- #[ unstable(
71- feature = "nonzero_internals" ,
72- reason = "implementation detail which may disappear or be replaced at any time" ,
73- issue = "none"
74- ) ]
75- pub ( crate ) type NonZero < T > = <T as ZeroablePrimitive >:: NonZero ;
66+ /// A value that is known not to equal zero.
67+ ///
68+ /// This enables some memory layout optimization.
69+ /// For example, `Option<NonZero<u32>>` is the same size as `u32`:
70+ ///
71+ /// ```
72+ /// #![feature(generic_nonzero)]
73+ /// use core::mem::size_of;
74+ ///
75+ /// assert_eq!(size_of::<Option<core::num::NonZero<u32>>>(), size_of::<u32>());
76+ /// ```
77+ #[ unstable( feature = "generic_nonzero" , issue = "82363" ) ]
78+ #[ repr( transparent) ]
79+ #[ rustc_layout_scalar_valid_range_start( 1 ) ]
80+ #[ rustc_nonnull_optimization_guaranteed]
81+ #[ rustc_diagnostic_item = "NonZero" ]
82+ pub struct NonZero < T : ZeroablePrimitive > ( T ) ;
7683
7784macro_rules! impl_nonzero_traits {
7885 ( #[ $stability: meta] $Ty: ty) => {
@@ -85,6 +92,9 @@ macro_rules! impl_nonzero_traits {
8592 }
8693 }
8794
95+ #[ $stability]
96+ impl Copy for $Ty { }
97+
8898 #[ $stability]
8999 impl PartialEq for $Ty {
90100 #[ inline]
@@ -101,6 +111,12 @@ macro_rules! impl_nonzero_traits {
101111 #[ unstable( feature = "structural_match" , issue = "31434" ) ]
102112 impl StructuralPartialEq for $Ty { }
103113
114+ #[ $stability]
115+ impl Eq for $Ty { }
116+
117+ #[ unstable( feature = "structural_match" , issue = "31434" ) ]
118+ impl StructuralEq for $Ty { }
119+
104120 #[ $stability]
105121 impl PartialOrd for $Ty {
106122 #[ inline]
@@ -225,12 +241,7 @@ macro_rules! nonzero_integer {
225241 ///
226242 /// [null pointer optimization]: crate::option#representation
227243 #[ $stability]
228- #[ derive( Copy , Eq ) ]
229- #[ repr( transparent) ]
230- #[ rustc_layout_scalar_valid_range_start( 1 ) ]
231- #[ rustc_nonnull_optimization_guaranteed]
232- #[ rustc_diagnostic_item = stringify!( $Ty) ]
233- pub struct $Ty( $Int) ;
244+ pub type $Ty = crate :: num:: NonZero <$Int>;
234245
235246 impl_nonzero_traits!( #[ $stability] $Ty) ;
236247
0 commit comments