Skip to main content

core/num/
nonzero.rs

1//! Definitions of integer that is known not to equal zero.
2
3use super::{IntErrorKind, ParseIntError};
4use crate::clone::{TrivialClone, UseCloned};
5use crate::cmp::Ordering;
6use crate::hash::{Hash, Hasher};
7use crate::marker::{Destruct, Freeze, StructuralPartialEq};
8use crate::num::imp;
9use crate::ops::{BitOr, BitOrAssign, Div, DivAssign, Neg, Rem, RemAssign};
10use crate::panic::{RefUnwindSafe, UnwindSafe};
11use crate::str::FromStr;
12use crate::{fmt, intrinsics, ptr, ub_checks};
13
14/// A marker trait for primitive types which can be zero.
15///
16/// This is an implementation detail for <code>[NonZero]\<T></code> which may disappear or be replaced at any time.
17///
18/// # Safety
19///
20/// Types implementing this trait must be primitives that are valid when zeroed.
21///
22/// The associated `Self::NonZeroInner` type must have the same size+align as `Self`,
23/// but with a niche and bit validity making it so the following `transmutes` are sound:
24///
25/// - `Self::NonZeroInner` to `Option<Self::NonZeroInner>`
26/// - `Option<Self::NonZeroInner>` to `Self`
27///
28/// (And, consequently, `Self::NonZeroInner` to `Self`.)
29#[unstable(
30    feature = "nonzero_internals",
31    reason = "implementation detail which may disappear or be replaced at any time",
32    issue = "none"
33)]
34pub impl(self) unsafe trait ZeroablePrimitive: Sized + Copy {
35    /// A type like `Self` but with a niche that includes zero.
36    type NonZeroInner: Sized + Copy;
37}
38
39macro_rules! impl_zeroable_primitive {
40    ($($NonZeroInner:ident ( $primitive:ty )),+ $(,)?) => {
41        $(
42            #[unstable(
43                feature = "nonzero_internals",
44                reason = "implementation detail which may disappear or be replaced at any time",
45                issue = "none"
46            )]
47            unsafe impl ZeroablePrimitive for $primitive {
48                type NonZeroInner = super::niche_types::$NonZeroInner;
49            }
50        )+
51    };
52}
53
54impl_zeroable_primitive!(
55    NonZeroU8Inner(u8),
56    NonZeroU16Inner(u16),
57    NonZeroU32Inner(u32),
58    NonZeroU64Inner(u64),
59    NonZeroU128Inner(u128),
60    NonZeroUsizeInner(usize),
61    NonZeroI8Inner(i8),
62    NonZeroI16Inner(i16),
63    NonZeroI32Inner(i32),
64    NonZeroI64Inner(i64),
65    NonZeroI128Inner(i128),
66    NonZeroIsizeInner(isize),
67    NonZeroCharInner(char),
68);
69
70/// A value that is known not to equal zero.
71///
72/// This enables some memory layout optimization.
73/// For example, `Option<NonZero<u32>>` is the same size as `u32`:
74///
75/// ```
76/// use core::num::NonZero;
77///
78/// assert_eq!(size_of::<Option<NonZero<u32>>>(), size_of::<u32>());
79/// ```
80///
81/// # Layout
82///
83/// `NonZero<T>` is guaranteed to have the same layout and bit validity as `T`
84/// with the exception that the all-zero bit pattern is invalid.
85/// `Option<NonZero<T>>` is guaranteed to be ABI-compatible with `T`, including in
86/// FFI.
87///
88/// Thanks to the [null pointer optimization], `NonZero<T>` and
89/// `Option<NonZero<T>>` are guaranteed to have the same size and alignment:
90///
91/// ```
92/// use std::num::NonZero;
93///
94/// assert_eq!(size_of::<NonZero<u32>>(), size_of::<Option<NonZero<u32>>>());
95/// assert_eq!(align_of::<NonZero<u32>>(), align_of::<Option<NonZero<u32>>>());
96/// ```
97///
98/// [null pointer optimization]: crate::option#representation
99///
100/// # Note on generic usage
101///
102/// `NonZero<T>` can only be used with some standard library primitive types
103/// (such as `u8`, `i32`, and etc.). The type parameter `T` must implement the
104/// internal trait [`ZeroablePrimitive`], which is currently permanently unstable
105/// and cannot be implemented by users. Therefore, you cannot use `NonZero<T>`
106/// with your own types, nor can you implement traits for all `NonZero<T>`,
107/// only for concrete types.
108#[stable(feature = "generic_nonzero", since = "1.79.0")]
109#[repr(transparent)]
110#[rustc_nonnull_optimization_guaranteed]
111#[rustc_diagnostic_item = "NonZero"]
112#[ferrocene::prevalidated]
113pub struct NonZero<T: ZeroablePrimitive>(T::NonZeroInner);
114
115macro_rules! impl_nonzero_fmt {
116    ($(#[$Attribute:meta] $Trait:ident)*) => {
117        $(
118            #[$Attribute]
119            impl<T> fmt::$Trait for NonZero<T>
120            where
121                T: ZeroablePrimitive + fmt::$Trait,
122            {
123                #[inline]
124                #[ferrocene::prevalidated]
125                fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
126                    self.get().fmt(f)
127                }
128            }
129        )*
130    };
131}
132
133impl_nonzero_fmt! {
134    #[stable(feature = "nonzero", since = "1.28.0")]
135    Debug
136    #[stable(feature = "nonzero", since = "1.28.0")]
137    Display
138    #[stable(feature = "nonzero", since = "1.28.0")]
139    Binary
140    #[stable(feature = "nonzero", since = "1.28.0")]
141    Octal
142    #[stable(feature = "nonzero", since = "1.28.0")]
143    LowerHex
144    #[stable(feature = "nonzero", since = "1.28.0")]
145    UpperHex
146    #[stable(feature = "nonzero_fmt_exp", since = "1.84.0")]
147    LowerExp
148    #[stable(feature = "nonzero_fmt_exp", since = "1.84.0")]
149    UpperExp
150}
151
152macro_rules! impl_nonzero_auto_trait {
153    (unsafe $Trait:ident) => {
154        #[stable(feature = "nonzero", since = "1.28.0")]
155        unsafe impl<T> $Trait for NonZero<T> where T: ZeroablePrimitive + $Trait {}
156    };
157    ($Trait:ident) => {
158        #[stable(feature = "nonzero", since = "1.28.0")]
159        impl<T> $Trait for NonZero<T> where T: ZeroablePrimitive + $Trait {}
160    };
161}
162
163// Implement auto-traits manually based on `T` to avoid docs exposing
164// the `ZeroablePrimitive::NonZeroInner` implementation detail.
165impl_nonzero_auto_trait!(unsafe Freeze);
166impl_nonzero_auto_trait!(RefUnwindSafe);
167impl_nonzero_auto_trait!(unsafe Send);
168impl_nonzero_auto_trait!(unsafe Sync);
169impl_nonzero_auto_trait!(Unpin);
170impl_nonzero_auto_trait!(UnwindSafe);
171
172#[stable(feature = "nonzero", since = "1.28.0")]
173#[rustc_const_unstable(feature = "const_clone", issue = "142757")]
174const impl<T> Clone for NonZero<T>
175where
176    T: ZeroablePrimitive,
177{
178    #[inline]
179    #[ferrocene::prevalidated]
180    fn clone(&self) -> Self {
181        *self
182    }
183}
184
185#[unstable(feature = "ergonomic_clones", issue = "132290")]
186impl<T> UseCloned for NonZero<T> where T: ZeroablePrimitive {}
187
188#[stable(feature = "nonzero", since = "1.28.0")]
189impl<T> Copy for NonZero<T> where T: ZeroablePrimitive {}
190
191#[doc(hidden)]
192#[unstable(feature = "trivial_clone", issue = "none")]
193#[rustc_const_unstable(feature = "const_clone", issue = "142757")]
194const unsafe impl<T> TrivialClone for NonZero<T> where T: ZeroablePrimitive {}
195
196#[stable(feature = "nonzero", since = "1.28.0")]
197#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
198const impl<T> PartialEq for NonZero<T>
199where
200    T: ZeroablePrimitive + [const] PartialEq,
201{
202    #[inline]
203    #[ferrocene::prevalidated]
204    fn eq(&self, other: &Self) -> bool {
205        self.get() == other.get()
206    }
207
208    #[inline]
209    #[ferrocene::prevalidated]
210    fn ne(&self, other: &Self) -> bool {
211        self.get() != other.get()
212    }
213}
214
215#[unstable(feature = "structural_match", issue = "31434")]
216impl<T> StructuralPartialEq for NonZero<T> where T: ZeroablePrimitive + StructuralPartialEq {}
217
218#[stable(feature = "nonzero", since = "1.28.0")]
219#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
220const impl<T> Eq for NonZero<T> where T: ZeroablePrimitive + [const] Eq {}
221
222#[stable(feature = "nonzero", since = "1.28.0")]
223#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
224const impl<T> PartialOrd for NonZero<T>
225where
226    T: ZeroablePrimitive + [const] PartialOrd,
227{
228    #[inline]
229    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
230        self.get().partial_cmp(&other.get())
231    }
232
233    #[inline]
234    fn lt(&self, other: &Self) -> bool {
235        self.get() < other.get()
236    }
237
238    #[inline]
239    fn le(&self, other: &Self) -> bool {
240        self.get() <= other.get()
241    }
242
243    #[inline]
244    fn gt(&self, other: &Self) -> bool {
245        self.get() > other.get()
246    }
247
248    #[inline]
249    fn ge(&self, other: &Self) -> bool {
250        self.get() >= other.get()
251    }
252}
253
254#[stable(feature = "nonzero", since = "1.28.0")]
255#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
256const impl<T> Ord for NonZero<T>
257where
258    // FIXME(const_hack): the T: ~const Destruct should be inferred from the Self: ~const Destruct.
259    // See https://github.com/rust-lang/rust/issues/144207
260    T: ZeroablePrimitive + [const] Ord + [const] Destruct,
261{
262    #[inline]
263    fn cmp(&self, other: &Self) -> Ordering {
264        self.get().cmp(&other.get())
265    }
266
267    #[inline]
268    fn max(self, other: Self) -> Self {
269        // SAFETY: The maximum of two non-zero values is still non-zero.
270        unsafe { Self::new_unchecked(self.get().max(other.get())) }
271    }
272
273    #[inline]
274    fn min(self, other: Self) -> Self {
275        // SAFETY: The minimum of two non-zero values is still non-zero.
276        unsafe { Self::new_unchecked(self.get().min(other.get())) }
277    }
278
279    #[inline]
280    fn clamp(self, min: Self, max: Self) -> Self {
281        // SAFETY: A non-zero value clamped between two non-zero values is still non-zero.
282        unsafe { Self::new_unchecked(self.get().clamp(min.get(), max.get())) }
283    }
284}
285
286#[stable(feature = "nonzero", since = "1.28.0")]
287impl<T> Hash for NonZero<T>
288where
289    T: ZeroablePrimitive + Hash,
290{
291    #[inline]
292    #[ferrocene::prevalidated]
293    fn hash<H>(&self, state: &mut H)
294    where
295        H: Hasher,
296    {
297        self.get().hash(state)
298    }
299}
300
301#[stable(feature = "from_nonzero", since = "1.31.0")]
302#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
303const impl<T> From<NonZero<T>> for T
304where
305    T: ZeroablePrimitive,
306{
307    #[inline]
308    fn from(nonzero: NonZero<T>) -> Self {
309        // Call `get` method to keep range information.
310        nonzero.get()
311    }
312}
313
314#[stable(feature = "nonzero_bitor", since = "1.45.0")]
315#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
316const impl<T> BitOr for NonZero<T>
317where
318    T: ZeroablePrimitive + [const] BitOr<Output = T>,
319{
320    type Output = Self;
321
322    #[inline]
323    fn bitor(self, rhs: Self) -> Self::Output {
324        // SAFETY: Bitwise OR of two non-zero values is still non-zero.
325        unsafe { Self::new_unchecked(self.get() | rhs.get()) }
326    }
327}
328
329#[stable(feature = "nonzero_bitor", since = "1.45.0")]
330#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
331const impl<T> BitOr<T> for NonZero<T>
332where
333    T: ZeroablePrimitive + [const] BitOr<Output = T>,
334{
335    type Output = Self;
336
337    #[inline]
338    fn bitor(self, rhs: T) -> Self::Output {
339        // SAFETY: Bitwise OR of a non-zero value with anything is still non-zero.
340        unsafe { Self::new_unchecked(self.get() | rhs) }
341    }
342}
343
344#[stable(feature = "nonzero_bitor", since = "1.45.0")]
345#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
346const impl<T> BitOr<NonZero<T>> for T
347where
348    T: ZeroablePrimitive + [const] BitOr<Output = T>,
349{
350    type Output = NonZero<T>;
351
352    #[inline]
353    fn bitor(self, rhs: NonZero<T>) -> Self::Output {
354        // SAFETY: Bitwise OR of anything with a non-zero value is still non-zero.
355        unsafe { NonZero::new_unchecked(self | rhs.get()) }
356    }
357}
358
359#[stable(feature = "nonzero_bitor", since = "1.45.0")]
360#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
361const impl<T> BitOrAssign for NonZero<T>
362where
363    T: ZeroablePrimitive,
364    Self: [const] BitOr<Output = Self>,
365{
366    #[inline]
367    fn bitor_assign(&mut self, rhs: Self) {
368        *self = *self | rhs;
369    }
370}
371
372#[stable(feature = "nonzero_bitor", since = "1.45.0")]
373#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
374const impl<T> BitOrAssign<T> for NonZero<T>
375where
376    T: ZeroablePrimitive,
377    Self: [const] BitOr<T, Output = Self>,
378{
379    #[inline]
380    fn bitor_assign(&mut self, rhs: T) {
381        *self = *self | rhs;
382    }
383}
384
385impl<T> NonZero<T>
386where
387    T: ZeroablePrimitive,
388{
389    /// Creates a non-zero if the given value is not zero.
390    #[stable(feature = "nonzero", since = "1.28.0")]
391    #[rustc_const_stable(feature = "const_nonzero_int_methods", since = "1.47.0")]
392    #[must_use]
393    #[inline]
394    #[ferrocene::prevalidated]
395    pub const fn new(n: T) -> Option<Self> {
396        // SAFETY: Memory layout optimization guarantees that `Option<NonZero<T>>` has
397        //         the same layout and size as `T`, with `0` representing `None`.
398        unsafe { intrinsics::transmute_unchecked(n) }
399    }
400
401    /// Creates a non-zero without checking whether the value is non-zero.
402    /// This results in undefined behavior if the value is zero.
403    ///
404    /// # Safety
405    ///
406    /// The value must not be zero.
407    #[stable(feature = "nonzero", since = "1.28.0")]
408    #[rustc_const_stable(feature = "nonzero", since = "1.28.0")]
409    #[must_use]
410    #[inline]
411    #[track_caller]
412    #[ferrocene::prevalidated]
413    pub const unsafe fn new_unchecked(n: T) -> Self {
414        match Self::new(n) {
415            Some(n) => n,
416            #[ferrocene::annotation(
417                "This line cannot be covered as reaching `intrinsics::unreachable` is undefined behavior."
418            )]
419            None => {
420                // SAFETY: The caller guarantees that `n` is non-zero, so this is unreachable.
421                unsafe {
422                    ub_checks::assert_unsafe_precondition!(
423                        check_language_ub,
424                        "NonZero::new_unchecked requires the argument to be non-zero",
425                        () => false,
426                    );
427                    intrinsics::unreachable()
428                }
429            }
430        }
431    }
432
433    /// Converts a reference to a non-zero mutable reference
434    /// if the referenced value is not zero.
435    #[unstable(feature = "nonzero_from_mut", issue = "106290")]
436    #[must_use]
437    #[inline]
438    pub fn from_mut(n: &mut T) -> Option<&mut Self> {
439        // SAFETY: Memory layout optimization guarantees that `Option<NonZero<T>>` has
440        //         the same layout and size as `T`, with `0` representing `None`.
441        let opt_n = unsafe { &mut *(ptr::from_mut(n).cast::<Option<Self>>()) };
442
443        opt_n.as_mut()
444    }
445
446    /// Converts a mutable reference to a non-zero mutable reference
447    /// without checking whether the referenced value is non-zero.
448    /// This results in undefined behavior if the referenced value is zero.
449    ///
450    /// # Safety
451    ///
452    /// The referenced value must not be zero.
453    #[unstable(feature = "nonzero_from_mut", issue = "106290")]
454    #[must_use]
455    #[inline]
456    #[track_caller]
457    pub unsafe fn from_mut_unchecked(n: &mut T) -> &mut Self {
458        match Self::from_mut(n) {
459            Some(n) => n,
460            None => {
461                // SAFETY: The caller guarantees that `n` references a value that is non-zero, so this is unreachable.
462                unsafe {
463                    ub_checks::assert_unsafe_precondition!(
464                        check_library_ub,
465                        "NonZero::from_mut_unchecked requires the argument to dereference as non-zero",
466                        () => false,
467                    );
468                    intrinsics::unreachable()
469                }
470            }
471        }
472    }
473
474    /// Returns the contained value as a primitive type.
475    #[stable(feature = "nonzero", since = "1.28.0")]
476    #[rustc_const_stable(feature = "const_nonzero_get", since = "1.34.0")]
477    #[inline]
478    #[ferrocene::prevalidated]
479    pub const fn get(self) -> T {
480        // Rustc can set range metadata only if it loads `self` from
481        // memory somewhere. If the value of `self` was from by-value argument
482        // of some not-inlined function, LLVM don't have range metadata
483        // to understand that the value cannot be zero.
484        //
485        // Using the transmute `assume`s the range at runtime.
486        //
487        // Even once LLVM supports `!range` metadata for function arguments
488        // (see <https://github.com/llvm/llvm-project/issues/76628>), this can't
489        // be `.0` because MCP#807 bans field-projecting into `scalar_valid_range`
490        // types, and it arguably wouldn't want to be anyway because if this is
491        // MIR-inlined, there's no opportunity to put that argument metadata anywhere.
492        //
493        // The good answer here will eventually be pattern types, which will hopefully
494        // allow it to go back to `.0`, maybe with a cast of some sort.
495        //
496        // SAFETY: `ZeroablePrimitive` guarantees that the size and bit validity
497        // of `.0` is such that this transmute is sound.
498        unsafe { intrinsics::transmute_unchecked(self) }
499    }
500}
501
502macro_rules! nonzero_integer {
503    (
504        #[$stability:meta]
505        Self = $Ty:ident,
506        Primitive = $signedness:ident $Int:ident,
507        SignedPrimitive = $Sint:ty,
508        UnsignedPrimitive = $Uint:ty,
509
510        // Used in doc comments.
511        rot = $rot:literal,
512        rot_op = $rot_op:literal,
513        rot_result = $rot_result:literal,
514        swap_op = $swap_op:literal,
515        swapped = $swapped:literal,
516        reversed = $reversed:literal,
517        leading_zeros_test = $leading_zeros_test:expr,
518    ) => {
519        #[doc = sign_dependent_expr!{
520            $signedness ?
521            if signed {
522                concat!("An [`", stringify!($Int), "`] that is known not to equal zero.")
523            }
524            if unsigned {
525                concat!("A [`", stringify!($Int), "`] that is known not to equal zero.")
526            }
527        }]
528        ///
529        /// This enables some memory layout optimization.
530        #[doc = concat!("For example, `Option<", stringify!($Ty), ">` is the same size as `", stringify!($Int), "`:")]
531        ///
532        /// ```rust
533        #[doc = concat!("assert_eq!(size_of::<Option<core::num::", stringify!($Ty), ">>(), size_of::<", stringify!($Int), ">());")]
534        /// ```
535        ///
536        /// # Layout
537        ///
538        #[doc = concat!("`", stringify!($Ty), "` is guaranteed to have the same layout and bit validity as `", stringify!($Int), "`")]
539        /// with the exception that `0` is not a valid instance.
540        #[doc = concat!("`Option<", stringify!($Ty), ">` is guaranteed to be ABI-compatible with `", stringify!($Int), "`,")]
541        /// including in FFI.
542        ///
543        /// Thanks to the [null pointer optimization],
544        #[doc = concat!("`", stringify!($Ty), "` and `Option<", stringify!($Ty), ">`")]
545        /// are guaranteed to have the same size and alignment:
546        ///
547        /// ```
548        #[doc = concat!("use std::num::", stringify!($Ty), ";")]
549        ///
550        #[doc = concat!("assert_eq!(size_of::<", stringify!($Ty), ">(), size_of::<Option<", stringify!($Ty), ">>());")]
551        #[doc = concat!("assert_eq!(align_of::<", stringify!($Ty), ">(), align_of::<Option<", stringify!($Ty), ">>());")]
552        /// ```
553        ///
554        /// # Compile-time creation
555        ///
556        /// Since both [`Option::unwrap()`] and [`Option::expect()`] are `const`, it is possible to
557        /// define a new
558        #[doc = concat!("`", stringify!($Ty), "`")]
559        /// at compile time via:
560        /// ```
561        #[doc = concat!("use std::num::", stringify!($Ty), ";")]
562        ///
563        #[doc = concat!("const TEN: ", stringify!($Ty), " = ", stringify!($Ty) , r#"::new(10).expect("ten is non-zero");"#)]
564        /// ```
565        ///
566        /// [null pointer optimization]: crate::option#representation
567        #[$stability]
568        pub type $Ty = NonZero<$Int>;
569
570        impl NonZero<$Int> {
571            /// The size of this non-zero integer type in bits.
572            ///
573            #[doc = concat!("This value is equal to [`", stringify!($Int), "::BITS`].")]
574            ///
575            /// # Examples
576            ///
577            /// ```
578            /// # use std::num::NonZero;
579            /// #
580            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::BITS, ", stringify!($Int), "::BITS);")]
581            /// ```
582            #[stable(feature = "nonzero_bits", since = "1.67.0")]
583            pub const BITS: u32 = <$Int>::BITS;
584
585            /// Returns the number of leading zeros in the binary representation of `self`.
586            ///
587            /// On many architectures, this function can perform better than `leading_zeros()` on the underlying integer type, as special handling of zero can be avoided.
588            ///
589            /// # Examples
590            ///
591            /// ```
592            /// # use std::num::NonZero;
593            /// #
594            /// # fn main() { test().unwrap(); }
595            /// # fn test() -> Option<()> {
596            #[doc = concat!("let n = NonZero::<", stringify!($Int), ">::new(", $leading_zeros_test, ")?;")]
597            ///
598            /// assert_eq!(n.leading_zeros(), 0);
599            /// # Some(())
600            /// # }
601            /// ```
602            #[stable(feature = "nonzero_leading_trailing_zeros", since = "1.53.0")]
603            #[rustc_const_stable(feature = "nonzero_leading_trailing_zeros", since = "1.53.0")]
604            #[must_use = "this returns the result of the operation, \
605                          without modifying the original"]
606            #[inline]
607            #[ferrocene::prevalidated]
608            pub const fn leading_zeros(self) -> u32 {
609                // SAFETY: since `self` cannot be zero, it is safe to call `ctlz_nonzero`.
610                unsafe {
611                    intrinsics::ctlz_nonzero(self.get() as $Uint)
612                }
613            }
614
615            /// Returns the number of trailing zeros in the binary representation
616            /// of `self`.
617            ///
618            /// On many architectures, this function can perform better than `trailing_zeros()` on the underlying integer type, as special handling of zero can be avoided.
619            ///
620            /// # Examples
621            ///
622            /// ```
623            /// # use std::num::NonZero;
624            /// #
625            /// # fn main() { test().unwrap(); }
626            /// # fn test() -> Option<()> {
627            #[doc = concat!("let n = NonZero::<", stringify!($Int), ">::new(0b0101000)?;")]
628            ///
629            /// assert_eq!(n.trailing_zeros(), 3);
630            /// # Some(())
631            /// # }
632            /// ```
633            #[stable(feature = "nonzero_leading_trailing_zeros", since = "1.53.0")]
634            #[rustc_const_stable(feature = "nonzero_leading_trailing_zeros", since = "1.53.0")]
635            #[must_use = "this returns the result of the operation, \
636                          without modifying the original"]
637            #[inline]
638            #[ferrocene::prevalidated]
639            pub const fn trailing_zeros(self) -> u32 {
640                // SAFETY: since `self` cannot be zero, it is safe to call `cttz_nonzero`.
641                unsafe {
642                    intrinsics::cttz_nonzero(self.get() as $Uint)
643                }
644            }
645
646            /// Returns `self` with only the most significant bit set.
647            ///
648            /// # Example
649            ///
650            /// ```
651            /// # use core::num::NonZero;
652            /// # fn main() { test().unwrap(); }
653            /// # fn test() -> Option<()> {
654            #[doc = concat!("let a = NonZero::<", stringify!($Int), ">::new(0b_01100100)?;")]
655            #[doc = concat!("let b = NonZero::<", stringify!($Int), ">::new(0b_01000000)?;")]
656            ///
657            /// assert_eq!(a.isolate_highest_one(), b);
658            /// # Some(())
659            /// # }
660            /// ```
661            #[stable(feature = "isolate_most_least_significant_one", since = "1.97.0")]
662            #[rustc_const_stable(feature = "isolate_most_least_significant_one", since = "1.97.0")]
663            #[must_use = "this returns the result of the operation, \
664                        without modifying the original"]
665            #[inline(always)]
666            pub const fn isolate_highest_one(self) -> Self {
667                // SAFETY:
668                // `self` is non-zero, so masking to preserve only the most
669                // significant set bit will result in a non-zero `n`.
670                // and self.leading_zeros() is always < $INT::BITS since
671                // at least one of the bits in the number is not zero
672                unsafe {
673                    let bit = (((1 as $Uint) << (<$Uint>::BITS - 1)).unchecked_shr(self.leading_zeros()));
674                    NonZero::new_unchecked(bit as $Int)
675                }
676            }
677
678            /// Returns `self` with only the least significant bit set.
679            ///
680            /// # Example
681            ///
682            /// ```
683            /// # use core::num::NonZero;
684            /// # fn main() { test().unwrap(); }
685            /// # fn test() -> Option<()> {
686            #[doc = concat!("let a = NonZero::<", stringify!($Int), ">::new(0b_01100100)?;")]
687            #[doc = concat!("let b = NonZero::<", stringify!($Int), ">::new(0b_00000100)?;")]
688            ///
689            /// assert_eq!(a.isolate_lowest_one(), b);
690            /// # Some(())
691            /// # }
692            /// ```
693            #[stable(feature = "isolate_most_least_significant_one", since = "1.97.0")]
694            #[rustc_const_stable(feature = "isolate_most_least_significant_one", since = "1.97.0")]
695            #[must_use = "this returns the result of the operation, \
696                        without modifying the original"]
697            #[inline(always)]
698            pub const fn isolate_lowest_one(self) -> Self {
699                let n = self.get();
700                let n = n & n.wrapping_neg();
701
702                // SAFETY: `self` is non-zero, so `self` with only its least
703                // significant set bit will remain non-zero.
704                unsafe { NonZero::new_unchecked(n) }
705            }
706
707            /// Returns the index of the highest bit set to one in `self`.
708            ///
709            #[doc = sign_dependent_expr!{
710                $signedness ?
711                if signed {
712                    ""
713                }
714                if unsigned {
715                    "Note that this is equivalent to [`ilog2`](Self::ilog2)."
716                }
717            }]
718            ///
719            /// # Examples
720            ///
721            /// ```
722            /// # use core::num::NonZero;
723            /// # fn main() { test().unwrap(); }
724            /// # fn test() -> Option<()> {
725            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1)?.highest_one(), 0);")]
726            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1_0000)?.highest_one(), 4);")]
727            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1_1111)?.highest_one(), 4);")]
728            /// # Some(())
729            /// # }
730            /// ```
731            #[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
732            #[rustc_const_stable(feature = "int_lowest_highest_one", since = "1.97.0")]
733            #[must_use = "this returns the result of the operation, \
734                          without modifying the original"]
735            #[inline(always)]
736            pub const fn highest_one(self) -> u32 {
737                Self::BITS - 1 - self.leading_zeros()
738            }
739
740            /// Returns the index of the lowest bit set to one in `self`.
741            ///
742            /// # Examples
743            ///
744            /// ```
745            /// # use core::num::NonZero;
746            /// # fn main() { test().unwrap(); }
747            /// # fn test() -> Option<()> {
748            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1)?.lowest_one(), 0);")]
749            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1_0000)?.lowest_one(), 4);")]
750            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1_1111)?.lowest_one(), 0);")]
751            /// # Some(())
752            /// # }
753            /// ```
754            #[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
755            #[rustc_const_stable(feature = "int_lowest_highest_one", since = "1.97.0")]
756            #[must_use = "this returns the result of the operation, \
757                          without modifying the original"]
758            #[inline(always)]
759            pub const fn lowest_one(self) -> u32 {
760                self.trailing_zeros()
761            }
762
763            /// Returns the number of ones in the binary representation of `self`.
764            ///
765            /// # Examples
766            ///
767            /// ```
768            /// # use std::num::NonZero;
769            /// #
770            /// # fn main() { test().unwrap(); }
771            /// # fn test() -> Option<()> {
772            #[doc = concat!("let a = NonZero::<", stringify!($Int), ">::new(0b100_0000)?;")]
773            #[doc = concat!("let b = NonZero::<", stringify!($Int), ">::new(0b100_0011)?;")]
774            ///
775            /// assert_eq!(a.count_ones(), NonZero::new(1)?);
776            /// assert_eq!(b.count_ones(), NonZero::new(3)?);
777            /// # Some(())
778            /// # }
779            /// ```
780            ///
781            #[stable(feature = "non_zero_count_ones", since = "1.86.0")]
782            #[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
783            #[doc(alias = "popcount")]
784            #[doc(alias = "popcnt")]
785            #[must_use = "this returns the result of the operation, \
786                        without modifying the original"]
787            #[inline(always)]
788            pub const fn count_ones(self) -> NonZero<u32> {
789                // SAFETY:
790                // `self` is non-zero, which means it has at least one bit set, which means
791                // that the result of `count_ones` is non-zero.
792                unsafe { NonZero::new_unchecked(self.get().count_ones()) }
793            }
794
795            /// Shifts the bits to the left by a specified amount, `n`,
796            /// wrapping the truncated bits to the end of the resulting integer.
797            ///
798            /// Please note this isn't the same operation as the `<<` shifting operator!
799            ///
800            /// # Examples
801            ///
802            /// ```
803            /// #![feature(nonzero_bitwise)]
804            /// # use std::num::NonZero;
805            /// #
806            /// # fn main() { test().unwrap(); }
807            /// # fn test() -> Option<()> {
808            #[doc = concat!("let n = NonZero::new(", $rot_op, stringify!($Int), ")?;")]
809            #[doc = concat!("let m = NonZero::new(", $rot_result, ")?;")]
810            ///
811            #[doc = concat!("assert_eq!(n.rotate_left(", $rot, "), m);")]
812            /// # Some(())
813            /// # }
814            /// ```
815            #[unstable(feature = "nonzero_bitwise", issue = "128281")]
816            #[must_use = "this returns the result of the operation, \
817                        without modifying the original"]
818            #[inline(always)]
819            pub const fn rotate_left(self, n: u32) -> Self {
820                let result = self.get().rotate_left(n);
821                // SAFETY: Rotating bits preserves the property int > 0.
822                unsafe { Self::new_unchecked(result) }
823            }
824
825            /// Shifts the bits to the right by a specified amount, `n`,
826            /// wrapping the truncated bits to the beginning of the resulting
827            /// integer.
828            ///
829            /// Please note this isn't the same operation as the `>>` shifting operator!
830            ///
831            /// # Examples
832            ///
833            /// ```
834            /// #![feature(nonzero_bitwise)]
835            /// # use std::num::NonZero;
836            /// #
837            /// # fn main() { test().unwrap(); }
838            /// # fn test() -> Option<()> {
839            #[doc = concat!("let n = NonZero::new(", $rot_result, stringify!($Int), ")?;")]
840            #[doc = concat!("let m = NonZero::new(", $rot_op, ")?;")]
841            ///
842            #[doc = concat!("assert_eq!(n.rotate_right(", $rot, "), m);")]
843            /// # Some(())
844            /// # }
845            /// ```
846            #[unstable(feature = "nonzero_bitwise", issue = "128281")]
847            #[must_use = "this returns the result of the operation, \
848                        without modifying the original"]
849            #[inline(always)]
850            pub const fn rotate_right(self, n: u32) -> Self {
851                let result = self.get().rotate_right(n);
852                // SAFETY: Rotating bits preserves the property int > 0.
853                unsafe { Self::new_unchecked(result) }
854            }
855
856            /// Reverses the byte order of the integer.
857            ///
858            /// # Examples
859            ///
860            /// ```
861            /// #![feature(nonzero_bitwise)]
862            /// # use std::num::NonZero;
863            /// #
864            /// # fn main() { test().unwrap(); }
865            /// # fn test() -> Option<()> {
866            #[doc = concat!("let n = NonZero::new(", $swap_op, stringify!($Int), ")?;")]
867            /// let m = n.swap_bytes();
868            ///
869            #[doc = concat!("assert_eq!(m, NonZero::new(", $swapped, ")?);")]
870            /// # Some(())
871            /// # }
872            /// ```
873            #[unstable(feature = "nonzero_bitwise", issue = "128281")]
874            #[must_use = "this returns the result of the operation, \
875                        without modifying the original"]
876            #[inline(always)]
877            pub const fn swap_bytes(self) -> Self {
878                let result = self.get().swap_bytes();
879                // SAFETY: Shuffling bytes preserves the property int > 0.
880                unsafe { Self::new_unchecked(result) }
881            }
882
883            /// Reverses the order of bits in the integer. The least significant bit becomes the most significant bit,
884            /// second least-significant bit becomes second most-significant bit, etc.
885            ///
886            /// # Examples
887            ///
888            /// ```
889            /// #![feature(nonzero_bitwise)]
890            /// # use std::num::NonZero;
891            /// #
892            /// # fn main() { test().unwrap(); }
893            /// # fn test() -> Option<()> {
894            #[doc = concat!("let n = NonZero::new(", $swap_op, stringify!($Int), ")?;")]
895            /// let m = n.reverse_bits();
896            ///
897            #[doc = concat!("assert_eq!(m, NonZero::new(", $reversed, ")?);")]
898            /// # Some(())
899            /// # }
900            /// ```
901            #[unstable(feature = "nonzero_bitwise", issue = "128281")]
902            #[must_use = "this returns the result of the operation, \
903                        without modifying the original"]
904            #[inline(always)]
905            pub const fn reverse_bits(self) -> Self {
906                let result = self.get().reverse_bits();
907                // SAFETY: Reversing bits preserves the property int > 0.
908                unsafe { Self::new_unchecked(result) }
909            }
910
911            /// Converts an integer from big endian to the target's endianness.
912            ///
913            /// On big endian this is a no-op. On little endian the bytes are
914            /// swapped.
915            ///
916            /// # Examples
917            ///
918            /// ```
919            /// #![feature(nonzero_bitwise)]
920            /// # use std::num::NonZero;
921            #[doc = concat!("use std::num::", stringify!($Ty), ";")]
922            /// #
923            /// # fn main() { test().unwrap(); }
924            /// # fn test() -> Option<()> {
925            #[doc = concat!("let n = NonZero::new(0x1A", stringify!($Int), ")?;")]
926            ///
927            /// if cfg!(target_endian = "big") {
928            #[doc = concat!("    assert_eq!(", stringify!($Ty), "::from_be(n), n)")]
929            /// } else {
930            #[doc = concat!("    assert_eq!(", stringify!($Ty), "::from_be(n), n.swap_bytes())")]
931            /// }
932            /// # Some(())
933            /// # }
934            /// ```
935            #[unstable(feature = "nonzero_bitwise", issue = "128281")]
936            #[must_use]
937            #[inline(always)]
938            pub const fn from_be(x: Self) -> Self {
939                let result = $Int::from_be(x.get());
940                // SAFETY: Shuffling bytes preserves the property int > 0.
941                unsafe { Self::new_unchecked(result) }
942            }
943
944            /// Converts an integer from little endian to the target's endianness.
945            ///
946            /// On little endian this is a no-op. On big endian the bytes are
947            /// swapped.
948            ///
949            /// # Examples
950            ///
951            /// ```
952            /// #![feature(nonzero_bitwise)]
953            /// # use std::num::NonZero;
954            #[doc = concat!("use std::num::", stringify!($Ty), ";")]
955            /// #
956            /// # fn main() { test().unwrap(); }
957            /// # fn test() -> Option<()> {
958            #[doc = concat!("let n = NonZero::new(0x1A", stringify!($Int), ")?;")]
959            ///
960            /// if cfg!(target_endian = "little") {
961            #[doc = concat!("    assert_eq!(", stringify!($Ty), "::from_le(n), n)")]
962            /// } else {
963            #[doc = concat!("    assert_eq!(", stringify!($Ty), "::from_le(n), n.swap_bytes())")]
964            /// }
965            /// # Some(())
966            /// # }
967            /// ```
968            #[unstable(feature = "nonzero_bitwise", issue = "128281")]
969            #[must_use]
970            #[inline(always)]
971            pub const fn from_le(x: Self) -> Self {
972                let result = $Int::from_le(x.get());
973                // SAFETY: Shuffling bytes preserves the property int > 0.
974                unsafe { Self::new_unchecked(result) }
975            }
976
977            /// Converts `self` to big endian from the target's endianness.
978            ///
979            /// On big endian this is a no-op. On little endian the bytes are
980            /// swapped.
981            ///
982            /// # Examples
983            ///
984            /// ```
985            /// #![feature(nonzero_bitwise)]
986            /// # use std::num::NonZero;
987            /// #
988            /// # fn main() { test().unwrap(); }
989            /// # fn test() -> Option<()> {
990            #[doc = concat!("let n = NonZero::new(0x1A", stringify!($Int), ")?;")]
991            ///
992            /// if cfg!(target_endian = "big") {
993            ///     assert_eq!(n.to_be(), n)
994            /// } else {
995            ///     assert_eq!(n.to_be(), n.swap_bytes())
996            /// }
997            /// # Some(())
998            /// # }
999            /// ```
1000            #[unstable(feature = "nonzero_bitwise", issue = "128281")]
1001            #[must_use = "this returns the result of the operation, \
1002                        without modifying the original"]
1003            #[inline(always)]
1004            pub const fn to_be(self) -> Self {
1005                let result = self.get().to_be();
1006                // SAFETY: Shuffling bytes preserves the property int > 0.
1007                unsafe { Self::new_unchecked(result) }
1008            }
1009
1010            /// Converts `self` to little endian from the target's endianness.
1011            ///
1012            /// On little endian this is a no-op. On big endian the bytes are
1013            /// swapped.
1014            ///
1015            /// # Examples
1016            ///
1017            /// ```
1018            /// #![feature(nonzero_bitwise)]
1019            /// # use std::num::NonZero;
1020            /// #
1021            /// # fn main() { test().unwrap(); }
1022            /// # fn test() -> Option<()> {
1023            #[doc = concat!("let n = NonZero::new(0x1A", stringify!($Int), ")?;")]
1024            ///
1025            /// if cfg!(target_endian = "little") {
1026            ///     assert_eq!(n.to_le(), n)
1027            /// } else {
1028            ///     assert_eq!(n.to_le(), n.swap_bytes())
1029            /// }
1030            /// # Some(())
1031            /// # }
1032            /// ```
1033            #[unstable(feature = "nonzero_bitwise", issue = "128281")]
1034            #[must_use = "this returns the result of the operation, \
1035                        without modifying the original"]
1036            #[inline(always)]
1037            pub const fn to_le(self) -> Self {
1038                let result = self.get().to_le();
1039                // SAFETY: Shuffling bytes preserves the property int > 0.
1040                unsafe { Self::new_unchecked(result) }
1041            }
1042
1043            nonzero_integer_signedness_dependent_methods! {
1044                Primitive = $signedness $Int,
1045                SignedPrimitive = $Sint,
1046                UnsignedPrimitive = $Uint,
1047            }
1048
1049            /// Multiplies two non-zero integers together.
1050            /// Checks for overflow and returns [`None`] on overflow.
1051            /// As a consequence, the result cannot wrap to zero.
1052            ///
1053            /// # Examples
1054            ///
1055            /// ```
1056            /// # use std::num::NonZero;
1057            /// #
1058            /// # fn main() { test().unwrap(); }
1059            /// # fn test() -> Option<()> {
1060            #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1061            #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1062            #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1063            ///
1064            /// assert_eq!(Some(four), two.checked_mul(two));
1065            /// assert_eq!(None, max.checked_mul(two));
1066            /// # Some(())
1067            /// # }
1068            /// ```
1069            #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1070            #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1071            #[must_use = "this returns the result of the operation, \
1072                          without modifying the original"]
1073            #[inline]
1074            pub const fn checked_mul(self, other: Self) -> Option<Self> {
1075                if let Some(result) = self.get().checked_mul(other.get()) {
1076                    // SAFETY:
1077                    // - `checked_mul` returns `None` on overflow
1078                    // - `self` and `other` are non-zero
1079                    // - the only way to get zero from a multiplication without overflow is for one
1080                    //   of the sides to be zero
1081                    //
1082                    // So the result cannot be zero.
1083                    Some(unsafe { Self::new_unchecked(result) })
1084                } else {
1085                    None
1086                }
1087            }
1088
1089            /// Multiplies two non-zero integers together.
1090            #[doc = concat!("Return [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")]
1091            ///
1092            /// # Examples
1093            ///
1094            /// ```
1095            /// # use std::num::NonZero;
1096            /// #
1097            /// # fn main() { test().unwrap(); }
1098            /// # fn test() -> Option<()> {
1099            #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1100            #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1101            #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1102            ///
1103            /// assert_eq!(four, two.saturating_mul(two));
1104            /// assert_eq!(max, four.saturating_mul(max));
1105            /// # Some(())
1106            /// # }
1107            /// ```
1108            #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1109            #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1110            #[must_use = "this returns the result of the operation, \
1111                          without modifying the original"]
1112            #[inline]
1113            pub const fn saturating_mul(self, other: Self) -> Self {
1114                // SAFETY:
1115                // - `saturating_mul` returns `u*::MAX`/`i*::MAX`/`i*::MIN` on overflow/underflow,
1116                //   all of which are non-zero
1117                // - `self` and `other` are non-zero
1118                // - the only way to get zero from a multiplication without overflow is for one
1119                //   of the sides to be zero
1120                //
1121                // So the result cannot be zero.
1122                unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
1123            }
1124
1125            /// Multiplies two non-zero integers together,
1126            /// assuming overflow cannot occur.
1127            /// Overflow is unchecked, and it is undefined behavior to overflow
1128            /// *even if the result would wrap to a non-zero value*.
1129            ///
1130            /// # Safety
1131            ///
1132            /// This results in undefined behavior when
1133            #[doc = sign_dependent_expr!{
1134                $signedness ?
1135                if signed {
1136                    concat!("`self * rhs > ", stringify!($Int), "::MAX`, ",
1137                            "or `self * rhs < ", stringify!($Int), "::MIN`.")
1138                }
1139                if unsigned {
1140                    concat!("`self * rhs > ", stringify!($Int), "::MAX`.")
1141                }
1142            }]
1143            ///
1144            /// # Examples
1145            ///
1146            /// ```
1147            /// #![feature(nonzero_ops)]
1148            ///
1149            /// # use std::num::NonZero;
1150            /// #
1151            /// # fn main() { test().unwrap(); }
1152            /// # fn test() -> Option<()> {
1153            #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1154            #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1155            ///
1156            /// assert_eq!(four, unsafe { two.unchecked_mul(two) });
1157            /// # Some(())
1158            /// # }
1159            /// ```
1160            #[unstable(feature = "nonzero_ops", issue = "84186")]
1161            #[must_use = "this returns the result of the operation, \
1162                          without modifying the original"]
1163            #[inline]
1164            pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
1165                // SAFETY: The caller ensures there is no overflow.
1166                unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
1167            }
1168
1169            /// Raises non-zero value to an integer power.
1170            /// Checks for overflow and returns [`None`] on overflow.
1171            /// As a consequence, the result cannot wrap to zero.
1172            ///
1173            /// # Examples
1174            ///
1175            /// ```
1176            /// # use std::num::NonZero;
1177            /// #
1178            /// # fn main() { test().unwrap(); }
1179            /// # fn test() -> Option<()> {
1180            #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
1181            #[doc = concat!("let twenty_seven = NonZero::new(27", stringify!($Int), ")?;")]
1182            #[doc = concat!("let half_max = NonZero::new(", stringify!($Int), "::MAX / 2)?;")]
1183            ///
1184            /// assert_eq!(Some(twenty_seven), three.checked_pow(3));
1185            /// assert_eq!(None, half_max.checked_pow(3));
1186            /// # Some(())
1187            /// # }
1188            /// ```
1189            #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1190            #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1191            #[must_use = "this returns the result of the operation, \
1192                          without modifying the original"]
1193            #[inline]
1194            pub const fn checked_pow(self, other: u32) -> Option<Self> {
1195                if let Some(result) = self.get().checked_pow(other) {
1196                    // SAFETY:
1197                    // - `checked_pow` returns `None` on overflow/underflow
1198                    // - `self` is non-zero
1199                    // - the only way to get zero from an exponentiation without overflow is
1200                    //   for base to be zero
1201                    //
1202                    // So the result cannot be zero.
1203                    Some(unsafe { Self::new_unchecked(result) })
1204                } else {
1205                    None
1206                }
1207            }
1208
1209            /// Raise non-zero value to an integer power.
1210            #[doc = sign_dependent_expr!{
1211                $signedness ?
1212                if signed {
1213                    concat!("Return [`NonZero::<", stringify!($Int), ">::MIN`] ",
1214                                "or [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")
1215                }
1216                if unsigned {
1217                    concat!("Return [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")
1218                }
1219            }]
1220            ///
1221            /// # Examples
1222            ///
1223            /// ```
1224            /// # use std::num::NonZero;
1225            /// #
1226            /// # fn main() { test().unwrap(); }
1227            /// # fn test() -> Option<()> {
1228            #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
1229            #[doc = concat!("let twenty_seven = NonZero::new(27", stringify!($Int), ")?;")]
1230            #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1231            ///
1232            /// assert_eq!(twenty_seven, three.saturating_pow(3));
1233            /// assert_eq!(max, max.saturating_pow(3));
1234            /// # Some(())
1235            /// # }
1236            /// ```
1237            #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1238            #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1239            #[must_use = "this returns the result of the operation, \
1240                          without modifying the original"]
1241            #[inline]
1242            pub const fn saturating_pow(self, other: u32) -> Self {
1243                // SAFETY:
1244                // - `saturating_pow` returns `u*::MAX`/`i*::MAX`/`i*::MIN` on overflow/underflow,
1245                //   all of which are non-zero
1246                // - `self` is non-zero
1247                // - the only way to get zero from an exponentiation without overflow is
1248                //   for base to be zero
1249                //
1250                // So the result cannot be zero.
1251                unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
1252            }
1253
1254            /// Parses a non-zero integer from an ASCII-byte slice with decimal digits.
1255            ///
1256            /// The characters are expected to be an optional
1257            #[doc = sign_dependent_expr!{
1258                $signedness ?
1259                if signed {
1260                    " `+` or `-` "
1261                }
1262                if unsigned {
1263                    " `+` "
1264                }
1265            }]
1266            /// sign followed by only digits. Leading and trailing non-digit characters (including
1267            /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1268            /// also represent an error.
1269            ///
1270            /// # Examples
1271            ///
1272            /// ```
1273            /// #![feature(int_from_ascii)]
1274            ///
1275            /// # use std::num::NonZero;
1276            /// #
1277            /// # fn main() { test().unwrap(); }
1278            /// # fn test() -> Option<()> {
1279            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));")]
1280            /// # Some(())
1281            /// # }
1282            /// ```
1283            ///
1284            /// Trailing space returns error:
1285            ///
1286            /// ```
1287            /// #![feature(int_from_ascii)]
1288            ///
1289            /// # use std::num::NonZero;
1290            /// #
1291            #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_ascii_bytes(b\"1 \").is_err());")]
1292            /// ```
1293            #[unstable(feature = "int_from_ascii", issue = "134821")]
1294            #[rustc_const_unstable(feature = "const_convert", issue = "143773")]
1295            #[inline]
1296            pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
1297            where
1298                T: [const] AsRef<[u8]> + [const] crate::marker::Destruct
1299            {
1300                Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
1301            }
1302
1303            /// Parses a non-zero integer from an ASCII-byte slice with digits in a given base.
1304            ///
1305            /// The characters are expected to be an optional
1306            #[doc = sign_dependent_expr!{
1307                $signedness ?
1308                if signed {
1309                    " `+` or `-` "
1310                }
1311                if unsigned {
1312                    " `+` "
1313                }
1314            }]
1315            /// sign followed by only digits. Leading and trailing non-digit characters (including
1316            /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1317            /// also represent an error.
1318            ///
1319            /// Digits are a subset of these characters, depending on `radix`:
1320            ///
1321            /// - `0-9`
1322            /// - `a-z`
1323            /// - `A-Z`
1324            ///
1325            /// # Panics
1326            ///
1327            /// This method panics if `radix` is not in the range from 2 to 36.
1328            ///
1329            /// # Examples
1330            ///
1331            /// ```
1332            /// #![feature(int_from_ascii)]
1333            ///
1334            /// # use std::num::NonZero;
1335            /// #
1336            /// # fn main() { test().unwrap(); }
1337            /// # fn test() -> Option<()> {
1338            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));")]
1339            /// # Some(())
1340            /// # }
1341            /// ```
1342            ///
1343            /// Trailing space returns error:
1344            ///
1345            /// ```
1346            /// #![feature(int_from_ascii)]
1347            ///
1348            /// # use std::num::NonZero;
1349            /// #
1350            #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_ascii_bytes_radix(b\"1 \", 10).is_err());")]
1351            /// ```
1352            #[unstable(feature = "int_from_ascii", issue = "134821")]
1353            #[rustc_const_unstable(feature = "const_convert", issue = "143773")]
1354            #[inline]
1355            pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32) -> Result<Self, ParseIntError>
1356            where
1357                T: [const] AsRef<[u8]> + [const] crate::marker::Destruct
1358            {
1359                Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
1360            }
1361
1362            #[inline]
1363            const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32) -> Result<Self, ParseIntError> {
1364                let n = match <$Int>::from_ascii_bytes_radix_impl(src, radix) {
1365                    Ok(n) => n,
1366                    Err(err) => return Err(err),
1367                };
1368                if let Some(n) = Self::new(n) {
1369                    Ok(n)
1370                } else {
1371                    Err(ParseIntError { kind: IntErrorKind::Zero })
1372                }
1373            }
1374
1375            /// Parses a non-zero integer from a string slice with digits in a given base.
1376            ///
1377            /// The string is expected to be an optional
1378            #[doc = sign_dependent_expr!{
1379                $signedness ?
1380                if signed {
1381                    " `+` or `-` "
1382                }
1383                if unsigned {
1384                    " `+` "
1385                }
1386            }]
1387            /// sign followed by only digits. Leading and trailing non-digit characters (including
1388            /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1389            /// also represent an error.
1390            ///
1391            /// Digits are a subset of these characters, depending on `radix`:
1392            ///
1393            /// - `0-9`
1394            /// - `a-z`
1395            /// - `A-Z`
1396            ///
1397            /// # Panics
1398            ///
1399            /// This method panics if `radix` is not in the range from 2 to 36.
1400            ///
1401            /// # Examples
1402            ///
1403            /// ```
1404            /// # use std::num::NonZero;
1405            /// #
1406            /// # fn main() { test().unwrap(); }
1407            /// # fn test() -> Option<()> {
1408            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));")]
1409            /// # Some(())
1410            /// # }
1411            /// ```
1412            ///
1413            /// Trailing space returns error:
1414            ///
1415            /// ```
1416            /// # use std::num::NonZero;
1417            /// #
1418            #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_str_radix(\"1 \", 10).is_err());")]
1419            /// ```
1420            #[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
1421            #[rustc_const_stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
1422            #[inline]
1423            pub const fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
1424                Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
1425            }
1426        }
1427
1428        #[stable(feature = "nonzero_parse", since = "1.35.0")]
1429        #[rustc_const_unstable(feature = "const_convert", issue = "143773")]
1430        const impl FromStr for NonZero<$Int> {
1431            type Err = ParseIntError;
1432
1433            /// Parses a non-zero integer from a string slice with decimal digits.
1434            ///
1435            /// The characters are expected to be an optional
1436            #[doc = sign_dependent_expr!{
1437                $signedness ?
1438                if signed {
1439                    " `+` or `-` "
1440                }
1441                if unsigned {
1442                    " `+` "
1443                }
1444            }]
1445            /// sign followed by only digits. Leading and trailing non-digit characters (including
1446            /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1447            /// also represent an error.
1448            ///
1449            /// # Examples
1450            ///
1451            /// ```
1452            /// use std::num::NonZero;
1453            /// use std::str::FromStr;
1454            ///
1455            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));")]
1456            /// ```
1457            ///
1458            /// Trailing space returns error:
1459            ///
1460            /// ```
1461            /// use std::num::NonZero;
1462            /// use std::str::FromStr;
1463            ///
1464            #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_str(\"1 \").is_err());")]
1465            /// ```
1466            #[inline]
1467            fn from_str(src: &str) -> Result<Self, Self::Err> {
1468                Self::from_str_radix(src, 10)
1469            }
1470        }
1471
1472        nonzero_integer_signedness_dependent_impls!($signedness $Int);
1473    };
1474
1475    (
1476        Self = $Ty:ident,
1477        Primitive = unsigned $Int:ident,
1478        SignedPrimitive = $Sint:ident,
1479        rot = $rot:literal,
1480        rot_op = $rot_op:literal,
1481        rot_result = $rot_result:literal,
1482        swap_op = $swap_op:literal,
1483        swapped = $swapped:literal,
1484        reversed = $reversed:literal,
1485        $(,)?
1486    ) => {
1487        nonzero_integer! {
1488            #[stable(feature = "nonzero", since = "1.28.0")]
1489            Self = $Ty,
1490            Primitive = unsigned $Int,
1491            SignedPrimitive = $Sint,
1492            UnsignedPrimitive = $Int,
1493            rot = $rot,
1494            rot_op = $rot_op,
1495            rot_result = $rot_result,
1496            swap_op = $swap_op,
1497            swapped = $swapped,
1498            reversed = $reversed,
1499            leading_zeros_test = concat!(stringify!($Int), "::MAX"),
1500        }
1501    };
1502
1503    (
1504        Self = $Ty:ident,
1505        Primitive = signed $Int:ident,
1506        UnsignedPrimitive = $Uint:ident,
1507        rot = $rot:literal,
1508        rot_op = $rot_op:literal,
1509        rot_result = $rot_result:literal,
1510        swap_op = $swap_op:literal,
1511        swapped = $swapped:literal,
1512        reversed = $reversed:literal,
1513    ) => {
1514        nonzero_integer! {
1515            #[stable(feature = "signed_nonzero", since = "1.34.0")]
1516            Self = $Ty,
1517            Primitive = signed $Int,
1518            SignedPrimitive = $Int,
1519            UnsignedPrimitive = $Uint,
1520            rot = $rot,
1521            rot_op = $rot_op,
1522            rot_result = $rot_result,
1523            swap_op = $swap_op,
1524            swapped = $swapped,
1525            reversed = $reversed,
1526            leading_zeros_test = concat!("-1", stringify!($Int)),
1527        }
1528    };
1529}
1530
1531macro_rules! nonzero_integer_signedness_dependent_impls {
1532    // Impls for unsigned nonzero types only.
1533    (unsigned $Int:ty) => {
1534        #[stable(feature = "nonzero_div", since = "1.51.0")]
1535        #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1536        const impl Div<NonZero<$Int>> for $Int {
1537            type Output = $Int;
1538
1539            /// Same as `self / other.get()`, but because `other` is a `NonZero<_>`,
1540            /// there's never a runtime check for division-by-zero.
1541            ///
1542            /// This operation rounds towards zero, truncating any fractional
1543            /// part of the exact result, and cannot panic.
1544            #[doc(alias = "unchecked_div")]
1545            #[inline]
1546            #[ferrocene::prevalidated]
1547            fn div(self, other: NonZero<$Int>) -> $Int {
1548                // SAFETY: Division by zero is checked because `other` is non-zero,
1549                // and MIN/-1 is checked because `self` is an unsigned int.
1550                unsafe { intrinsics::unchecked_div(self, other.get()) }
1551            }
1552        }
1553
1554        #[stable(feature = "nonzero_div_assign", since = "1.79.0")]
1555        #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1556        const impl DivAssign<NonZero<$Int>> for $Int {
1557            /// Same as `self /= other.get()`, but because `other` is a `NonZero<_>`,
1558            /// there's never a runtime check for division-by-zero.
1559            ///
1560            /// This operation rounds towards zero, truncating any fractional
1561            /// part of the exact result, and cannot panic.
1562            #[inline]
1563            fn div_assign(&mut self, other: NonZero<$Int>) {
1564                *self = *self / other;
1565            }
1566        }
1567
1568        #[stable(feature = "nonzero_div", since = "1.51.0")]
1569        #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1570        const impl Rem<NonZero<$Int>> for $Int {
1571            type Output = $Int;
1572
1573            /// This operation satisfies `n % d == n - (n / d) * d`, and cannot panic.
1574            #[inline]
1575            fn rem(self, other: NonZero<$Int>) -> $Int {
1576                // SAFETY: Remainder by zero is checked because `other` is non-zero,
1577                // and MIN/-1 is checked because `self` is an unsigned int.
1578                unsafe { intrinsics::unchecked_rem(self, other.get()) }
1579            }
1580        }
1581
1582        #[stable(feature = "nonzero_div_assign", since = "1.79.0")]
1583        #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1584        const impl RemAssign<NonZero<$Int>> for $Int {
1585            /// This operation satisfies `n % d == n - (n / d) * d`, and cannot panic.
1586            #[inline]
1587            fn rem_assign(&mut self, other: NonZero<$Int>) {
1588                *self = *self % other;
1589            }
1590        }
1591    };
1592    // Impls for signed nonzero types only.
1593    (signed $Int:ty) => {
1594        #[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
1595        #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1596        const impl Neg for NonZero<$Int> {
1597            type Output = Self;
1598
1599            #[inline]
1600            #[ferrocene::prevalidated]
1601            fn neg(self) -> Self {
1602                // SAFETY: negation of nonzero cannot yield zero values.
1603                unsafe { Self::new_unchecked(self.get().neg()) }
1604            }
1605        }
1606
1607        forward_ref_unop! { impl Neg, neg for NonZero<$Int>,
1608        #[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
1609        #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
1610    };
1611}
1612
1613#[rustfmt::skip] // https://github.com/rust-lang/rustfmt/issues/5974
1614macro_rules! nonzero_integer_signedness_dependent_methods {
1615    // Associated items for unsigned nonzero types only.
1616    (
1617        Primitive = unsigned $Int:ident,
1618        SignedPrimitive = $Sint:ty,
1619        UnsignedPrimitive = $Uint:ty,
1620    ) => {
1621        /// The smallest value that can be represented by this non-zero
1622        /// integer type, 1.
1623        ///
1624        /// # Examples
1625        ///
1626        /// ```
1627        /// # use std::num::NonZero;
1628        /// #
1629        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MIN.get(), 1", stringify!($Int), ");")]
1630        /// ```
1631        #[stable(feature = "nonzero_min_max", since = "1.70.0")]
1632        pub const MIN: Self = Self::new(1).unwrap();
1633
1634        /// The largest value that can be represented by this non-zero
1635        /// integer type,
1636        #[doc = concat!("equal to [`", stringify!($Int), "::MAX`].")]
1637        ///
1638        /// # Examples
1639        ///
1640        /// ```
1641        /// # use std::num::NonZero;
1642        /// #
1643        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MAX.get(), ", stringify!($Int), "::MAX);")]
1644        /// ```
1645        #[stable(feature = "nonzero_min_max", since = "1.70.0")]
1646        pub const MAX: Self = Self::new(<$Int>::MAX).unwrap();
1647
1648        /// Adds an unsigned integer to a non-zero value.
1649        /// Checks for overflow and returns [`None`] on overflow.
1650        /// As a consequence, the result cannot wrap to zero.
1651        ///
1652        ///
1653        /// # Examples
1654        ///
1655        /// ```
1656        /// # use std::num::NonZero;
1657        /// #
1658        /// # fn main() { test().unwrap(); }
1659        /// # fn test() -> Option<()> {
1660        #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
1661        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1662        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1663        ///
1664        /// assert_eq!(Some(two), one.checked_add(1));
1665        /// assert_eq!(None, max.checked_add(1));
1666        /// # Some(())
1667        /// # }
1668        /// ```
1669        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1670        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1671        #[must_use = "this returns the result of the operation, \
1672                      without modifying the original"]
1673        #[inline]
1674        pub const fn checked_add(self, other: $Int) -> Option<Self> {
1675            if let Some(result) = self.get().checked_add(other) {
1676                // SAFETY:
1677                // - `checked_add` returns `None` on overflow
1678                // - `self` is non-zero
1679                // - the only way to get zero from an addition without overflow is for both
1680                //   sides to be zero
1681                //
1682                // So the result cannot be zero.
1683                Some(unsafe { Self::new_unchecked(result) })
1684            } else {
1685                None
1686            }
1687        }
1688
1689        /// Adds an unsigned integer to a non-zero value.
1690        #[doc = concat!("Return [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")]
1691        ///
1692        /// # Examples
1693        ///
1694        /// ```
1695        /// # use std::num::NonZero;
1696        /// #
1697        /// # fn main() { test().unwrap(); }
1698        /// # fn test() -> Option<()> {
1699        #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
1700        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1701        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1702        ///
1703        /// assert_eq!(two, one.saturating_add(1));
1704        /// assert_eq!(max, max.saturating_add(1));
1705        /// # Some(())
1706        /// # }
1707        /// ```
1708        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1709        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1710        #[must_use = "this returns the result of the operation, \
1711                      without modifying the original"]
1712        #[inline]
1713        pub const fn saturating_add(self, other: $Int) -> Self {
1714            // SAFETY:
1715            // - `saturating_add` returns `u*::MAX` on overflow, which is non-zero
1716            // - `self` is non-zero
1717            // - the only way to get zero from an addition without overflow is for both
1718            //   sides to be zero
1719            //
1720            // So the result cannot be zero.
1721            unsafe { Self::new_unchecked(self.get().saturating_add(other)) }
1722        }
1723
1724        /// Adds an unsigned integer to a non-zero value,
1725        /// assuming overflow cannot occur.
1726        /// Overflow is unchecked, and it is undefined behavior to overflow
1727        /// *even if the result would wrap to a non-zero value*.
1728        ///
1729        /// # Safety
1730        ///
1731        /// This results in undefined behavior when
1732        #[doc = concat!("`self + rhs > ", stringify!($Int), "::MAX`.")]
1733        ///
1734        /// # Examples
1735        ///
1736        /// ```
1737        /// #![feature(nonzero_ops)]
1738        ///
1739        /// # use std::num::NonZero;
1740        /// #
1741        /// # fn main() { test().unwrap(); }
1742        /// # fn test() -> Option<()> {
1743        #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
1744        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1745        ///
1746        /// assert_eq!(two, unsafe { one.unchecked_add(1) });
1747        /// # Some(())
1748        /// # }
1749        /// ```
1750        #[unstable(feature = "nonzero_ops", issue = "84186")]
1751        #[must_use = "this returns the result of the operation, \
1752                      without modifying the original"]
1753        #[inline]
1754        pub const unsafe fn unchecked_add(self, other: $Int) -> Self {
1755            // SAFETY: The caller ensures there is no overflow.
1756            unsafe { Self::new_unchecked(self.get().unchecked_add(other)) }
1757        }
1758
1759        /// Calculates the quotient of `self` and `rhs`, rounding the result towards positive infinity.
1760        ///
1761        /// The result is guaranteed to be non-zero.
1762        ///
1763        /// # Examples
1764        ///
1765        /// ```
1766        /// # use std::num::NonZero;
1767        #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ").unwrap();")]
1768        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX).unwrap();")]
1769        /// assert_eq!(one.div_ceil(max), one);
1770        ///
1771        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ").unwrap();")]
1772        #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ").unwrap();")]
1773        /// assert_eq!(three.div_ceil(two), two);
1774        /// ```
1775        #[stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
1776        #[rustc_const_stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
1777        #[must_use = "this returns the result of the operation, \
1778                      without modifying the original"]
1779        #[inline]
1780        pub const fn div_ceil(self, rhs: Self) -> Self {
1781            // An implementation of the function without calculating the remainder.
1782            // It is better than the implementation for normal integers, but it can only
1783            // be used here because of the possibility to subtract by one without overflow.
1784            let v = (self.get() - 1) / rhs.get() + 1;
1785            // SAFETY: ceiled division of two positive integers can never be zero.
1786            unsafe { Self::new_unchecked(v) }
1787        }
1788
1789        /// Returns the smallest power of two greater than or equal to `self`.
1790        /// Checks for overflow and returns [`None`]
1791        /// if the next power of two is greater than the type’s maximum value.
1792        /// As a consequence, the result cannot wrap to zero.
1793        ///
1794        /// # Examples
1795        ///
1796        /// ```
1797        /// # use std::num::NonZero;
1798        /// #
1799        /// # fn main() { test().unwrap(); }
1800        /// # fn test() -> Option<()> {
1801        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1802        #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
1803        #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1804        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1805        ///
1806        /// assert_eq!(Some(two), two.checked_next_power_of_two() );
1807        /// assert_eq!(Some(four), three.checked_next_power_of_two() );
1808        /// assert_eq!(None, max.checked_next_power_of_two() );
1809        /// # Some(())
1810        /// # }
1811        /// ```
1812        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1813        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1814        #[must_use = "this returns the result of the operation, \
1815                      without modifying the original"]
1816        #[inline]
1817        pub const fn checked_next_power_of_two(self) -> Option<Self> {
1818            if let Some(nz) = self.get().checked_next_power_of_two() {
1819                // SAFETY: The next power of two is positive
1820                // and overflow is checked.
1821                Some(unsafe { Self::new_unchecked(nz) })
1822            } else {
1823                None
1824            }
1825        }
1826
1827        /// Returns the base 2 logarithm of the number, rounded down.
1828        ///
1829        /// This is the same operation as
1830        #[doc = concat!("[`", stringify!($Int), "::ilog2`],")]
1831        /// except that it has no failure cases to worry about
1832        /// since this value can never be zero.
1833        ///
1834        /// Note that this is equivalent to [`highest_one`](Self::highest_one).
1835        ///
1836        /// # Examples
1837        ///
1838        /// ```
1839        /// # use std::num::NonZero;
1840        /// #
1841        /// # fn main() { test().unwrap(); }
1842        /// # fn test() -> Option<()> {
1843        #[doc = concat!("assert_eq!(NonZero::new(7", stringify!($Int), ")?.ilog2(), 2);")]
1844        #[doc = concat!("assert_eq!(NonZero::new(8", stringify!($Int), ")?.ilog2(), 3);")]
1845        #[doc = concat!("assert_eq!(NonZero::new(9", stringify!($Int), ")?.ilog2(), 3);")]
1846        /// # Some(())
1847        /// # }
1848        /// ```
1849        #[stable(feature = "int_log", since = "1.67.0")]
1850        #[rustc_const_stable(feature = "int_log", since = "1.67.0")]
1851        #[must_use = "this returns the result of the operation, \
1852                      without modifying the original"]
1853        #[inline]
1854        #[ferrocene::prevalidated]
1855        pub const fn ilog2(self) -> u32 {
1856            Self::BITS - 1 - self.leading_zeros()
1857        }
1858
1859        /// Returns the base 10 logarithm of the number, rounded down.
1860        ///
1861        /// This is the same operation as
1862        #[doc = concat!("[`", stringify!($Int), "::ilog10`],")]
1863        /// except that it has no failure cases to worry about
1864        /// since this value can never be zero.
1865        ///
1866        /// # Examples
1867        ///
1868        /// ```
1869        /// # use std::num::NonZero;
1870        /// #
1871        /// # fn main() { test().unwrap(); }
1872        /// # fn test() -> Option<()> {
1873        #[doc = concat!("assert_eq!(NonZero::new(99", stringify!($Int), ")?.ilog10(), 1);")]
1874        #[doc = concat!("assert_eq!(NonZero::new(100", stringify!($Int), ")?.ilog10(), 2);")]
1875        #[doc = concat!("assert_eq!(NonZero::new(101", stringify!($Int), ")?.ilog10(), 2);")]
1876        /// # Some(())
1877        /// # }
1878        /// ```
1879        #[stable(feature = "int_log", since = "1.67.0")]
1880        #[rustc_const_stable(feature = "int_log", since = "1.67.0")]
1881        #[must_use = "this returns the result of the operation, \
1882                      without modifying the original"]
1883        #[inline]
1884        #[ferrocene::prevalidated]
1885        pub const fn ilog10(self) -> u32 {
1886            imp::int_log10::$Int(self)
1887        }
1888
1889        /// Calculates the midpoint (average) between `self` and `rhs`.
1890        ///
1891        /// `midpoint(a, b)` is `(a + b) >> 1` as if it were performed in a
1892        /// sufficiently-large signed integral type. This implies that the result is
1893        /// always rounded towards negative infinity and that no overflow will ever occur.
1894        ///
1895        /// # Examples
1896        ///
1897        /// ```
1898        /// # use std::num::NonZero;
1899        /// #
1900        /// # fn main() { test().unwrap(); }
1901        /// # fn test() -> Option<()> {
1902        #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
1903        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1904        #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1905        ///
1906        /// assert_eq!(one.midpoint(four), two);
1907        /// assert_eq!(four.midpoint(one), two);
1908        /// # Some(())
1909        /// # }
1910        /// ```
1911        #[stable(feature = "num_midpoint", since = "1.85.0")]
1912        #[rustc_const_stable(feature = "num_midpoint", since = "1.85.0")]
1913        #[must_use = "this returns the result of the operation, \
1914                      without modifying the original"]
1915        #[doc(alias = "average_floor")]
1916        #[doc(alias = "average")]
1917        #[inline]
1918        pub const fn midpoint(self, rhs: Self) -> Self {
1919            // SAFETY: The only way to get `0` with midpoint is to have two opposite or
1920            // near opposite numbers: (-5, 5), (0, 1), (0, 0) which is impossible because
1921            // of the unsignedness of this number and also because `Self` is guaranteed to
1922            // never being 0.
1923            unsafe { Self::new_unchecked(self.get().midpoint(rhs.get())) }
1924        }
1925
1926        /// Returns `true` if and only if `self == (1 << k)` for some `k`.
1927        ///
1928        /// On many architectures, this function can perform better than `is_power_of_two()`
1929        /// on the underlying integer type, as special handling of zero can be avoided.
1930        ///
1931        /// # Examples
1932        ///
1933        /// ```
1934        /// # use std::num::NonZero;
1935        /// #
1936        /// # fn main() { test().unwrap(); }
1937        /// # fn test() -> Option<()> {
1938        #[doc = concat!("let eight = NonZero::new(8", stringify!($Int), ")?;")]
1939        /// assert!(eight.is_power_of_two());
1940        #[doc = concat!("let ten = NonZero::new(10", stringify!($Int), ")?;")]
1941        /// assert!(!ten.is_power_of_two());
1942        /// # Some(())
1943        /// # }
1944        /// ```
1945        #[must_use]
1946        #[stable(feature = "nonzero_is_power_of_two", since = "1.59.0")]
1947        #[rustc_const_stable(feature = "nonzero_is_power_of_two", since = "1.59.0")]
1948        #[inline]
1949        pub const fn is_power_of_two(self) -> bool {
1950            // LLVM 11 normalizes `unchecked_sub(x, 1) & x == 0` to the implementation seen here.
1951            // On the basic x86-64 target, this saves 3 instructions for the zero check.
1952            // On x86_64 with BMI1, being nonzero lets it codegen to `BLSR`, which saves an instruction
1953            // compared to the `POPCNT` implementation on the underlying integer type.
1954
1955            intrinsics::ctpop(self.get()) < 2
1956        }
1957
1958        /// Returns the square root of the number, rounded down.
1959        ///
1960        /// # Examples
1961        ///
1962        /// ```
1963        /// # use std::num::NonZero;
1964        /// #
1965        /// # fn main() { test().unwrap(); }
1966        /// # fn test() -> Option<()> {
1967        #[doc = concat!("let ten = NonZero::new(10", stringify!($Int), ")?;")]
1968        #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
1969        ///
1970        /// assert_eq!(ten.isqrt(), three);
1971        /// # Some(())
1972        /// # }
1973        /// ```
1974        #[stable(feature = "isqrt", since = "1.84.0")]
1975        #[rustc_const_stable(feature = "isqrt", since = "1.84.0")]
1976        #[must_use = "this returns the result of the operation, \
1977                      without modifying the original"]
1978        #[inline]
1979        pub const fn isqrt(self) -> Self {
1980            let result = self.get().isqrt();
1981
1982            // SAFETY: Integer square root is a monotonically nondecreasing
1983            // function, which means that increasing the input will never cause
1984            // the output to decrease. Thus, since the input for nonzero
1985            // unsigned integers has a lower bound of 1, the lower bound of the
1986            // results will be sqrt(1), which is 1, so a result can't be zero.
1987            unsafe { Self::new_unchecked(result) }
1988        }
1989
1990        /// Returns the bit pattern of `self` reinterpreted as a signed integer of the same size.
1991        ///
1992        /// # Examples
1993        ///
1994        /// ```
1995        /// # use std::num::NonZero;
1996        ///
1997        #[doc = concat!("let n = NonZero::<", stringify!($Int), ">::MAX;")]
1998        ///
1999        #[doc = concat!("assert_eq!(n.cast_signed(), NonZero::new(-1", stringify!($Sint), ").unwrap());")]
2000        /// ```
2001        #[stable(feature = "integer_sign_cast", since = "1.87.0")]
2002        #[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
2003        #[must_use = "this returns the result of the operation, \
2004                      without modifying the original"]
2005        #[inline(always)]
2006        pub const fn cast_signed(self) -> NonZero<$Sint> {
2007            // SAFETY: `self.get()` can't be zero
2008            unsafe { NonZero::new_unchecked(self.get().cast_signed()) }
2009        }
2010
2011        /// Returns the minimum number of bits required to represent `self`.
2012        ///
2013        /// # Examples
2014        ///
2015        /// ```
2016        /// # use core::num::NonZero;
2017        /// #
2018        /// # fn main() { test().unwrap(); }
2019        /// # fn test() -> Option<()> {
2020        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1)?.bit_width(), NonZero::new(1)?);")]
2021        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b111)?.bit_width(), NonZero::new(3)?);")]
2022        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1110)?.bit_width(), NonZero::new(4)?);")]
2023        /// # Some(())
2024        /// # }
2025        /// ```
2026        #[stable(feature = "uint_bit_width", since = "1.97.0")]
2027        #[rustc_const_stable(feature = "uint_bit_width", since = "1.97.0")]
2028        #[must_use = "this returns the result of the operation, \
2029                      without modifying the original"]
2030        #[inline(always)]
2031        pub const fn bit_width(self) -> NonZero<u32> {
2032            // SAFETY: Since `self.leading_zeros()` is always less than
2033            // `Self::BITS`, this subtraction can never be zero.
2034            unsafe { NonZero::new_unchecked(Self::BITS - self.leading_zeros()) }
2035        }
2036    };
2037
2038    // Associated items for signed nonzero types only.
2039    (
2040        Primitive = signed $Int:ident,
2041        SignedPrimitive = $Sint:ty,
2042        UnsignedPrimitive = $Uint:ty,
2043    ) => {
2044        /// The smallest value that can be represented by this non-zero
2045        /// integer type,
2046        #[doc = concat!("equal to [`", stringify!($Int), "::MIN`].")]
2047        ///
2048        /// Note: While most integer types are defined for every whole
2049        /// number between `MIN` and `MAX`, signed non-zero integers are
2050        /// a special case. They have a "gap" at 0.
2051        ///
2052        /// # Examples
2053        ///
2054        /// ```
2055        /// # use std::num::NonZero;
2056        /// #
2057        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MIN.get(), ", stringify!($Int), "::MIN);")]
2058        /// ```
2059        #[stable(feature = "nonzero_min_max", since = "1.70.0")]
2060        pub const MIN: Self = Self::new(<$Int>::MIN).unwrap();
2061
2062        /// The largest value that can be represented by this non-zero
2063        /// integer type,
2064        #[doc = concat!("equal to [`", stringify!($Int), "::MAX`].")]
2065        ///
2066        /// Note: While most integer types are defined for every whole
2067        /// number between `MIN` and `MAX`, signed non-zero integers are
2068        /// a special case. They have a "gap" at 0.
2069        ///
2070        /// # Examples
2071        ///
2072        /// ```
2073        /// # use std::num::NonZero;
2074        /// #
2075        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MAX.get(), ", stringify!($Int), "::MAX);")]
2076        /// ```
2077        #[stable(feature = "nonzero_min_max", since = "1.70.0")]
2078        pub const MAX: Self = Self::new(<$Int>::MAX).unwrap();
2079
2080        /// Computes the absolute value of self.
2081        #[doc = concat!("See [`", stringify!($Int), "::abs`]")]
2082        /// for documentation on overflow behavior.
2083        ///
2084        /// # Example
2085        ///
2086        /// ```
2087        /// # use std::num::NonZero;
2088        /// #
2089        /// # fn main() { test().unwrap(); }
2090        /// # fn test() -> Option<()> {
2091        #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2092        #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2093        ///
2094        /// assert_eq!(pos, pos.abs());
2095        /// assert_eq!(pos, neg.abs());
2096        /// # Some(())
2097        /// # }
2098        /// ```
2099        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2100        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2101        #[must_use = "this returns the result of the operation, \
2102                      without modifying the original"]
2103        #[inline]
2104        pub const fn abs(self) -> Self {
2105            // SAFETY: This cannot overflow to zero.
2106            unsafe { Self::new_unchecked(self.get().abs()) }
2107        }
2108
2109        /// Checked absolute value.
2110        /// Checks for overflow and returns [`None`] if
2111        #[doc = concat!("`self == NonZero::<", stringify!($Int), ">::MIN`.")]
2112        /// The result cannot be zero.
2113        ///
2114        /// # Example
2115        ///
2116        /// ```
2117        /// # use std::num::NonZero;
2118        /// #
2119        /// # fn main() { test().unwrap(); }
2120        /// # fn test() -> Option<()> {
2121        #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2122        #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2123        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2124        ///
2125        /// assert_eq!(Some(pos), neg.checked_abs());
2126        /// assert_eq!(None, min.checked_abs());
2127        /// # Some(())
2128        /// # }
2129        /// ```
2130        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2131        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2132        #[must_use = "this returns the result of the operation, \
2133                      without modifying the original"]
2134        #[inline]
2135        pub const fn checked_abs(self) -> Option<Self> {
2136            if let Some(nz) = self.get().checked_abs() {
2137                // SAFETY: absolute value of nonzero cannot yield zero values.
2138                Some(unsafe { Self::new_unchecked(nz) })
2139            } else {
2140                None
2141            }
2142        }
2143
2144        /// Computes the absolute value of self,
2145        /// with overflow information, see
2146        #[doc = concat!("[`", stringify!($Int), "::overflowing_abs`].")]
2147        ///
2148        /// # Example
2149        ///
2150        /// ```
2151        /// # use std::num::NonZero;
2152        /// #
2153        /// # fn main() { test().unwrap(); }
2154        /// # fn test() -> Option<()> {
2155        #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2156        #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2157        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2158        ///
2159        /// assert_eq!((pos, false), pos.overflowing_abs());
2160        /// assert_eq!((pos, false), neg.overflowing_abs());
2161        /// assert_eq!((min, true), min.overflowing_abs());
2162        /// # Some(())
2163        /// # }
2164        /// ```
2165        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2166        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2167        #[must_use = "this returns the result of the operation, \
2168                      without modifying the original"]
2169        #[inline]
2170        pub const fn overflowing_abs(self) -> (Self, bool) {
2171            let (nz, flag) = self.get().overflowing_abs();
2172            (
2173                // SAFETY: absolute value of nonzero cannot yield zero values.
2174                unsafe { Self::new_unchecked(nz) },
2175                flag,
2176            )
2177        }
2178
2179        /// Saturating absolute value, see
2180        #[doc = concat!("[`", stringify!($Int), "::saturating_abs`].")]
2181        ///
2182        /// # Example
2183        ///
2184        /// ```
2185        /// # use std::num::NonZero;
2186        /// #
2187        /// # fn main() { test().unwrap(); }
2188        /// # fn test() -> Option<()> {
2189        #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2190        #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2191        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2192        #[doc = concat!("let min_plus = NonZero::new(", stringify!($Int), "::MIN + 1)?;")]
2193        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
2194        ///
2195        /// assert_eq!(pos, pos.saturating_abs());
2196        /// assert_eq!(pos, neg.saturating_abs());
2197        /// assert_eq!(max, min.saturating_abs());
2198        /// assert_eq!(max, min_plus.saturating_abs());
2199        /// # Some(())
2200        /// # }
2201        /// ```
2202        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2203        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2204        #[must_use = "this returns the result of the operation, \
2205                      without modifying the original"]
2206        #[inline]
2207        pub const fn saturating_abs(self) -> Self {
2208            // SAFETY: absolute value of nonzero cannot yield zero values.
2209            unsafe { Self::new_unchecked(self.get().saturating_abs()) }
2210        }
2211
2212        /// Wrapping absolute value, see
2213        #[doc = concat!("[`", stringify!($Int), "::wrapping_abs`].")]
2214        ///
2215        /// # Example
2216        ///
2217        /// ```
2218        /// # use std::num::NonZero;
2219        /// #
2220        /// # fn main() { test().unwrap(); }
2221        /// # fn test() -> Option<()> {
2222        #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2223        #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2224        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2225        #[doc = concat!("# let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
2226        ///
2227        /// assert_eq!(pos, pos.wrapping_abs());
2228        /// assert_eq!(pos, neg.wrapping_abs());
2229        /// assert_eq!(min, min.wrapping_abs());
2230        /// assert_eq!(max, (-max).wrapping_abs());
2231        /// # Some(())
2232        /// # }
2233        /// ```
2234        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2235        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2236        #[must_use = "this returns the result of the operation, \
2237                      without modifying the original"]
2238        #[inline]
2239        pub const fn wrapping_abs(self) -> Self {
2240            // SAFETY: absolute value of nonzero cannot yield zero values.
2241            unsafe { Self::new_unchecked(self.get().wrapping_abs()) }
2242        }
2243
2244        /// Computes the absolute value of self
2245        /// without any wrapping or panicking.
2246        ///
2247        /// # Example
2248        ///
2249        /// ```
2250        /// # use std::num::NonZero;
2251        /// #
2252        /// # fn main() { test().unwrap(); }
2253        /// # fn test() -> Option<()> {
2254        #[doc = concat!("let u_pos = NonZero::new(1", stringify!($Uint), ")?;")]
2255        #[doc = concat!("let i_pos = NonZero::new(1", stringify!($Int), ")?;")]
2256        #[doc = concat!("let i_neg = NonZero::new(-1", stringify!($Int), ")?;")]
2257        #[doc = concat!("let i_min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2258        #[doc = concat!("let u_max = NonZero::new(", stringify!($Uint), "::MAX / 2 + 1)?;")]
2259        ///
2260        /// assert_eq!(u_pos, i_pos.unsigned_abs());
2261        /// assert_eq!(u_pos, i_neg.unsigned_abs());
2262        /// assert_eq!(u_max, i_min.unsigned_abs());
2263        /// # Some(())
2264        /// # }
2265        /// ```
2266        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2267        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2268        #[must_use = "this returns the result of the operation, \
2269                      without modifying the original"]
2270        #[inline]
2271        pub const fn unsigned_abs(self) -> NonZero<$Uint> {
2272            // SAFETY: absolute value of nonzero cannot yield zero values.
2273            unsafe { NonZero::new_unchecked(self.get().unsigned_abs()) }
2274        }
2275
2276        /// Returns `true` if `self` is positive and `false` if the
2277        /// number is negative.
2278        ///
2279        /// # Example
2280        ///
2281        /// ```
2282        /// # use std::num::NonZero;
2283        /// #
2284        /// # fn main() { test().unwrap(); }
2285        /// # fn test() -> Option<()> {
2286        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2287        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2288        ///
2289        /// assert!(pos_five.is_positive());
2290        /// assert!(!neg_five.is_positive());
2291        /// # Some(())
2292        /// # }
2293        /// ```
2294        #[must_use]
2295        #[inline]
2296        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2297        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2298        pub const fn is_positive(self) -> bool {
2299            self.get().is_positive()
2300        }
2301
2302        /// Returns `true` if `self` is negative and `false` if the
2303        /// number is positive.
2304        ///
2305        /// # Example
2306        ///
2307        /// ```
2308        /// # use std::num::NonZero;
2309        /// #
2310        /// # fn main() { test().unwrap(); }
2311        /// # fn test() -> Option<()> {
2312        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2313        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2314        ///
2315        /// assert!(neg_five.is_negative());
2316        /// assert!(!pos_five.is_negative());
2317        /// # Some(())
2318        /// # }
2319        /// ```
2320        #[must_use]
2321        #[inline]
2322        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2323        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2324        pub const fn is_negative(self) -> bool {
2325            self.get().is_negative()
2326        }
2327
2328        /// Checked negation. Computes `-self`,
2329        #[doc = concat!("returning `None` if `self == NonZero::<", stringify!($Int), ">::MIN`.")]
2330        ///
2331        /// # Example
2332        ///
2333        /// ```
2334        /// # use std::num::NonZero;
2335        /// #
2336        /// # fn main() { test().unwrap(); }
2337        /// # fn test() -> Option<()> {
2338        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2339        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2340        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2341        ///
2342        /// assert_eq!(pos_five.checked_neg(), Some(neg_five));
2343        /// assert_eq!(min.checked_neg(), None);
2344        /// # Some(())
2345        /// # }
2346        /// ```
2347        #[inline]
2348        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2349        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2350        pub const fn checked_neg(self) -> Option<Self> {
2351            if let Some(result) = self.get().checked_neg() {
2352                // SAFETY: negation of nonzero cannot yield zero values.
2353                return Some(unsafe { Self::new_unchecked(result) });
2354            }
2355            None
2356        }
2357
2358        /// Negates self, overflowing if this is equal to the minimum value.
2359        ///
2360        #[doc = concat!("See [`", stringify!($Int), "::overflowing_neg`]")]
2361        /// for documentation on overflow behavior.
2362        ///
2363        /// # Example
2364        ///
2365        /// ```
2366        /// # use std::num::NonZero;
2367        /// #
2368        /// # fn main() { test().unwrap(); }
2369        /// # fn test() -> Option<()> {
2370        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2371        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2372        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2373        ///
2374        /// assert_eq!(pos_five.overflowing_neg(), (neg_five, false));
2375        /// assert_eq!(min.overflowing_neg(), (min, true));
2376        /// # Some(())
2377        /// # }
2378        /// ```
2379        #[inline]
2380        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2381        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2382        pub const fn overflowing_neg(self) -> (Self, bool) {
2383            let (result, overflow) = self.get().overflowing_neg();
2384            // SAFETY: negation of nonzero cannot yield zero values.
2385            ((unsafe { Self::new_unchecked(result) }), overflow)
2386        }
2387
2388        /// Saturating negation. Computes `-self`,
2389        #[doc = concat!("returning [`NonZero::<", stringify!($Int), ">::MAX`]")]
2390        #[doc = concat!("if `self == NonZero::<", stringify!($Int), ">::MIN`")]
2391        /// instead of overflowing.
2392        ///
2393        /// # Example
2394        ///
2395        /// ```
2396        /// # use std::num::NonZero;
2397        /// #
2398        /// # fn main() { test().unwrap(); }
2399        /// # fn test() -> Option<()> {
2400        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2401        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2402        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2403        #[doc = concat!("let min_plus_one = NonZero::new(", stringify!($Int), "::MIN + 1)?;")]
2404        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
2405        ///
2406        /// assert_eq!(pos_five.saturating_neg(), neg_five);
2407        /// assert_eq!(min.saturating_neg(), max);
2408        /// assert_eq!(max.saturating_neg(), min_plus_one);
2409        /// # Some(())
2410        /// # }
2411        /// ```
2412        #[inline]
2413        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2414        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2415        pub const fn saturating_neg(self) -> Self {
2416            if let Some(result) = self.checked_neg() {
2417                return result;
2418            }
2419            Self::MAX
2420        }
2421
2422        /// Wrapping (modular) negation. Computes `-self`, wrapping around at the boundary
2423        /// of the type.
2424        ///
2425        #[doc = concat!("See [`", stringify!($Int), "::wrapping_neg`]")]
2426        /// for documentation on overflow behavior.
2427        ///
2428        /// # Example
2429        ///
2430        /// ```
2431        /// # use std::num::NonZero;
2432        /// #
2433        /// # fn main() { test().unwrap(); }
2434        /// # fn test() -> Option<()> {
2435        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2436        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2437        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2438        ///
2439        /// assert_eq!(pos_five.wrapping_neg(), neg_five);
2440        /// assert_eq!(min.wrapping_neg(), min);
2441        /// # Some(())
2442        /// # }
2443        /// ```
2444        #[inline]
2445        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2446        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2447        pub const fn wrapping_neg(self) -> Self {
2448            let result = self.get().wrapping_neg();
2449            // SAFETY: negation of nonzero cannot yield zero values.
2450            unsafe { Self::new_unchecked(result) }
2451        }
2452
2453        /// Returns the bit pattern of `self` reinterpreted as an unsigned integer of the same size.
2454        ///
2455        /// # Examples
2456        ///
2457        /// ```
2458        /// # use std::num::NonZero;
2459        ///
2460        #[doc = concat!("let n = NonZero::new(-1", stringify!($Int), ").unwrap();")]
2461        ///
2462        #[doc = concat!("assert_eq!(n.cast_unsigned(), NonZero::<", stringify!($Uint), ">::MAX);")]
2463        /// ```
2464        #[stable(feature = "integer_sign_cast", since = "1.87.0")]
2465        #[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
2466        #[must_use = "this returns the result of the operation, \
2467                      without modifying the original"]
2468        #[inline(always)]
2469        pub const fn cast_unsigned(self) -> NonZero<$Uint> {
2470            // SAFETY: `self.get()` can't be zero
2471            unsafe { NonZero::new_unchecked(self.get().cast_unsigned()) }
2472        }
2473
2474    };
2475}
2476
2477nonzero_integer! {
2478    Self = NonZeroU8,
2479    Primitive = unsigned u8,
2480    SignedPrimitive = i8,
2481    rot = 2,
2482    rot_op = "0x82",
2483    rot_result = "0xa",
2484    swap_op = "0x12",
2485    swapped = "0x12",
2486    reversed = "0x48",
2487}
2488
2489nonzero_integer! {
2490    Self = NonZeroU16,
2491    Primitive = unsigned u16,
2492    SignedPrimitive = i16,
2493    rot = 4,
2494    rot_op = "0xa003",
2495    rot_result = "0x3a",
2496    swap_op = "0x1234",
2497    swapped = "0x3412",
2498    reversed = "0x2c48",
2499}
2500
2501nonzero_integer! {
2502    Self = NonZeroU32,
2503    Primitive = unsigned u32,
2504    SignedPrimitive = i32,
2505    rot = 8,
2506    rot_op = "0x10000b3",
2507    rot_result = "0xb301",
2508    swap_op = "0x12345678",
2509    swapped = "0x78563412",
2510    reversed = "0x1e6a2c48",
2511}
2512
2513nonzero_integer! {
2514    Self = NonZeroU64,
2515    Primitive = unsigned u64,
2516    SignedPrimitive = i64,
2517    rot = 12,
2518    rot_op = "0xaa00000000006e1",
2519    rot_result = "0x6e10aa",
2520    swap_op = "0x1234567890123456",
2521    swapped = "0x5634129078563412",
2522    reversed = "0x6a2c48091e6a2c48",
2523}
2524
2525nonzero_integer! {
2526    Self = NonZeroU128,
2527    Primitive = unsigned u128,
2528    SignedPrimitive = i128,
2529    rot = 16,
2530    rot_op = "0x13f40000000000000000000000004f76",
2531    rot_result = "0x4f7613f4",
2532    swap_op = "0x12345678901234567890123456789012",
2533    swapped = "0x12907856341290785634129078563412",
2534    reversed = "0x48091e6a2c48091e6a2c48091e6a2c48",
2535}
2536
2537#[cfg(target_pointer_width = "16")]
2538nonzero_integer! {
2539    Self = NonZeroUsize,
2540    Primitive = unsigned usize,
2541    SignedPrimitive = isize,
2542    rot = 4,
2543    rot_op = "0xa003",
2544    rot_result = "0x3a",
2545    swap_op = "0x1234",
2546    swapped = "0x3412",
2547    reversed = "0x2c48",
2548}
2549
2550#[cfg(target_pointer_width = "32")]
2551nonzero_integer! {
2552    Self = NonZeroUsize,
2553    Primitive = unsigned usize,
2554    SignedPrimitive = isize,
2555    rot = 8,
2556    rot_op = "0x10000b3",
2557    rot_result = "0xb301",
2558    swap_op = "0x12345678",
2559    swapped = "0x78563412",
2560    reversed = "0x1e6a2c48",
2561}
2562
2563#[cfg(target_pointer_width = "64")]
2564nonzero_integer! {
2565    Self = NonZeroUsize,
2566    Primitive = unsigned usize,
2567    SignedPrimitive = isize,
2568    rot = 12,
2569    rot_op = "0xaa00000000006e1",
2570    rot_result = "0x6e10aa",
2571    swap_op = "0x1234567890123456",
2572    swapped = "0x5634129078563412",
2573    reversed = "0x6a2c48091e6a2c48",
2574}
2575
2576nonzero_integer! {
2577    Self = NonZeroI8,
2578    Primitive = signed i8,
2579    UnsignedPrimitive = u8,
2580    rot = 2,
2581    rot_op = "-0x7e",
2582    rot_result = "0xa",
2583    swap_op = "0x12",
2584    swapped = "0x12",
2585    reversed = "0x48",
2586}
2587
2588nonzero_integer! {
2589    Self = NonZeroI16,
2590    Primitive = signed i16,
2591    UnsignedPrimitive = u16,
2592    rot = 4,
2593    rot_op = "-0x5ffd",
2594    rot_result = "0x3a",
2595    swap_op = "0x1234",
2596    swapped = "0x3412",
2597    reversed = "0x2c48",
2598}
2599
2600nonzero_integer! {
2601    Self = NonZeroI32,
2602    Primitive = signed i32,
2603    UnsignedPrimitive = u32,
2604    rot = 8,
2605    rot_op = "0x10000b3",
2606    rot_result = "0xb301",
2607    swap_op = "0x12345678",
2608    swapped = "0x78563412",
2609    reversed = "0x1e6a2c48",
2610}
2611
2612nonzero_integer! {
2613    Self = NonZeroI64,
2614    Primitive = signed i64,
2615    UnsignedPrimitive = u64,
2616    rot = 12,
2617    rot_op = "0xaa00000000006e1",
2618    rot_result = "0x6e10aa",
2619    swap_op = "0x1234567890123456",
2620    swapped = "0x5634129078563412",
2621    reversed = "0x6a2c48091e6a2c48",
2622}
2623
2624nonzero_integer! {
2625    Self = NonZeroI128,
2626    Primitive = signed i128,
2627    UnsignedPrimitive = u128,
2628    rot = 16,
2629    rot_op = "0x13f40000000000000000000000004f76",
2630    rot_result = "0x4f7613f4",
2631    swap_op = "0x12345678901234567890123456789012",
2632    swapped = "0x12907856341290785634129078563412",
2633    reversed = "0x48091e6a2c48091e6a2c48091e6a2c48",
2634}
2635
2636#[cfg(target_pointer_width = "16")]
2637nonzero_integer! {
2638    Self = NonZeroIsize,
2639    Primitive = signed isize,
2640    UnsignedPrimitive = usize,
2641    rot = 4,
2642    rot_op = "-0x5ffd",
2643    rot_result = "0x3a",
2644    swap_op = "0x1234",
2645    swapped = "0x3412",
2646    reversed = "0x2c48",
2647}
2648
2649#[cfg(target_pointer_width = "32")]
2650nonzero_integer! {
2651    Self = NonZeroIsize,
2652    Primitive = signed isize,
2653    UnsignedPrimitive = usize,
2654    rot = 8,
2655    rot_op = "0x10000b3",
2656    rot_result = "0xb301",
2657    swap_op = "0x12345678",
2658    swapped = "0x78563412",
2659    reversed = "0x1e6a2c48",
2660}
2661
2662#[cfg(target_pointer_width = "64")]
2663nonzero_integer! {
2664    Self = NonZeroIsize,
2665    Primitive = signed isize,
2666    UnsignedPrimitive = usize,
2667    rot = 12,
2668    rot_op = "0xaa00000000006e1",
2669    rot_result = "0x6e10aa",
2670    swap_op = "0x1234567890123456",
2671    swapped = "0x5634129078563412",
2672    reversed = "0x6a2c48091e6a2c48",
2673}