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