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