Skip to main content

core/num/
nonzero.rs

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