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.
1235            #[doc = concat!("Return [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")]
1236            ///
1237            /// # Examples
1238            ///
1239            /// ```
1240            /// # use std::num::NonZero;
1241            /// #
1242            /// # fn main() { test().unwrap(); }
1243            /// # fn test() -> Option<()> {
1244            #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1245            #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1246            #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1247            ///
1248            /// assert_eq!(four, two.saturating_mul(two));
1249            /// assert_eq!(max, four.saturating_mul(max));
1250            /// # Some(())
1251            /// # }
1252            /// ```
1253            #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1254            #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1255            #[must_use = "this returns the result of the operation, \
1256                          without modifying the original"]
1257            #[inline]
1258            pub const fn saturating_mul(self, other: Self) -> Self {
1259                // SAFETY:
1260                // - `saturating_mul` returns `u*::MAX`/`i*::MAX`/`i*::MIN` on overflow/underflow,
1261                //   all of which are non-zero
1262                // - `self` and `other` are non-zero
1263                // - the only way to get zero from a multiplication without overflow is for one
1264                //   of the sides to be zero
1265                //
1266                // So the result cannot be zero.
1267                unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
1268            }
1269
1270            /// Multiplies two non-zero integers together,
1271            /// assuming overflow cannot occur.
1272            /// Overflow is unchecked, and it is undefined behavior to overflow
1273            /// *even if the result would wrap to a non-zero value*.
1274            ///
1275            /// # Safety
1276            ///
1277            /// This results in undefined behavior when
1278            #[doc = sign_dependent_expr!{
1279                $signedness ?
1280                if signed {
1281                    concat!("`self * rhs > ", stringify!($Int), "::MAX`, ",
1282                            "or `self * rhs < ", stringify!($Int), "::MIN`.")
1283                }
1284                if unsigned {
1285                    concat!("`self * rhs > ", stringify!($Int), "::MAX`.")
1286                }
1287            }]
1288            ///
1289            /// # Examples
1290            ///
1291            /// ```
1292            /// #![feature(nonzero_ops)]
1293            ///
1294            /// # use std::num::NonZero;
1295            /// #
1296            /// # fn main() { test().unwrap(); }
1297            /// # fn test() -> Option<()> {
1298            #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1299            #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1300            ///
1301            /// assert_eq!(four, unsafe { two.unchecked_mul(two) });
1302            /// # Some(())
1303            /// # }
1304            /// ```
1305            #[unstable(feature = "nonzero_ops", issue = "84186")]
1306            #[must_use = "this returns the result of the operation, \
1307                          without modifying the original"]
1308            #[inline]
1309            pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
1310                // SAFETY: The caller ensures there is no overflow.
1311                unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
1312            }
1313
1314            /// Raises non-zero value to an integer power.
1315            /// Checks for overflow and returns [`None`] on overflow.
1316            /// As a consequence, the result cannot wrap to zero.
1317            ///
1318            /// # Examples
1319            ///
1320            /// ```
1321            /// # use std::num::NonZero;
1322            /// #
1323            /// # fn main() { test().unwrap(); }
1324            /// # fn test() -> Option<()> {
1325            #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
1326            #[doc = concat!("let twenty_seven = NonZero::new(27", stringify!($Int), ")?;")]
1327            #[doc = concat!("let half_max = NonZero::new(", stringify!($Int), "::MAX / 2)?;")]
1328            ///
1329            /// assert_eq!(Some(twenty_seven), three.checked_pow(3));
1330            /// assert_eq!(None, half_max.checked_pow(3));
1331            /// # Some(())
1332            /// # }
1333            /// ```
1334            #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1335            #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1336            #[must_use = "this returns the result of the operation, \
1337                          without modifying the original"]
1338            #[inline]
1339            pub const fn checked_pow(self, other: u32) -> Option<Self> {
1340                if let Some(result) = self.get().checked_pow(other) {
1341                    // SAFETY:
1342                    // - `checked_pow` returns `None` on overflow/underflow
1343                    // - `self` is non-zero
1344                    // - the only way to get zero from an exponentiation without overflow is
1345                    //   for base to be zero
1346                    //
1347                    // So the result cannot be zero.
1348                    Some(unsafe { Self::new_unchecked(result) })
1349                } else {
1350                    None
1351                }
1352            }
1353
1354            /// Raise non-zero value to an integer power.
1355            #[doc = sign_dependent_expr!{
1356                $signedness ?
1357                if signed {
1358                    concat!("Return [`NonZero::<", stringify!($Int), ">::MIN`] ",
1359                                "or [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")
1360                }
1361                if unsigned {
1362                    concat!("Return [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")
1363                }
1364            }]
1365            ///
1366            /// # Examples
1367            ///
1368            /// ```
1369            /// # use std::num::NonZero;
1370            /// #
1371            /// # fn main() { test().unwrap(); }
1372            /// # fn test() -> Option<()> {
1373            #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
1374            #[doc = concat!("let twenty_seven = NonZero::new(27", stringify!($Int), ")?;")]
1375            #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1376            ///
1377            /// assert_eq!(twenty_seven, three.saturating_pow(3));
1378            /// assert_eq!(max, max.saturating_pow(3));
1379            /// # Some(())
1380            /// # }
1381            /// ```
1382            #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1383            #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1384            #[must_use = "this returns the result of the operation, \
1385                          without modifying the original"]
1386            #[inline]
1387            pub const fn saturating_pow(self, other: u32) -> Self {
1388                // SAFETY:
1389                // - `saturating_pow` returns `u*::MAX`/`i*::MAX`/`i*::MIN` on overflow/underflow,
1390                //   all of which are non-zero
1391                // - `self` is non-zero
1392                // - the only way to get zero from an exponentiation without overflow is
1393                //   for base to be zero
1394                //
1395                // So the result cannot be zero.
1396                unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
1397            }
1398
1399            /// Parses a non-zero integer from an ASCII-byte slice with decimal digits.
1400            ///
1401            /// The characters are expected to be an optional
1402            #[doc = sign_dependent_expr!{
1403                $signedness ?
1404                if signed {
1405                    " `+` or `-` "
1406                }
1407                if unsigned {
1408                    " `+` "
1409                }
1410            }]
1411            /// sign followed by only digits. Leading and trailing non-digit characters (including
1412            /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1413            /// also represent an error.
1414            ///
1415            /// # Examples
1416            ///
1417            /// ```
1418            /// #![feature(int_from_ascii)]
1419            ///
1420            /// # use std::num::NonZero;
1421            /// #
1422            /// # fn main() { test().unwrap(); }
1423            /// # fn test() -> Option<()> {
1424            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));")]
1425            /// # Some(())
1426            /// # }
1427            /// ```
1428            ///
1429            /// Trailing space returns error:
1430            ///
1431            /// ```
1432            /// #![feature(int_from_ascii)]
1433            ///
1434            /// # use std::num::NonZero;
1435            /// #
1436            #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_ascii_bytes(b\"1 \").is_err());")]
1437            /// ```
1438            #[unstable(feature = "int_from_ascii", issue = "134821")]
1439            #[rustc_const_unstable(feature = "const_convert", issue = "143773")]
1440            #[inline]
1441            pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
1442            where
1443                T: [const] AsRef<[u8]> + [const] crate::marker::Destruct
1444            {
1445                Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
1446            }
1447
1448            /// Parses a non-zero integer from an ASCII-byte slice with digits in a given base.
1449            ///
1450            /// The characters are expected to be an optional
1451            #[doc = sign_dependent_expr!{
1452                $signedness ?
1453                if signed {
1454                    " `+` or `-` "
1455                }
1456                if unsigned {
1457                    " `+` "
1458                }
1459            }]
1460            /// sign followed by only digits. Leading and trailing non-digit characters (including
1461            /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1462            /// also represent an error.
1463            ///
1464            /// Digits are a subset of these characters, depending on `radix`:
1465            ///
1466            /// - `0-9`
1467            /// - `a-z`
1468            /// - `A-Z`
1469            ///
1470            /// # Panics
1471            ///
1472            /// This method panics if `radix` is not in the range from 2 to 36.
1473            ///
1474            /// # Examples
1475            ///
1476            /// ```
1477            /// #![feature(int_from_ascii)]
1478            ///
1479            /// # use std::num::NonZero;
1480            /// #
1481            /// # fn main() { test().unwrap(); }
1482            /// # fn test() -> Option<()> {
1483            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));")]
1484            /// # Some(())
1485            /// # }
1486            /// ```
1487            ///
1488            /// Trailing space returns error:
1489            ///
1490            /// ```
1491            /// #![feature(int_from_ascii)]
1492            ///
1493            /// # use std::num::NonZero;
1494            /// #
1495            #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_ascii_bytes_radix(b\"1 \", 10).is_err());")]
1496            /// ```
1497            #[unstable(feature = "int_from_ascii", issue = "134821")]
1498            #[rustc_const_unstable(feature = "const_convert", issue = "143773")]
1499            #[inline]
1500            pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32) -> Result<Self, ParseIntError>
1501            where
1502                T: [const] AsRef<[u8]> + [const] crate::marker::Destruct
1503            {
1504                Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
1505            }
1506
1507            #[inline]
1508            const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32) -> Result<Self, ParseIntError> {
1509                let n = match <$Int>::from_ascii_bytes_radix_impl(src, radix) {
1510                    Ok(n) => n,
1511                    Err(err) => return Err(err),
1512                };
1513                if let Some(n) = Self::new(n) {
1514                    Ok(n)
1515                } else {
1516                    Err(ParseIntError { kind: IntErrorKind::Zero })
1517                }
1518            }
1519
1520            /// Parses a non-zero integer from a string slice with digits in a given base.
1521            ///
1522            /// The string is expected to be an optional
1523            #[doc = sign_dependent_expr!{
1524                $signedness ?
1525                if signed {
1526                    " `+` or `-` "
1527                }
1528                if unsigned {
1529                    " `+` "
1530                }
1531            }]
1532            /// sign followed by only digits. Leading and trailing non-digit characters (including
1533            /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1534            /// also represent an error.
1535            ///
1536            /// Digits are a subset of these characters, depending on `radix`:
1537            ///
1538            /// - `0-9`
1539            /// - `a-z`
1540            /// - `A-Z`
1541            ///
1542            /// # Panics
1543            ///
1544            /// This method panics if `radix` is not in the range from 2 to 36.
1545            ///
1546            /// # Examples
1547            ///
1548            /// ```
1549            /// # use std::num::NonZero;
1550            /// #
1551            /// # fn main() { test().unwrap(); }
1552            /// # fn test() -> Option<()> {
1553            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));")]
1554            /// # Some(())
1555            /// # }
1556            /// ```
1557            ///
1558            /// Trailing space returns error:
1559            ///
1560            /// ```
1561            /// # use std::num::NonZero;
1562            /// #
1563            #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_str_radix(\"1 \", 10).is_err());")]
1564            /// ```
1565            #[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
1566            #[rustc_const_stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
1567            #[inline]
1568            pub const fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
1569                Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
1570            }
1571        }
1572
1573        #[stable(feature = "nonzero_parse", since = "1.35.0")]
1574        #[rustc_const_unstable(feature = "const_convert", issue = "143773")]
1575        const impl FromStr for NonZero<$Int> {
1576            type Err = ParseIntError;
1577
1578            /// Parses a non-zero integer from a string slice with decimal digits.
1579            ///
1580            /// The characters are expected to be an optional
1581            #[doc = sign_dependent_expr!{
1582                $signedness ?
1583                if signed {
1584                    " `+` or `-` "
1585                }
1586                if unsigned {
1587                    " `+` "
1588                }
1589            }]
1590            /// sign followed by only digits. Leading and trailing non-digit characters (including
1591            /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1592            /// also represent an error.
1593            ///
1594            /// # Examples
1595            ///
1596            /// ```
1597            /// use std::num::NonZero;
1598            /// use std::str::FromStr;
1599            ///
1600            #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));")]
1601            /// ```
1602            ///
1603            /// Trailing space returns error:
1604            ///
1605            /// ```
1606            /// use std::num::NonZero;
1607            /// use std::str::FromStr;
1608            ///
1609            #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_str(\"1 \").is_err());")]
1610            /// ```
1611            #[inline]
1612            fn from_str(src: &str) -> Result<Self, Self::Err> {
1613                Self::from_str_radix(src, 10)
1614            }
1615        }
1616
1617        nonzero_integer_signedness_dependent_impls!($signedness $Int);
1618    };
1619
1620    (
1621        Self = $Ty:ident,
1622        Primitive = unsigned $Int:ident,
1623        SignedPrimitive = $Sint:ident,
1624        rot = $rot:literal,
1625        rot_op = $rot_op:literal,
1626        rot_result = $rot_result:literal,
1627        swap_op = $swap_op:literal,
1628        swapped = $swapped:literal,
1629        reversed = $reversed:literal,
1630        $(,)?
1631    ) => {
1632        nonzero_integer! {
1633            #[stable(feature = "nonzero", since = "1.28.0")]
1634            Self = $Ty,
1635            Primitive = unsigned $Int,
1636            SignedPrimitive = $Sint,
1637            UnsignedPrimitive = $Int,
1638            rot = $rot,
1639            rot_op = $rot_op,
1640            rot_result = $rot_result,
1641            swap_op = $swap_op,
1642            swapped = $swapped,
1643            reversed = $reversed,
1644            leading_zeros_test = concat!(stringify!($Int), "::MAX"),
1645        }
1646    };
1647
1648    (
1649        Self = $Ty:ident,
1650        Primitive = signed $Int:ident,
1651        UnsignedPrimitive = $Uint:ident,
1652        rot = $rot:literal,
1653        rot_op = $rot_op:literal,
1654        rot_result = $rot_result:literal,
1655        swap_op = $swap_op:literal,
1656        swapped = $swapped:literal,
1657        reversed = $reversed:literal,
1658    ) => {
1659        nonzero_integer! {
1660            #[stable(feature = "signed_nonzero", since = "1.34.0")]
1661            Self = $Ty,
1662            Primitive = signed $Int,
1663            SignedPrimitive = $Int,
1664            UnsignedPrimitive = $Uint,
1665            rot = $rot,
1666            rot_op = $rot_op,
1667            rot_result = $rot_result,
1668            swap_op = $swap_op,
1669            swapped = $swapped,
1670            reversed = $reversed,
1671            leading_zeros_test = concat!("-1", stringify!($Int)),
1672        }
1673    };
1674}
1675
1676macro_rules! nonzero_integer_signedness_dependent_impls {
1677    // Impls for unsigned nonzero types only.
1678    (unsigned $Int:ty) => {
1679        #[stable(feature = "nonzero_div", since = "1.51.0")]
1680        #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1681        const impl Div<NonZero<$Int>> for $Int {
1682            type Output = $Int;
1683
1684            /// Same as `self / other.get()`, but because `other` is a `NonZero<_>`,
1685            /// there's never a runtime check for division-by-zero.
1686            ///
1687            /// This operation rounds towards zero, truncating any fractional
1688            /// part of the exact result, and cannot panic.
1689            #[doc(alias = "unchecked_div")]
1690            #[inline]
1691            fn div(self, other: NonZero<$Int>) -> $Int {
1692                // SAFETY: Division by zero is checked because `other` is non-zero,
1693                // and MIN/-1 is checked because `self` is an unsigned int.
1694                unsafe { intrinsics::unchecked_div(self, other.get()) }
1695            }
1696        }
1697
1698        #[stable(feature = "nonzero_div_assign", since = "1.79.0")]
1699        #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1700        const impl DivAssign<NonZero<$Int>> for $Int {
1701            /// Same as `self /= other.get()`, but because `other` is a `NonZero<_>`,
1702            /// there's never a runtime check for division-by-zero.
1703            ///
1704            /// This operation rounds towards zero, truncating any fractional
1705            /// part of the exact result, and cannot panic.
1706            #[inline]
1707            fn div_assign(&mut self, other: NonZero<$Int>) {
1708                *self = *self / other;
1709            }
1710        }
1711
1712        #[stable(feature = "nonzero_div", since = "1.51.0")]
1713        #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1714        const impl Rem<NonZero<$Int>> for $Int {
1715            type Output = $Int;
1716
1717            /// This operation satisfies `n % d == n - (n / d) * d`, and cannot panic.
1718            #[inline]
1719            fn rem(self, other: NonZero<$Int>) -> $Int {
1720                // SAFETY: Remainder by zero is checked because `other` is non-zero,
1721                // and MIN/-1 is checked because `self` is an unsigned int.
1722                unsafe { intrinsics::unchecked_rem(self, other.get()) }
1723            }
1724        }
1725
1726        #[stable(feature = "nonzero_div_assign", since = "1.79.0")]
1727        #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1728        const impl RemAssign<NonZero<$Int>> for $Int {
1729            /// This operation satisfies `n % d == n - (n / d) * d`, and cannot panic.
1730            #[inline]
1731            fn rem_assign(&mut self, other: NonZero<$Int>) {
1732                *self = *self % other;
1733            }
1734        }
1735    };
1736    // Impls for signed nonzero types only.
1737    (signed $Int:ty) => {
1738        #[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
1739        #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1740        const impl Neg for NonZero<$Int> {
1741            type Output = Self;
1742
1743            #[inline]
1744            fn neg(self) -> Self {
1745                // SAFETY: negation of nonzero cannot yield zero values.
1746                unsafe { Self::new_unchecked(self.get().neg()) }
1747            }
1748        }
1749
1750        forward_ref_unop! { impl Neg, neg for NonZero<$Int>,
1751        #[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
1752        #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
1753    };
1754}
1755
1756#[rustfmt::skip] // https://github.com/rust-lang/rustfmt/issues/5974
1757macro_rules! nonzero_integer_signedness_dependent_methods {
1758    // Associated items for unsigned nonzero types only.
1759    (
1760        Primitive = unsigned $Int:ident,
1761        SignedPrimitive = $Sint:ty,
1762        UnsignedPrimitive = $Uint:ty,
1763    ) => {
1764        /// The smallest value that can be represented by this non-zero
1765        /// integer type, 1.
1766        ///
1767        /// # Examples
1768        ///
1769        /// ```
1770        /// # use std::num::NonZero;
1771        /// #
1772        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MIN.get(), 1", stringify!($Int), ");")]
1773        /// ```
1774        #[stable(feature = "nonzero_min_max", since = "1.70.0")]
1775        pub const MIN: Self = Self::new(1).unwrap();
1776
1777        /// The largest value that can be represented by this non-zero
1778        /// integer type,
1779        #[doc = concat!("equal to [`", stringify!($Int), "::MAX`].")]
1780        ///
1781        /// # Examples
1782        ///
1783        /// ```
1784        /// # use std::num::NonZero;
1785        /// #
1786        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MAX.get(), ", stringify!($Int), "::MAX);")]
1787        /// ```
1788        #[stable(feature = "nonzero_min_max", since = "1.70.0")]
1789        pub const MAX: Self = Self::new(<$Int>::MAX).unwrap();
1790
1791        /// Adds an unsigned integer to a non-zero value.
1792        /// Checks for overflow and returns [`None`] on overflow.
1793        /// As a consequence, the result cannot wrap to zero.
1794        ///
1795        ///
1796        /// # Examples
1797        ///
1798        /// ```
1799        /// # use std::num::NonZero;
1800        /// #
1801        /// # fn main() { test().unwrap(); }
1802        /// # fn test() -> Option<()> {
1803        #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
1804        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1805        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1806        ///
1807        /// assert_eq!(Some(two), one.checked_add(1));
1808        /// assert_eq!(None, max.checked_add(1));
1809        /// # Some(())
1810        /// # }
1811        /// ```
1812        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1813        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1814        #[must_use = "this returns the result of the operation, \
1815                      without modifying the original"]
1816        #[inline]
1817        pub const fn checked_add(self, other: $Int) -> Option<Self> {
1818            if let Some(result) = self.get().checked_add(other) {
1819                // SAFETY:
1820                // - `checked_add` returns `None` on overflow
1821                // - `self` is non-zero
1822                // - the only way to get zero from an addition without overflow is for both
1823                //   sides to be zero
1824                //
1825                // So the result cannot be zero.
1826                Some(unsafe { Self::new_unchecked(result) })
1827            } else {
1828                None
1829            }
1830        }
1831
1832        /// Adds an unsigned integer to a non-zero value.
1833        #[doc = concat!("Return [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")]
1834        ///
1835        /// # Examples
1836        ///
1837        /// ```
1838        /// # use std::num::NonZero;
1839        /// #
1840        /// # fn main() { test().unwrap(); }
1841        /// # fn test() -> Option<()> {
1842        #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
1843        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1844        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1845        ///
1846        /// assert_eq!(two, one.saturating_add(1));
1847        /// assert_eq!(max, max.saturating_add(1));
1848        /// # Some(())
1849        /// # }
1850        /// ```
1851        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1852        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1853        #[must_use = "this returns the result of the operation, \
1854                      without modifying the original"]
1855        #[inline]
1856        pub const fn saturating_add(self, other: $Int) -> Self {
1857            // SAFETY:
1858            // - `saturating_add` returns `u*::MAX` on overflow, which is non-zero
1859            // - `self` is non-zero
1860            // - the only way to get zero from an addition without overflow is for both
1861            //   sides to be zero
1862            //
1863            // So the result cannot be zero.
1864            unsafe { Self::new_unchecked(self.get().saturating_add(other)) }
1865        }
1866
1867        /// Adds an unsigned integer to a non-zero value,
1868        /// assuming overflow cannot occur.
1869        /// Overflow is unchecked, and it is undefined behavior to overflow
1870        /// *even if the result would wrap to a non-zero value*.
1871        ///
1872        /// # Safety
1873        ///
1874        /// This results in undefined behavior when
1875        #[doc = concat!("`self + rhs > ", stringify!($Int), "::MAX`.")]
1876        ///
1877        /// # Examples
1878        ///
1879        /// ```
1880        /// #![feature(nonzero_ops)]
1881        ///
1882        /// # use std::num::NonZero;
1883        /// #
1884        /// # fn main() { test().unwrap(); }
1885        /// # fn test() -> Option<()> {
1886        #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
1887        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1888        ///
1889        /// assert_eq!(two, unsafe { one.unchecked_add(1) });
1890        /// # Some(())
1891        /// # }
1892        /// ```
1893        #[unstable(feature = "nonzero_ops", issue = "84186")]
1894        #[must_use = "this returns the result of the operation, \
1895                      without modifying the original"]
1896        #[inline]
1897        pub const unsafe fn unchecked_add(self, other: $Int) -> Self {
1898            // SAFETY: The caller ensures there is no overflow.
1899            unsafe { Self::new_unchecked(self.get().unchecked_add(other)) }
1900        }
1901
1902        /// Calculates the quotient of `self` and `rhs`, rounding the result towards positive infinity.
1903        ///
1904        /// The result is guaranteed to be non-zero.
1905        ///
1906        /// # Examples
1907        ///
1908        /// ```
1909        /// # use std::num::NonZero;
1910        #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ").unwrap();")]
1911        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX).unwrap();")]
1912        /// assert_eq!(one.div_ceil(max), one);
1913        ///
1914        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ").unwrap();")]
1915        #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ").unwrap();")]
1916        /// assert_eq!(three.div_ceil(two), two);
1917        /// ```
1918        #[stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
1919        #[rustc_const_stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
1920        #[must_use = "this returns the result of the operation, \
1921                      without modifying the original"]
1922        #[inline]
1923        pub const fn div_ceil(self, rhs: Self) -> Self {
1924            // An implementation of the function without calculating the remainder.
1925            // It is better than the implementation for normal integers, but it can only
1926            // be used here because of the possibility to subtract by one without overflow.
1927            let v = (self.get() - 1) / rhs.get() + 1;
1928            // SAFETY: ceiled division of two positive integers can never be zero.
1929            unsafe { Self::new_unchecked(v) }
1930        }
1931
1932        /// Returns the smallest power of two greater than or equal to `self`.
1933        /// Checks for overflow and returns [`None`]
1934        /// if the next power of two is greater than the type’s maximum value.
1935        /// As a consequence, the result cannot wrap to zero.
1936        ///
1937        /// # Examples
1938        ///
1939        /// ```
1940        /// # use std::num::NonZero;
1941        /// #
1942        /// # fn main() { test().unwrap(); }
1943        /// # fn test() -> Option<()> {
1944        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1945        #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
1946        #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1947        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1948        ///
1949        /// assert_eq!(Some(two), two.checked_next_power_of_two() );
1950        /// assert_eq!(Some(four), three.checked_next_power_of_two() );
1951        /// assert_eq!(None, max.checked_next_power_of_two() );
1952        /// # Some(())
1953        /// # }
1954        /// ```
1955        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1956        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1957        #[must_use = "this returns the result of the operation, \
1958                      without modifying the original"]
1959        #[inline]
1960        pub const fn checked_next_power_of_two(self) -> Option<Self> {
1961            if let Some(nz) = self.get().checked_next_power_of_two() {
1962                // SAFETY: The next power of two is positive
1963                // and overflow is checked.
1964                Some(unsafe { Self::new_unchecked(nz) })
1965            } else {
1966                None
1967            }
1968        }
1969
1970        /// Returns the base 2 logarithm of the number, rounded down.
1971        ///
1972        /// This is the same operation as
1973        #[doc = concat!("[`", stringify!($Int), "::ilog2`],")]
1974        /// except that it has no failure cases to worry about
1975        /// since this value can never be zero.
1976        ///
1977        /// Note that this is equivalent to [`highest_one`](Self::highest_one).
1978        ///
1979        /// # Examples
1980        ///
1981        /// ```
1982        /// # use std::num::NonZero;
1983        /// #
1984        /// # fn main() { test().unwrap(); }
1985        /// # fn test() -> Option<()> {
1986        #[doc = concat!("assert_eq!(NonZero::new(7", stringify!($Int), ")?.ilog2(), 2);")]
1987        #[doc = concat!("assert_eq!(NonZero::new(8", stringify!($Int), ")?.ilog2(), 3);")]
1988        #[doc = concat!("assert_eq!(NonZero::new(9", stringify!($Int), ")?.ilog2(), 3);")]
1989        /// # Some(())
1990        /// # }
1991        /// ```
1992        #[stable(feature = "int_log", since = "1.67.0")]
1993        #[rustc_const_stable(feature = "int_log", since = "1.67.0")]
1994        #[must_use = "this returns the result of the operation, \
1995                      without modifying the original"]
1996        #[inline]
1997        pub const fn ilog2(self) -> u32 {
1998            Self::BITS - 1 - self.leading_zeros()
1999        }
2000
2001        /// Returns the base 10 logarithm of the number, rounded down.
2002        ///
2003        /// This is the same operation as
2004        #[doc = concat!("[`", stringify!($Int), "::ilog10`],")]
2005        /// except that it has no failure cases to worry about
2006        /// since this value can never be zero.
2007        ///
2008        /// # Examples
2009        ///
2010        /// ```
2011        /// # use std::num::NonZero;
2012        /// #
2013        /// # fn main() { test().unwrap(); }
2014        /// # fn test() -> Option<()> {
2015        #[doc = concat!("assert_eq!(NonZero::new(99", stringify!($Int), ")?.ilog10(), 1);")]
2016        #[doc = concat!("assert_eq!(NonZero::new(100", stringify!($Int), ")?.ilog10(), 2);")]
2017        #[doc = concat!("assert_eq!(NonZero::new(101", stringify!($Int), ")?.ilog10(), 2);")]
2018        /// # Some(())
2019        /// # }
2020        /// ```
2021        #[stable(feature = "int_log", since = "1.67.0")]
2022        #[rustc_const_stable(feature = "int_log", since = "1.67.0")]
2023        #[must_use = "this returns the result of the operation, \
2024                      without modifying the original"]
2025        #[inline]
2026        pub const fn ilog10(self) -> u32 {
2027            imp::int_log10::$Int(self)
2028        }
2029
2030        /// Calculates the midpoint (average) between `self` and `rhs`.
2031        ///
2032        /// `midpoint(a, b)` is `(a + b) >> 1` as if it were performed in a
2033        /// sufficiently-large signed integral type. This implies that the result is
2034        /// always rounded towards negative infinity and that no overflow will ever occur.
2035        ///
2036        /// # Examples
2037        ///
2038        /// ```
2039        /// # use std::num::NonZero;
2040        /// #
2041        /// # fn main() { test().unwrap(); }
2042        /// # fn test() -> Option<()> {
2043        #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
2044        #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
2045        #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
2046        ///
2047        /// assert_eq!(one.midpoint(four), two);
2048        /// assert_eq!(four.midpoint(one), two);
2049        /// # Some(())
2050        /// # }
2051        /// ```
2052        #[stable(feature = "num_midpoint", since = "1.85.0")]
2053        #[rustc_const_stable(feature = "num_midpoint", since = "1.85.0")]
2054        #[must_use = "this returns the result of the operation, \
2055                      without modifying the original"]
2056        #[doc(alias = "average_floor")]
2057        #[doc(alias = "average")]
2058        #[inline]
2059        pub const fn midpoint(self, rhs: Self) -> Self {
2060            // SAFETY: The only way to get `0` with midpoint is to have two opposite or
2061            // near opposite numbers: (-5, 5), (0, 1), (0, 0) which is impossible because
2062            // of the unsignedness of this number and also because `Self` is guaranteed to
2063            // never being 0.
2064            unsafe { Self::new_unchecked(self.get().midpoint(rhs.get())) }
2065        }
2066
2067        /// Returns `true` if and only if `self == (1 << k)` for some `k`.
2068        ///
2069        /// On many architectures, this function can perform better than `is_power_of_two()`
2070        /// on the underlying integer type, as special handling of zero can be avoided.
2071        ///
2072        /// # Examples
2073        ///
2074        /// ```
2075        /// # use std::num::NonZero;
2076        /// #
2077        /// # fn main() { test().unwrap(); }
2078        /// # fn test() -> Option<()> {
2079        #[doc = concat!("let eight = NonZero::new(8", stringify!($Int), ")?;")]
2080        /// assert!(eight.is_power_of_two());
2081        #[doc = concat!("let ten = NonZero::new(10", stringify!($Int), ")?;")]
2082        /// assert!(!ten.is_power_of_two());
2083        /// # Some(())
2084        /// # }
2085        /// ```
2086        #[must_use]
2087        #[stable(feature = "nonzero_is_power_of_two", since = "1.59.0")]
2088        #[rustc_const_stable(feature = "nonzero_is_power_of_two", since = "1.59.0")]
2089        #[inline]
2090        pub const fn is_power_of_two(self) -> bool {
2091            // LLVM 11 normalizes `unchecked_sub(x, 1) & x == 0` to the implementation seen here.
2092            // On the basic x86-64 target, this saves 3 instructions for the zero check.
2093            // On x86_64 with BMI1, being nonzero lets it codegen to `BLSR`, which saves an instruction
2094            // compared to the `POPCNT` implementation on the underlying integer type.
2095
2096            intrinsics::ctpop(self.get()) < 2
2097        }
2098
2099        /// Returns the square root of the number, rounded down.
2100        ///
2101        /// # Examples
2102        ///
2103        /// ```
2104        /// # use std::num::NonZero;
2105        /// #
2106        /// # fn main() { test().unwrap(); }
2107        /// # fn test() -> Option<()> {
2108        #[doc = concat!("let ten = NonZero::new(10", stringify!($Int), ")?;")]
2109        #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
2110        ///
2111        /// assert_eq!(ten.isqrt(), three);
2112        /// # Some(())
2113        /// # }
2114        /// ```
2115        #[stable(feature = "isqrt", since = "1.84.0")]
2116        #[rustc_const_stable(feature = "isqrt", since = "1.84.0")]
2117        #[must_use = "this returns the result of the operation, \
2118                      without modifying the original"]
2119        #[inline]
2120        pub const fn isqrt(self) -> Self {
2121            let result = self.get().isqrt();
2122
2123            // SAFETY: Integer square root is a monotonically nondecreasing
2124            // function, which means that increasing the input will never cause
2125            // the output to decrease. Thus, since the input for nonzero
2126            // unsigned integers has a lower bound of 1, the lower bound of the
2127            // results will be sqrt(1), which is 1, so a result can't be zero.
2128            unsafe { Self::new_unchecked(result) }
2129        }
2130
2131        /// Returns the bit pattern of `self` reinterpreted as a signed integer of the same size.
2132        ///
2133        /// # Examples
2134        ///
2135        /// ```
2136        /// # use std::num::NonZero;
2137        ///
2138        #[doc = concat!("let n = NonZero::<", stringify!($Int), ">::MAX;")]
2139        ///
2140        #[doc = concat!("assert_eq!(n.cast_signed(), NonZero::new(-1", stringify!($Sint), ").unwrap());")]
2141        /// ```
2142        #[stable(feature = "integer_sign_cast", since = "1.87.0")]
2143        #[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
2144        #[must_use = "this returns the result of the operation, \
2145                      without modifying the original"]
2146        #[inline(always)]
2147        pub const fn cast_signed(self) -> NonZero<$Sint> {
2148            // SAFETY: `self.get()` can't be zero
2149            unsafe { NonZero::new_unchecked(self.get().cast_signed()) }
2150        }
2151
2152        /// Returns the minimum number of bits required to represent `self`.
2153        ///
2154        /// # Examples
2155        ///
2156        /// ```
2157        /// # use core::num::NonZero;
2158        /// #
2159        /// # fn main() { test().unwrap(); }
2160        /// # fn test() -> Option<()> {
2161        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1)?.bit_width(), NonZero::new(1)?);")]
2162        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b111)?.bit_width(), NonZero::new(3)?);")]
2163        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1110)?.bit_width(), NonZero::new(4)?);")]
2164        /// # Some(())
2165        /// # }
2166        /// ```
2167        #[stable(feature = "uint_bit_width", since = "1.97.0")]
2168        #[rustc_const_stable(feature = "uint_bit_width", since = "1.97.0")]
2169        #[must_use = "this returns the result of the operation, \
2170                      without modifying the original"]
2171        #[inline(always)]
2172        pub const fn bit_width(self) -> NonZero<u32> {
2173            // SAFETY: Since `self.leading_zeros()` is always less than
2174            // `Self::BITS`, this subtraction can never be zero.
2175            unsafe { NonZero::new_unchecked(Self::BITS - self.leading_zeros()) }
2176        }
2177    };
2178
2179    // Associated items for signed nonzero types only.
2180    (
2181        Primitive = signed $Int:ident,
2182        SignedPrimitive = $Sint:ty,
2183        UnsignedPrimitive = $Uint:ty,
2184    ) => {
2185        /// The smallest value that can be represented by this non-zero
2186        /// integer type,
2187        #[doc = concat!("equal to [`", stringify!($Int), "::MIN`].")]
2188        ///
2189        /// Note: While most integer types are defined for every whole
2190        /// number between `MIN` and `MAX`, signed non-zero integers are
2191        /// a special case. They have a "gap" at 0.
2192        ///
2193        /// # Examples
2194        ///
2195        /// ```
2196        /// # use std::num::NonZero;
2197        /// #
2198        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MIN.get(), ", stringify!($Int), "::MIN);")]
2199        /// ```
2200        #[stable(feature = "nonzero_min_max", since = "1.70.0")]
2201        pub const MIN: Self = Self::new(<$Int>::MIN).unwrap();
2202
2203        /// The largest value that can be represented by this non-zero
2204        /// integer type,
2205        #[doc = concat!("equal to [`", stringify!($Int), "::MAX`].")]
2206        ///
2207        /// Note: While most integer types are defined for every whole
2208        /// number between `MIN` and `MAX`, signed non-zero integers are
2209        /// a special case. They have a "gap" at 0.
2210        ///
2211        /// # Examples
2212        ///
2213        /// ```
2214        /// # use std::num::NonZero;
2215        /// #
2216        #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MAX.get(), ", stringify!($Int), "::MAX);")]
2217        /// ```
2218        #[stable(feature = "nonzero_min_max", since = "1.70.0")]
2219        pub const MAX: Self = Self::new(<$Int>::MAX).unwrap();
2220
2221        /// Computes the absolute value of self.
2222        #[doc = concat!("See [`", stringify!($Int), "::abs`]")]
2223        /// for documentation on overflow behavior.
2224        ///
2225        /// # Example
2226        ///
2227        /// ```
2228        /// # use std::num::NonZero;
2229        /// #
2230        /// # fn main() { test().unwrap(); }
2231        /// # fn test() -> Option<()> {
2232        #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2233        #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2234        ///
2235        /// assert_eq!(pos, pos.abs());
2236        /// assert_eq!(pos, neg.abs());
2237        /// # Some(())
2238        /// # }
2239        /// ```
2240        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2241        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2242        #[must_use = "this returns the result of the operation, \
2243                      without modifying the original"]
2244        #[inline]
2245        pub const fn abs(self) -> Self {
2246            // SAFETY: This cannot overflow to zero.
2247            unsafe { Self::new_unchecked(self.get().abs()) }
2248        }
2249
2250        /// Checked absolute value.
2251        /// Checks for overflow and returns [`None`] if
2252        #[doc = concat!("`self == NonZero::<", stringify!($Int), ">::MIN`.")]
2253        /// The result cannot be zero.
2254        ///
2255        /// # Example
2256        ///
2257        /// ```
2258        /// # use std::num::NonZero;
2259        /// #
2260        /// # fn main() { test().unwrap(); }
2261        /// # fn test() -> Option<()> {
2262        #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2263        #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2264        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2265        ///
2266        /// assert_eq!(Some(pos), neg.checked_abs());
2267        /// assert_eq!(None, min.checked_abs());
2268        /// # Some(())
2269        /// # }
2270        /// ```
2271        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2272        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2273        #[must_use = "this returns the result of the operation, \
2274                      without modifying the original"]
2275        #[inline]
2276        pub const fn checked_abs(self) -> Option<Self> {
2277            if let Some(nz) = self.get().checked_abs() {
2278                // SAFETY: absolute value of nonzero cannot yield zero values.
2279                Some(unsafe { Self::new_unchecked(nz) })
2280            } else {
2281                None
2282            }
2283        }
2284
2285        /// Computes the absolute value of self,
2286        /// with overflow information, see
2287        #[doc = concat!("[`", stringify!($Int), "::overflowing_abs`].")]
2288        ///
2289        /// # Example
2290        ///
2291        /// ```
2292        /// # use std::num::NonZero;
2293        /// #
2294        /// # fn main() { test().unwrap(); }
2295        /// # fn test() -> Option<()> {
2296        #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2297        #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2298        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2299        ///
2300        /// assert_eq!((pos, false), pos.overflowing_abs());
2301        /// assert_eq!((pos, false), neg.overflowing_abs());
2302        /// assert_eq!((min, true), min.overflowing_abs());
2303        /// # Some(())
2304        /// # }
2305        /// ```
2306        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2307        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2308        #[must_use = "this returns the result of the operation, \
2309                      without modifying the original"]
2310        #[inline]
2311        pub const fn overflowing_abs(self) -> (Self, bool) {
2312            let (nz, flag) = self.get().overflowing_abs();
2313            (
2314                // SAFETY: absolute value of nonzero cannot yield zero values.
2315                unsafe { Self::new_unchecked(nz) },
2316                flag,
2317            )
2318        }
2319
2320        /// Saturating absolute value, see
2321        #[doc = concat!("[`", stringify!($Int), "::saturating_abs`].")]
2322        ///
2323        /// # Example
2324        ///
2325        /// ```
2326        /// # use std::num::NonZero;
2327        /// #
2328        /// # fn main() { test().unwrap(); }
2329        /// # fn test() -> Option<()> {
2330        #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2331        #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2332        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2333        #[doc = concat!("let min_plus = NonZero::new(", stringify!($Int), "::MIN + 1)?;")]
2334        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
2335        ///
2336        /// assert_eq!(pos, pos.saturating_abs());
2337        /// assert_eq!(pos, neg.saturating_abs());
2338        /// assert_eq!(max, min.saturating_abs());
2339        /// assert_eq!(max, min_plus.saturating_abs());
2340        /// # Some(())
2341        /// # }
2342        /// ```
2343        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2344        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2345        #[must_use = "this returns the result of the operation, \
2346                      without modifying the original"]
2347        #[inline]
2348        pub const fn saturating_abs(self) -> Self {
2349            // SAFETY: absolute value of nonzero cannot yield zero values.
2350            unsafe { Self::new_unchecked(self.get().saturating_abs()) }
2351        }
2352
2353        /// Wrapping absolute value, see
2354        #[doc = concat!("[`", stringify!($Int), "::wrapping_abs`].")]
2355        ///
2356        /// # Example
2357        ///
2358        /// ```
2359        /// # use std::num::NonZero;
2360        /// #
2361        /// # fn main() { test().unwrap(); }
2362        /// # fn test() -> Option<()> {
2363        #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2364        #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2365        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2366        #[doc = concat!("# let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
2367        ///
2368        /// assert_eq!(pos, pos.wrapping_abs());
2369        /// assert_eq!(pos, neg.wrapping_abs());
2370        /// assert_eq!(min, min.wrapping_abs());
2371        /// assert_eq!(max, (-max).wrapping_abs());
2372        /// # Some(())
2373        /// # }
2374        /// ```
2375        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2376        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2377        #[must_use = "this returns the result of the operation, \
2378                      without modifying the original"]
2379        #[inline]
2380        pub const fn wrapping_abs(self) -> Self {
2381            // SAFETY: absolute value of nonzero cannot yield zero values.
2382            unsafe { Self::new_unchecked(self.get().wrapping_abs()) }
2383        }
2384
2385        /// Computes the absolute value of self
2386        /// without any wrapping or panicking.
2387        ///
2388        /// # Example
2389        ///
2390        /// ```
2391        /// # use std::num::NonZero;
2392        /// #
2393        /// # fn main() { test().unwrap(); }
2394        /// # fn test() -> Option<()> {
2395        #[doc = concat!("let u_pos = NonZero::new(1", stringify!($Uint), ")?;")]
2396        #[doc = concat!("let i_pos = NonZero::new(1", stringify!($Int), ")?;")]
2397        #[doc = concat!("let i_neg = NonZero::new(-1", stringify!($Int), ")?;")]
2398        #[doc = concat!("let i_min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2399        #[doc = concat!("let u_max = NonZero::new(", stringify!($Uint), "::MAX / 2 + 1)?;")]
2400        ///
2401        /// assert_eq!(u_pos, i_pos.unsigned_abs());
2402        /// assert_eq!(u_pos, i_neg.unsigned_abs());
2403        /// assert_eq!(u_max, i_min.unsigned_abs());
2404        /// # Some(())
2405        /// # }
2406        /// ```
2407        #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2408        #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2409        #[must_use = "this returns the result of the operation, \
2410                      without modifying the original"]
2411        #[inline]
2412        pub const fn unsigned_abs(self) -> NonZero<$Uint> {
2413            // SAFETY: absolute value of nonzero cannot yield zero values.
2414            unsafe { NonZero::new_unchecked(self.get().unsigned_abs()) }
2415        }
2416
2417        /// Returns `true` if `self` is positive and `false` if the
2418        /// number is negative.
2419        ///
2420        /// # Example
2421        ///
2422        /// ```
2423        /// # use std::num::NonZero;
2424        /// #
2425        /// # fn main() { test().unwrap(); }
2426        /// # fn test() -> Option<()> {
2427        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2428        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2429        ///
2430        /// assert!(pos_five.is_positive());
2431        /// assert!(!neg_five.is_positive());
2432        /// # Some(())
2433        /// # }
2434        /// ```
2435        #[must_use]
2436        #[inline]
2437        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2438        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2439        pub const fn is_positive(self) -> bool {
2440            self.get().is_positive()
2441        }
2442
2443        /// Returns `true` if `self` is negative and `false` if the
2444        /// number is positive.
2445        ///
2446        /// # Example
2447        ///
2448        /// ```
2449        /// # use std::num::NonZero;
2450        /// #
2451        /// # fn main() { test().unwrap(); }
2452        /// # fn test() -> Option<()> {
2453        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2454        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2455        ///
2456        /// assert!(neg_five.is_negative());
2457        /// assert!(!pos_five.is_negative());
2458        /// # Some(())
2459        /// # }
2460        /// ```
2461        #[must_use]
2462        #[inline]
2463        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2464        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2465        pub const fn is_negative(self) -> bool {
2466            self.get().is_negative()
2467        }
2468
2469        /// Checked negation. Computes `-self`,
2470        #[doc = concat!("returning `None` if `self == NonZero::<", stringify!($Int), ">::MIN`.")]
2471        ///
2472        /// # Example
2473        ///
2474        /// ```
2475        /// # use std::num::NonZero;
2476        /// #
2477        /// # fn main() { test().unwrap(); }
2478        /// # fn test() -> Option<()> {
2479        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2480        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2481        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2482        ///
2483        /// assert_eq!(pos_five.checked_neg(), Some(neg_five));
2484        /// assert_eq!(min.checked_neg(), None);
2485        /// # Some(())
2486        /// # }
2487        /// ```
2488        #[inline]
2489        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2490        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2491        pub const fn checked_neg(self) -> Option<Self> {
2492            if let Some(result) = self.get().checked_neg() {
2493                // SAFETY: negation of nonzero cannot yield zero values.
2494                return Some(unsafe { Self::new_unchecked(result) });
2495            }
2496            None
2497        }
2498
2499        /// Negates self, overflowing if this is equal to the minimum value.
2500        ///
2501        #[doc = concat!("See [`", stringify!($Int), "::overflowing_neg`]")]
2502        /// for documentation on overflow behavior.
2503        ///
2504        /// # Example
2505        ///
2506        /// ```
2507        /// # use std::num::NonZero;
2508        /// #
2509        /// # fn main() { test().unwrap(); }
2510        /// # fn test() -> Option<()> {
2511        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2512        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2513        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2514        ///
2515        /// assert_eq!(pos_five.overflowing_neg(), (neg_five, false));
2516        /// assert_eq!(min.overflowing_neg(), (min, true));
2517        /// # Some(())
2518        /// # }
2519        /// ```
2520        #[inline]
2521        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2522        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2523        pub const fn overflowing_neg(self) -> (Self, bool) {
2524            let (result, overflow) = self.get().overflowing_neg();
2525            // SAFETY: negation of nonzero cannot yield zero values.
2526            ((unsafe { Self::new_unchecked(result) }), overflow)
2527        }
2528
2529        /// Saturating negation. Computes `-self`,
2530        #[doc = concat!("returning [`NonZero::<", stringify!($Int), ">::MAX`]")]
2531        #[doc = concat!("if `self == NonZero::<", stringify!($Int), ">::MIN`")]
2532        /// instead of overflowing.
2533        ///
2534        /// # Example
2535        ///
2536        /// ```
2537        /// # use std::num::NonZero;
2538        /// #
2539        /// # fn main() { test().unwrap(); }
2540        /// # fn test() -> Option<()> {
2541        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2542        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2543        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2544        #[doc = concat!("let min_plus_one = NonZero::new(", stringify!($Int), "::MIN + 1)?;")]
2545        #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
2546        ///
2547        /// assert_eq!(pos_five.saturating_neg(), neg_five);
2548        /// assert_eq!(min.saturating_neg(), max);
2549        /// assert_eq!(max.saturating_neg(), min_plus_one);
2550        /// # Some(())
2551        /// # }
2552        /// ```
2553        #[inline]
2554        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2555        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2556        pub const fn saturating_neg(self) -> Self {
2557            if let Some(result) = self.checked_neg() {
2558                return result;
2559            }
2560            Self::MAX
2561        }
2562
2563        /// Wrapping (modular) negation. Computes `-self`, wrapping around at the boundary
2564        /// of the type.
2565        ///
2566        #[doc = concat!("See [`", stringify!($Int), "::wrapping_neg`]")]
2567        /// for documentation on overflow behavior.
2568        ///
2569        /// # Example
2570        ///
2571        /// ```
2572        /// # use std::num::NonZero;
2573        /// #
2574        /// # fn main() { test().unwrap(); }
2575        /// # fn test() -> Option<()> {
2576        #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2577        #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2578        #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2579        ///
2580        /// assert_eq!(pos_five.wrapping_neg(), neg_five);
2581        /// assert_eq!(min.wrapping_neg(), min);
2582        /// # Some(())
2583        /// # }
2584        /// ```
2585        #[inline]
2586        #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2587        #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2588        pub const fn wrapping_neg(self) -> Self {
2589            let result = self.get().wrapping_neg();
2590            // SAFETY: negation of nonzero cannot yield zero values.
2591            unsafe { Self::new_unchecked(result) }
2592        }
2593
2594        /// Returns the bit pattern of `self` reinterpreted as an unsigned integer of the same size.
2595        ///
2596        /// # Examples
2597        ///
2598        /// ```
2599        /// # use std::num::NonZero;
2600        ///
2601        #[doc = concat!("let n = NonZero::new(-1", stringify!($Int), ").unwrap();")]
2602        ///
2603        #[doc = concat!("assert_eq!(n.cast_unsigned(), NonZero::<", stringify!($Uint), ">::MAX);")]
2604        /// ```
2605        #[stable(feature = "integer_sign_cast", since = "1.87.0")]
2606        #[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
2607        #[must_use = "this returns the result of the operation, \
2608                      without modifying the original"]
2609        #[inline(always)]
2610        pub const fn cast_unsigned(self) -> NonZero<$Uint> {
2611            // SAFETY: `self.get()` can't be zero
2612            unsafe { NonZero::new_unchecked(self.get().cast_unsigned()) }
2613        }
2614
2615    };
2616}
2617
2618nonzero_integer! {
2619    Self = NonZeroU8,
2620    Primitive = unsigned u8,
2621    SignedPrimitive = i8,
2622    rot = 2,
2623    rot_op = "0x82",
2624    rot_result = "0xa",
2625    swap_op = "0x12",
2626    swapped = "0x12",
2627    reversed = "0x48",
2628}
2629
2630nonzero_integer! {
2631    Self = NonZeroU16,
2632    Primitive = unsigned u16,
2633    SignedPrimitive = i16,
2634    rot = 4,
2635    rot_op = "0xa003",
2636    rot_result = "0x3a",
2637    swap_op = "0x1234",
2638    swapped = "0x3412",
2639    reversed = "0x2c48",
2640}
2641
2642nonzero_integer! {
2643    Self = NonZeroU32,
2644    Primitive = unsigned u32,
2645    SignedPrimitive = i32,
2646    rot = 8,
2647    rot_op = "0x10000b3",
2648    rot_result = "0xb301",
2649    swap_op = "0x12345678",
2650    swapped = "0x78563412",
2651    reversed = "0x1e6a2c48",
2652}
2653
2654nonzero_integer! {
2655    Self = NonZeroU64,
2656    Primitive = unsigned u64,
2657    SignedPrimitive = i64,
2658    rot = 12,
2659    rot_op = "0xaa00000000006e1",
2660    rot_result = "0x6e10aa",
2661    swap_op = "0x1234567890123456",
2662    swapped = "0x5634129078563412",
2663    reversed = "0x6a2c48091e6a2c48",
2664}
2665
2666nonzero_integer! {
2667    Self = NonZeroU128,
2668    Primitive = unsigned u128,
2669    SignedPrimitive = i128,
2670    rot = 16,
2671    rot_op = "0x13f40000000000000000000000004f76",
2672    rot_result = "0x4f7613f4",
2673    swap_op = "0x12345678901234567890123456789012",
2674    swapped = "0x12907856341290785634129078563412",
2675    reversed = "0x48091e6a2c48091e6a2c48091e6a2c48",
2676}
2677
2678#[cfg(target_pointer_width = "16")]
2679nonzero_integer! {
2680    Self = NonZeroUsize,
2681    Primitive = unsigned usize,
2682    SignedPrimitive = isize,
2683    rot = 4,
2684    rot_op = "0xa003",
2685    rot_result = "0x3a",
2686    swap_op = "0x1234",
2687    swapped = "0x3412",
2688    reversed = "0x2c48",
2689}
2690
2691#[cfg(target_pointer_width = "32")]
2692nonzero_integer! {
2693    Self = NonZeroUsize,
2694    Primitive = unsigned usize,
2695    SignedPrimitive = isize,
2696    rot = 8,
2697    rot_op = "0x10000b3",
2698    rot_result = "0xb301",
2699    swap_op = "0x12345678",
2700    swapped = "0x78563412",
2701    reversed = "0x1e6a2c48",
2702}
2703
2704#[cfg(target_pointer_width = "64")]
2705nonzero_integer! {
2706    Self = NonZeroUsize,
2707    Primitive = unsigned usize,
2708    SignedPrimitive = isize,
2709    rot = 12,
2710    rot_op = "0xaa00000000006e1",
2711    rot_result = "0x6e10aa",
2712    swap_op = "0x1234567890123456",
2713    swapped = "0x5634129078563412",
2714    reversed = "0x6a2c48091e6a2c48",
2715}
2716
2717nonzero_integer! {
2718    Self = NonZeroI8,
2719    Primitive = signed i8,
2720    UnsignedPrimitive = u8,
2721    rot = 2,
2722    rot_op = "-0x7e",
2723    rot_result = "0xa",
2724    swap_op = "0x12",
2725    swapped = "0x12",
2726    reversed = "0x48",
2727}
2728
2729nonzero_integer! {
2730    Self = NonZeroI16,
2731    Primitive = signed i16,
2732    UnsignedPrimitive = u16,
2733    rot = 4,
2734    rot_op = "-0x5ffd",
2735    rot_result = "0x3a",
2736    swap_op = "0x1234",
2737    swapped = "0x3412",
2738    reversed = "0x2c48",
2739}
2740
2741nonzero_integer! {
2742    Self = NonZeroI32,
2743    Primitive = signed i32,
2744    UnsignedPrimitive = u32,
2745    rot = 8,
2746    rot_op = "0x10000b3",
2747    rot_result = "0xb301",
2748    swap_op = "0x12345678",
2749    swapped = "0x78563412",
2750    reversed = "0x1e6a2c48",
2751}
2752
2753nonzero_integer! {
2754    Self = NonZeroI64,
2755    Primitive = signed i64,
2756    UnsignedPrimitive = u64,
2757    rot = 12,
2758    rot_op = "0xaa00000000006e1",
2759    rot_result = "0x6e10aa",
2760    swap_op = "0x1234567890123456",
2761    swapped = "0x5634129078563412",
2762    reversed = "0x6a2c48091e6a2c48",
2763}
2764
2765nonzero_integer! {
2766    Self = NonZeroI128,
2767    Primitive = signed i128,
2768    UnsignedPrimitive = u128,
2769    rot = 16,
2770    rot_op = "0x13f40000000000000000000000004f76",
2771    rot_result = "0x4f7613f4",
2772    swap_op = "0x12345678901234567890123456789012",
2773    swapped = "0x12907856341290785634129078563412",
2774    reversed = "0x48091e6a2c48091e6a2c48091e6a2c48",
2775}
2776
2777#[cfg(target_pointer_width = "16")]
2778nonzero_integer! {
2779    Self = NonZeroIsize,
2780    Primitive = signed isize,
2781    UnsignedPrimitive = usize,
2782    rot = 4,
2783    rot_op = "-0x5ffd",
2784    rot_result = "0x3a",
2785    swap_op = "0x1234",
2786    swapped = "0x3412",
2787    reversed = "0x2c48",
2788}
2789
2790#[cfg(target_pointer_width = "32")]
2791nonzero_integer! {
2792    Self = NonZeroIsize,
2793    Primitive = signed isize,
2794    UnsignedPrimitive = usize,
2795    rot = 8,
2796    rot_op = "0x10000b3",
2797    rot_result = "0xb301",
2798    swap_op = "0x12345678",
2799    swapped = "0x78563412",
2800    reversed = "0x1e6a2c48",
2801}
2802
2803#[cfg(target_pointer_width = "64")]
2804nonzero_integer! {
2805    Self = NonZeroIsize,
2806    Primitive = signed isize,
2807    UnsignedPrimitive = usize,
2808    rot = 12,
2809    rot_op = "0xaa00000000006e1",
2810    rot_result = "0x6e10aa",
2811    swap_op = "0x1234567890123456",
2812    swapped = "0x5634129078563412",
2813    reversed = "0x6a2c48091e6a2c48",
2814}