2020-09-04 13:07:03 +00:00
//! Definitions of integer that is known not to equal zero.
2024-01-20 15:11:53 +01:00
use crate ::cmp ::Ordering ;
2020-09-04 13:07:03 +00:00
use crate ::fmt ;
2024-01-20 15:11:53 +01:00
use crate ::hash ::{ Hash , Hasher } ;
2024-02-07 16:00:12 +01:00
use crate ::intrinsics ;
2024-01-20 15:11:53 +01:00
use crate ::marker ::StructuralPartialEq ;
2022-09-27 11:40:39 +09:00
use crate ::ops ::{ BitOr , BitOrAssign , Div , Neg , Rem } ;
2020-09-04 13:07:03 +00:00
use crate ::str ::FromStr ;
use super ::from_str_radix ;
use super ::{ IntErrorKind , ParseIntError } ;
2024-01-15 11:49:03 +01:00
mod private {
#[ unstable(
feature = " nonzero_internals " ,
reason = " implementation detail which may disappear or be replaced at any time " ,
issue = " none "
) ]
#[ const_trait ]
pub trait Sealed { }
}
/// A marker trait for primitive types which can be zero.
///
2024-02-18 21:29:24 +01:00
/// This is an implementation detail for <code>[NonZero]\<T></code> which may disappear or be replaced at any time.
2024-03-01 13:39:24 +01:00
///
/// # Safety
///
/// Types implementing this trait must be primitves that are valid when zeroed.
2024-01-15 11:49:03 +01:00
#[ unstable(
feature = " nonzero_internals " ,
reason = " implementation detail which may disappear or be replaced at any time " ,
issue = " none "
) ]
#[ const_trait ]
2024-03-01 13:39:24 +01:00
pub unsafe trait ZeroablePrimitive : Sized + Copy + private ::Sealed { }
2024-01-15 11:49:03 +01:00
macro_rules ! impl_zeroable_primitive {
2024-01-31 06:06:50 +01:00
( $primitive :ty ) = > {
2024-01-15 11:49:03 +01:00
#[ unstable(
feature = " nonzero_internals " ,
reason = " implementation detail which may disappear or be replaced at any time " ,
issue = " none "
) ]
impl const private ::Sealed for $primitive { }
#[ unstable(
feature = " nonzero_internals " ,
reason = " implementation detail which may disappear or be replaced at any time " ,
issue = " none "
) ]
2024-03-01 13:39:24 +01:00
unsafe impl const ZeroablePrimitive for $primitive { }
2024-01-15 11:49:03 +01:00
} ;
}
2024-01-31 06:06:50 +01:00
impl_zeroable_primitive! ( u8 ) ;
impl_zeroable_primitive! ( u16 ) ;
impl_zeroable_primitive! ( u32 ) ;
impl_zeroable_primitive! ( u64 ) ;
impl_zeroable_primitive! ( u128 ) ;
impl_zeroable_primitive! ( usize ) ;
impl_zeroable_primitive! ( i8 ) ;
impl_zeroable_primitive! ( i16 ) ;
impl_zeroable_primitive! ( i32 ) ;
impl_zeroable_primitive! ( i64 ) ;
impl_zeroable_primitive! ( i128 ) ;
impl_zeroable_primitive! ( isize ) ;
2024-01-15 11:49:03 +01:00
2024-01-20 18:02:56 +01:00
/// A value that is known not to equal zero.
///
/// This enables some memory layout optimization.
/// For example, `Option<NonZero<u32>>` is the same size as `u32`:
///
/// ```
/// #![feature(generic_nonzero)]
/// use core::mem::size_of;
///
/// assert_eq!(size_of::<Option<core::num::NonZero<u32>>>(), size_of::<u32>());
/// ```
#[ unstable(feature = " generic_nonzero " , issue = " 120257 " ) ]
#[ repr(transparent) ]
#[ rustc_layout_scalar_valid_range_start(1) ]
#[ rustc_nonnull_optimization_guaranteed ]
#[ rustc_diagnostic_item = " NonZero " ]
pub struct NonZero < T : ZeroablePrimitive > ( T ) ;
2024-01-20 15:11:53 +01:00
2024-02-17 01:45:15 +01:00
macro_rules ! impl_nonzero_fmt {
( $Trait :ident ) = > {
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
impl < T > fmt ::$Trait for NonZero < T >
where
T : ZeroablePrimitive + fmt ::$Trait ,
{
#[ inline ]
fn fmt ( & self , f : & mut fmt ::Formatter < '_ > ) -> fmt ::Result {
self . get ( ) . fmt ( f )
}
}
} ;
}
impl_nonzero_fmt! ( Debug ) ;
impl_nonzero_fmt! ( Display ) ;
impl_nonzero_fmt! ( Binary ) ;
impl_nonzero_fmt! ( Octal ) ;
impl_nonzero_fmt! ( LowerHex ) ;
impl_nonzero_fmt! ( UpperHex ) ;
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
impl < T > Clone for NonZero < T >
where
T : ZeroablePrimitive ,
{
#[ inline ]
fn clone ( & self ) -> Self {
// SAFETY: The contained value is non-zero.
unsafe { Self ( self . 0 ) }
}
}
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
impl < T > Copy for NonZero < T > where T : ZeroablePrimitive { }
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
impl < T > PartialEq for NonZero < T >
where
T : ZeroablePrimitive + PartialEq ,
{
#[ inline ]
fn eq ( & self , other : & Self ) -> bool {
self . get ( ) = = other . get ( )
}
#[ inline ]
fn ne ( & self , other : & Self ) -> bool {
self . get ( ) ! = other . get ( )
}
}
#[ unstable(feature = " structural_match " , issue = " 31434 " ) ]
impl < T > StructuralPartialEq for NonZero < T > where T : ZeroablePrimitive + StructuralPartialEq { }
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
impl < T > Eq for NonZero < T > where T : ZeroablePrimitive + Eq { }
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
impl < T > PartialOrd for NonZero < T >
where
T : ZeroablePrimitive + PartialOrd ,
{
#[ inline ]
fn partial_cmp ( & self , other : & Self ) -> Option < Ordering > {
self . get ( ) . partial_cmp ( & other . get ( ) )
}
#[ inline ]
fn lt ( & self , other : & Self ) -> bool {
self . get ( ) < other . get ( )
}
#[ inline ]
fn le ( & self , other : & Self ) -> bool {
self . get ( ) < = other . get ( )
}
#[ inline ]
fn gt ( & self , other : & Self ) -> bool {
self . get ( ) > other . get ( )
}
#[ inline ]
fn ge ( & self , other : & Self ) -> bool {
self . get ( ) > = other . get ( )
}
}
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
impl < T > Ord for NonZero < T >
where
T : ZeroablePrimitive + Ord ,
{
#[ inline ]
fn cmp ( & self , other : & Self ) -> Ordering {
self . get ( ) . cmp ( & other . get ( ) )
}
#[ inline ]
fn max ( self , other : Self ) -> Self {
// SAFETY: The maximum of two non-zero values is still non-zero.
unsafe { Self ( self . get ( ) . max ( other . get ( ) ) ) }
}
#[ inline ]
fn min ( self , other : Self ) -> Self {
// SAFETY: The minimum of two non-zero values is still non-zero.
unsafe { Self ( self . get ( ) . min ( other . get ( ) ) ) }
}
#[ inline ]
fn clamp ( self , min : Self , max : Self ) -> Self {
// SAFETY: A non-zero value clamped between two non-zero values is still non-zero.
unsafe { Self ( self . get ( ) . clamp ( min . get ( ) , max . get ( ) ) ) }
}
}
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
impl < T > Hash for NonZero < T >
where
T : ZeroablePrimitive + Hash ,
{
#[ inline ]
fn hash < H > ( & self , state : & mut H )
where
H : Hasher ,
{
self . get ( ) . hash ( state )
}
}
#[ stable(feature = " from_nonzero " , since = " 1.31.0 " ) ]
impl < T > From < NonZero < T > > for T
where
T : ZeroablePrimitive ,
{
#[ inline ]
fn from ( nonzero : NonZero < T > ) -> Self {
// Call `get` method to keep range information.
nonzero . get ( )
}
}
#[ stable(feature = " nonzero_bitor " , since = " 1.45.0 " ) ]
impl < T > BitOr for NonZero < T >
where
T : ZeroablePrimitive + BitOr < Output = T > ,
{
type Output = Self ;
#[ inline ]
fn bitor ( self , rhs : Self ) -> Self ::Output {
// SAFETY: Bitwise OR of two non-zero values is still non-zero.
unsafe { Self ( self . get ( ) | rhs . get ( ) ) }
}
}
#[ stable(feature = " nonzero_bitor " , since = " 1.45.0 " ) ]
impl < T > BitOr < T > for NonZero < T >
where
T : ZeroablePrimitive + BitOr < Output = T > ,
{
type Output = Self ;
#[ inline ]
fn bitor ( self , rhs : T ) -> Self ::Output {
// SAFETY: Bitwise OR of a non-zero value with anything is still non-zero.
unsafe { Self ( self . get ( ) | rhs ) }
}
}
#[ stable(feature = " nonzero_bitor " , since = " 1.45.0 " ) ]
impl < T > BitOr < NonZero < T > > for T
where
T : ZeroablePrimitive + BitOr < Output = T > ,
{
type Output = NonZero < T > ;
#[ inline ]
fn bitor ( self , rhs : NonZero < T > ) -> Self ::Output {
// SAFETY: Bitwise OR of anything with a non-zero value is still non-zero.
unsafe { NonZero ( self | rhs . get ( ) ) }
}
}
#[ stable(feature = " nonzero_bitor " , since = " 1.45.0 " ) ]
impl < T > BitOrAssign for NonZero < T >
where
T : ZeroablePrimitive ,
Self : BitOr < Output = Self > ,
{
#[ inline ]
fn bitor_assign ( & mut self , rhs : Self ) {
* self = * self | rhs ;
}
}
#[ stable(feature = " nonzero_bitor " , since = " 1.45.0 " ) ]
impl < T > BitOrAssign < T > for NonZero < T >
where
T : ZeroablePrimitive ,
Self : BitOr < T , Output = Self > ,
{
#[ inline ]
fn bitor_assign ( & mut self , rhs : T ) {
* self = * self | rhs ;
}
}
2024-01-22 18:04:05 +01:00
impl < T > NonZero < T >
where
T : ZeroablePrimitive ,
{
/// Creates a non-zero if the given value is not zero.
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_int_methods " , since = " 1.47.0 " ) ]
#[ must_use ]
#[ inline ]
pub const fn new ( n : T ) -> Option < Self > {
// SAFETY: Memory layout optimization guarantees that `Option<NonZero<T>>` has
// the same layout and size as `T`, with `0` representing `None`.
2024-02-08 20:40:55 +01:00
unsafe { intrinsics ::transmute_unchecked ( n ) }
2024-01-22 18:04:05 +01:00
}
/// Creates a non-zero without checking whether the value is non-zero.
/// This results in undefined behaviour if the value is zero.
///
/// # Safety
///
/// The value must not be zero.
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
#[ rustc_const_stable(feature = " nonzero " , since = " 1.28.0 " ) ]
#[ must_use ]
#[ inline ]
pub const unsafe fn new_unchecked ( n : T ) -> Self {
match Self ::new ( n ) {
Some ( n ) = > n ,
None = > {
// SAFETY: The caller guarantees that `n` is non-zero, so this is unreachable.
unsafe {
2024-02-07 16:00:12 +01:00
intrinsics ::assert_unsafe_precondition! (
" NonZero::new_unchecked requires the argument to be non-zero " ,
( ) = > false ,
2024-01-22 18:04:05 +01:00
) ;
2024-02-07 16:00:12 +01:00
intrinsics ::unreachable ( )
2024-01-22 18:04:05 +01:00
}
}
}
}
/// Converts a reference to a non-zero mutable reference
/// if the referenced value is not zero.
#[ unstable(feature = " nonzero_from_mut " , issue = " 106290 " ) ]
#[ must_use ]
#[ inline ]
pub fn from_mut ( n : & mut T ) -> Option < & mut Self > {
// SAFETY: Memory layout optimization guarantees that `Option<NonZero<T>>` has
// the same layout and size as `T`, with `0` representing `None`.
let opt_n = unsafe { & mut * ( n as * mut T as * mut Option < Self > ) } ;
opt_n . as_mut ( )
}
/// Converts a mutable reference to a non-zero mutable reference
/// without checking whether the referenced value is non-zero.
/// This results in undefined behavior if the referenced value is zero.
///
/// # Safety
///
/// The referenced value must not be zero.
#[ unstable(feature = " nonzero_from_mut " , issue = " 106290 " ) ]
#[ must_use ]
#[ inline ]
pub unsafe fn from_mut_unchecked ( n : & mut T ) -> & mut Self {
match Self ::from_mut ( n ) {
Some ( n ) = > n ,
None = > {
// SAFETY: The caller guarantees that `n` references a value that is non-zero, so this is unreachable.
unsafe {
2024-02-07 16:00:12 +01:00
intrinsics ::assert_unsafe_precondition! (
2024-01-22 18:04:05 +01:00
" NonZero::from_mut_unchecked requires the argument to dereference as non-zero " ,
2024-02-07 16:00:12 +01:00
( ) = > false ,
2024-01-22 18:04:05 +01:00
) ;
2024-02-07 16:00:12 +01:00
intrinsics ::unreachable ( )
2024-01-22 18:04:05 +01:00
}
}
}
}
2024-02-01 23:41:19 +01:00
/// Returns the contained value as a primitive type.
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_get " , since = " 1.34.0 " ) ]
#[ inline ]
pub const fn get ( self ) -> T {
// FIXME: This can be changed to simply `self.0` once LLVM supports `!range` metadata
// for function arguments: https://github.com/llvm/llvm-project/issues/76628
//
// Rustc can set range metadata only if it loads `self` from
// memory somewhere. If the value of `self` was from by-value argument
// of some not-inlined function, LLVM don't have range metadata
// to understand that the value cannot be zero.
match Self ::new ( self . 0 ) {
Some ( Self ( n ) ) = > n ,
None = > {
// SAFETY: `NonZero` is guaranteed to only contain non-zero values, so this is unreachable.
unsafe { intrinsics ::unreachable ( ) }
}
}
}
2024-01-22 18:04:05 +01:00
}
2023-12-05 18:21:50 -08:00
macro_rules ! nonzero_integer {
(
2023-12-06 00:41:18 -08:00
#[ $stability:meta ]
2023-12-05 18:24:16 -08:00
Self = $Ty :ident ,
Primitive = $signedness :ident $Int :ident ,
2023-12-05 22:03:55 -08:00
$( UnsignedNonZero = $UnsignedNonZero :ident , ) ?
2023-12-05 21:37:28 -08:00
UnsignedPrimitive = $UnsignedPrimitive :ty ,
// Used in doc comments.
leading_zeros_test = $leading_zeros_test :expr ,
2023-12-05 18:21:50 -08:00
) = > {
2023-12-05 18:44:02 -08:00
/// An integer that is known not to equal zero.
///
/// This enables some memory layout optimization.
#[ doc = concat!( " For example, `Option< " , stringify!($Ty), " >` is the same size as ` " , stringify!($Int), " `: " ) ]
///
/// ```rust
/// use std::mem::size_of;
#[ doc = concat!( " assert_eq!(size_of::<Option<core::num:: " , stringify!($Ty), " >>(), size_of::< " , stringify!($Int), " >()); " ) ]
/// ```
///
/// # Layout
///
#[ doc = concat!( " ` " , stringify!($Ty), " ` is guaranteed to have the same layout and bit validity as ` " , stringify!($Int), " ` " ) ]
/// with the exception that `0` is not a valid instance.
#[ doc = concat!( " `Option< " , stringify!($Ty), " >` is guaranteed to be compatible with ` " , stringify!($Int), " `, " ) ]
/// including in FFI.
///
/// Thanks to the [null pointer optimization],
#[ doc = concat!( " ` " , stringify!($Ty), " ` and `Option< " , stringify!($Ty), " >` " ) ]
/// are guaranteed to have the same size and alignment:
///
/// ```
/// # use std::mem::{size_of, align_of};
#[ doc = concat!( " use std::num:: " , stringify!($Ty), " ; " ) ]
///
#[ doc = concat!( " assert_eq!(size_of::< " , stringify!($Ty), " >(), size_of::<Option< " , stringify!($Ty), " >>()); " ) ]
#[ doc = concat!( " assert_eq!(align_of::< " , stringify!($Ty), " >(), align_of::<Option< " , stringify!($Ty), " >>()); " ) ]
/// ```
///
/// [null pointer optimization]: crate::option#representation
2023-12-06 00:41:18 -08:00
#[ $stability ]
2024-01-20 18:02:56 +01:00
pub type $Ty = NonZero < $Int > ;
2023-12-05 18:44:02 -08:00
impl $Ty {
2023-12-05 22:52:20 -08:00
/// The size of this non-zero integer type in bits.
///
#[ doc = concat!( " This value is equal to [` " , stringify!($Int), " ::BITS`]. " ) ]
2020-11-17 23:57:29 +01:00
///
2023-12-05 22:52:20 -08:00
/// # Examples
2020-11-17 23:57:29 +01:00
///
/// ```
2023-12-05 22:52:20 -08:00
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
2022-03-09 13:53:16 -08:00
///
2023-12-05 22:52:20 -08:00
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::BITS, " , stringify!($Int), " ::BITS); " ) ]
/// ```
#[ stable(feature = " nonzero_bits " , since = " 1.67.0 " ) ]
pub const BITS : u32 = < $Int > ::BITS ;
2023-12-05 21:37:28 -08:00
/// Returns the number of leading zeros in the binary representation of `self`.
///
/// On many architectures, this function can perform better than `leading_zeros()` on the underlying integer type, as special handling of zero can be avoided.
2022-03-09 13:53:16 -08:00
///
2023-12-05 21:37:28 -08:00
/// # Examples
2023-08-15 02:11:10 -07:00
///
2023-12-05 21:37:28 -08:00
/// Basic usage:
2023-08-15 02:11:10 -07:00
///
/// ```
2023-12-06 00:41:18 -08:00
#[ doc = concat!( " let n = std::num:: " , stringify!($Ty), " ::new( " , $leading_zeros_test, " ).unwrap(); " ) ]
2023-08-15 02:11:10 -07:00
///
2023-12-05 21:37:28 -08:00
/// assert_eq!(n.leading_zeros(), 0);
2023-08-15 02:11:10 -07:00
/// ```
2023-12-05 21:37:28 -08:00
#[ stable(feature = " nonzero_leading_trailing_zeros " , since = " 1.53.0 " ) ]
#[ rustc_const_stable(feature = " nonzero_leading_trailing_zeros " , since = " 1.53.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
pub const fn leading_zeros ( self ) -> u32 {
// SAFETY: since `self` cannot be zero, it is safe to call `ctlz_nonzero`.
unsafe { intrinsics ::ctlz_nonzero ( self . get ( ) as $UnsignedPrimitive ) as u32 }
}
/// Returns the number of trailing zeros in the binary representation
/// of `self`.
2023-08-15 02:11:10 -07:00
///
2023-12-05 21:37:28 -08:00
/// On many architectures, this function can perform better than `trailing_zeros()` on the underlying integer type, as special handling of zero can be avoided.
///
/// # Examples
///
/// Basic usage:
///
/// ```
#[ doc = concat!( " let n = std::num:: " , stringify!($Ty), " ::new(0b0101000).unwrap(); " ) ]
///
/// assert_eq!(n.trailing_zeros(), 3);
/// ```
#[ stable(feature = " nonzero_leading_trailing_zeros " , since = " 1.53.0 " ) ]
#[ rustc_const_stable(feature = " nonzero_leading_trailing_zeros " , since = " 1.53.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
pub const fn trailing_zeros ( self ) -> u32 {
// SAFETY: since `self` cannot be zero, it is safe to call `cttz_nonzero`.
unsafe { intrinsics ::cttz_nonzero ( self . get ( ) as $UnsignedPrimitive ) as u32 }
}
2020-09-04 13:07:03 +00:00
2023-11-26 16:55:25 +00:00
/// Returns the number of ones in the binary representation of `self`.
///
/// # Examples
///
/// Basic usage:
///
/// ```
2024-02-18 21:29:24 +01:00
/// #![feature(generic_nonzero, non_zero_count_ones)]
2023-11-26 16:55:25 +00:00
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
2024-01-29 23:59:09 +01:00
/// # use std::num::*;
/// #
2024-02-18 21:29:24 +01:00
#[ doc = concat!( " let a = NonZero::< " , stringify!($Int), " >::new(0b100_0000)?; " ) ]
#[ doc = concat!( " let b = NonZero::< " , stringify!($Int), " >::new(0b100_0011)?; " ) ]
2023-11-26 16:55:25 +00:00
///
2024-02-18 21:29:24 +01:00
/// assert_eq!(a.count_ones(), NonZero::new(1)?);
/// assert_eq!(b.count_ones(), NonZero::new(3)?);
2023-11-26 16:55:25 +00:00
/// # Some(())
/// # }
/// ```
///
#[ unstable(feature = " non_zero_count_ones " , issue = " 120287 " ) ]
#[ rustc_const_unstable(feature = " non_zero_count_ones " , issue = " 120287 " ) ]
#[ doc(alias = " popcount " ) ]
#[ doc(alias = " popcnt " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline(always) ]
2024-02-18 21:29:24 +01:00
pub const fn count_ones ( self ) -> NonZero < u32 > {
2023-11-26 16:55:25 +00:00
// SAFETY:
// `self` is non-zero, which means it has at least one bit set, which means
// that the result of `count_ones` is non-zero.
2024-02-08 23:03:25 +01:00
unsafe { NonZero ::new_unchecked ( self . get ( ) . count_ones ( ) ) }
2023-11-26 16:55:25 +00:00
}
2020-09-04 13:07:03 +00:00
2023-12-05 22:03:55 -08:00
nonzero_integer_signedness_dependent_methods! {
Self = $Ty ,
Primitive = $signedness $Int ,
$( UnsignedNonZero = $UnsignedNonZero , ) ?
UnsignedPrimitive = $UnsignedPrimitive ,
}
2020-09-04 13:07:03 +00:00
2023-12-05 22:46:18 -08:00
/// Multiplies two non-zero integers together.
/// Checks for overflow and returns [`None`] on overflow.
/// As a consequence, the result cannot wrap to zero.
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let two = " , stringify!($Ty), " ::new(2)?; " ) ]
#[ doc = concat!( " let four = " , stringify!($Ty), " ::new(4)?; " ) ]
#[ doc = concat!( " let max = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MAX)?; " ) ]
///
/// assert_eq!(Some(four), two.checked_mul(two));
/// assert_eq!(None, max.checked_mul(two));
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn checked_mul ( self , other : Self ) -> Option < Self > {
2023-12-05 22:46:18 -08:00
if let Some ( result ) = self . get ( ) . checked_mul ( other . get ( ) ) {
// SAFETY:
// - `checked_mul` returns `None` on overflow
// - `self` and `other` are non-zero
// - the only way to get zero from a multiplication without overflow is for one
// of the sides to be zero
2023-12-30 20:51:53 +01:00
//
2023-12-05 22:46:18 -08:00
// So the result cannot be zero.
2024-01-22 18:30:54 +01:00
Some ( unsafe { Self ::new_unchecked ( result ) } )
2023-12-05 22:46:18 -08:00
} else {
None
2020-09-04 13:07:03 +00:00
}
2023-12-05 22:46:18 -08:00
}
2020-09-04 13:07:03 +00:00
2023-12-05 22:46:18 -08:00
/// Multiplies two non-zero integers together.
#[ doc = concat!( " Return [` " , stringify!($Ty), " ::MAX`] on overflow. " ) ]
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let two = " , stringify!($Ty), " ::new(2)?; " ) ]
#[ doc = concat!( " let four = " , stringify!($Ty), " ::new(4)?; " ) ]
#[ doc = concat!( " let max = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MAX)?; " ) ]
///
/// assert_eq!(four, two.saturating_mul(two));
/// assert_eq!(max, four.saturating_mul(max));
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn saturating_mul ( self , other : Self ) -> Self {
2023-12-05 22:46:18 -08:00
// SAFETY:
// - `saturating_mul` returns `u*::MAX`/`i*::MAX`/`i*::MIN` on overflow/underflow,
// all of which are non-zero
// - `self` and `other` are non-zero
// - the only way to get zero from a multiplication without overflow is for one
// of the sides to be zero
//
// So the result cannot be zero.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( self . get ( ) . saturating_mul ( other . get ( ) ) ) }
2020-09-04 13:07:03 +00:00
}
2023-12-05 22:46:18 -08:00
/// Multiplies two non-zero integers together,
/// assuming overflow cannot occur.
/// Overflow is unchecked, and it is undefined behaviour to overflow
/// *even if the result would wrap to a non-zero value*.
/// The behaviour is undefined as soon as
#[ doc = sign_dependent_expr!{
$signedness ?
if signed {
concat! ( " `self * rhs > " , stringify! ( $Int ) , " ::MAX`, " ,
" or `self * rhs < " , stringify! ( $Int ) , " ::MIN`. " )
2020-09-04 13:07:03 +00:00
}
2023-12-05 22:46:18 -08:00
if unsigned {
concat! ( " `self * rhs > " , stringify! ( $Int ) , " ::MAX`. " )
}
} ]
///
/// # Examples
///
/// ```
/// #![feature(nonzero_ops)]
///
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let two = " , stringify!($Ty), " ::new(2)?; " ) ]
#[ doc = concat!( " let four = " , stringify!($Ty), " ::new(4)?; " ) ]
///
/// assert_eq!(four, unsafe { two.unchecked_mul(two) });
/// # Some(())
/// # }
/// ```
#[ unstable(feature = " nonzero_ops " , issue = " 84186 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const unsafe fn unchecked_mul ( self , other : Self ) -> Self {
2023-12-05 22:46:18 -08:00
// SAFETY: The caller ensures there is no overflow.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( self . get ( ) . unchecked_mul ( other . get ( ) ) ) }
2020-09-04 13:07:03 +00:00
}
2023-12-05 22:46:18 -08:00
/// Raises non-zero value to an integer power.
/// Checks for overflow and returns [`None`] on overflow.
/// As a consequence, the result cannot wrap to zero.
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let three = " , stringify!($Ty), " ::new(3)?; " ) ]
#[ doc = concat!( " let twenty_seven = " , stringify!($Ty), " ::new(27)?; " ) ]
#[ doc = concat!( " let half_max = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MAX / 2)?; " ) ]
///
/// assert_eq!(Some(twenty_seven), three.checked_pow(3));
/// assert_eq!(None, half_max.checked_pow(3));
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn checked_pow ( self , other : u32 ) -> Option < Self > {
2023-12-05 22:46:18 -08:00
if let Some ( result ) = self . get ( ) . checked_pow ( other ) {
// SAFETY:
// - `checked_pow` returns `None` on overflow/underflow
// - `self` is non-zero
// - the only way to get zero from an exponentiation without overflow is
// for base to be zero
//
// So the result cannot be zero.
2024-01-22 18:30:54 +01:00
Some ( unsafe { Self ::new_unchecked ( result ) } )
2023-12-05 22:46:18 -08:00
} else {
None
2020-09-04 13:07:03 +00:00
}
}
2023-12-05 22:46:18 -08:00
/// Raise non-zero value to an integer power.
#[ doc = sign_dependent_expr!{
$signedness ?
if signed {
concat! ( " Return [` " , stringify! ( $Ty ) , " ::MIN`] " ,
" or [` " , stringify! ( $Ty ) , " ::MAX`] on overflow. " )
2020-09-04 13:07:03 +00:00
}
2023-12-05 22:46:18 -08:00
if unsigned {
concat! ( " Return [` " , stringify! ( $Ty ) , " ::MAX`] on overflow. " )
}
} ]
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let three = " , stringify!($Ty), " ::new(3)?; " ) ]
#[ doc = concat!( " let twenty_seven = " , stringify!($Ty), " ::new(27)?; " ) ]
#[ doc = concat!( " let max = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MAX)?; " ) ]
///
/// assert_eq!(twenty_seven, three.saturating_pow(3));
/// assert_eq!(max, max.saturating_pow(3));
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn saturating_pow ( self , other : u32 ) -> Self {
2023-12-05 22:46:18 -08:00
// SAFETY:
// - `saturating_pow` returns `u*::MAX`/`i*::MAX`/`i*::MIN` on overflow/underflow,
// all of which are non-zero
// - `self` is non-zero
// - the only way to get zero from an exponentiation without overflow is
// for base to be zero
//
// So the result cannot be zero.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( self . get ( ) . saturating_pow ( other ) ) }
2020-09-04 13:07:03 +00:00
}
2023-12-05 18:44:02 -08:00
}
2020-09-04 13:07:03 +00:00
#[ stable(feature = " nonzero_parse " , since = " 1.35.0 " ) ]
2023-12-05 18:28:52 -08:00
impl FromStr for $Ty {
2020-09-04 13:07:03 +00:00
type Err = ParseIntError ;
fn from_str ( src : & str ) -> Result < Self , Self ::Err > {
Self ::new ( from_str_radix ( src , 10 ) ? )
. ok_or ( ParseIntError {
kind : IntErrorKind ::Zero
} )
}
}
2020-11-17 19:29:15 +01:00
2023-12-05 21:50:14 -08:00
nonzero_integer_signedness_dependent_impls! ( $Ty $signedness $Int ) ;
2023-12-05 18:28:52 -08:00
} ;
2020-11-17 19:29:15 +01:00
2023-12-06 00:41:18 -08:00
( Self = $Ty :ident , Primitive = unsigned $Int :ident $(, ) ? ) = > {
nonzero_integer! {
#[ stable(feature = " nonzero " , since = " 1.28.0 " ) ]
Self = $Ty ,
Primitive = unsigned $Int ,
UnsignedPrimitive = $Int ,
leading_zeros_test = concat! ( stringify! ( $Int ) , " ::MAX " ) ,
}
} ;
2020-11-17 19:29:15 +01:00
2023-12-06 00:41:18 -08:00
( Self = $Ty :ident , Primitive = signed $Int :ident , $( $rest :tt ) * ) = > {
nonzero_integer! {
#[ stable(feature = " signed_nonzero " , since = " 1.34.0 " ) ]
Self = $Ty ,
Primitive = signed $Int ,
$( $rest ) *
leading_zeros_test = concat! ( " -1 " , stringify! ( $Int ) ) ,
}
} ;
2020-11-17 19:29:15 +01:00
}
2020-11-16 15:38:22 +02:00
2023-12-05 21:50:14 -08:00
macro_rules ! nonzero_integer_signedness_dependent_impls {
// Impls for unsigned nonzero types only.
2023-12-05 18:41:24 -08:00
( $Ty :ident unsigned $Int :ty ) = > {
2023-12-05 21:07:42 -08:00
#[ stable(feature = " nonzero_div " , since = " 1.51.0 " ) ]
impl Div < $Ty > for $Int {
type Output = $Int ;
2024-01-22 18:30:54 +01:00
2023-12-05 21:07:42 -08:00
/// This operation rounds towards zero,
/// truncating any fractional part of the exact result, and cannot panic.
#[ inline ]
fn div ( self , other : $Ty ) -> $Int {
// SAFETY: div by zero is checked because `other` is a nonzero,
// and MIN/-1 is checked because `self` is an unsigned int.
2024-02-07 16:00:12 +01:00
unsafe { intrinsics ::unchecked_div ( self , other . get ( ) ) }
2020-11-16 15:38:22 +02:00
}
2023-12-05 21:07:42 -08:00
}
2020-11-18 07:48:03 +02:00
2023-12-05 21:07:42 -08:00
#[ stable(feature = " nonzero_div " , since = " 1.51.0 " ) ]
impl Rem < $Ty > for $Int {
type Output = $Int ;
2024-01-22 18:30:54 +01:00
2023-12-05 21:07:42 -08:00
/// This operation satisfies `n % d == n - (n / d) * d`, and cannot panic.
#[ inline ]
fn rem ( self , other : $Ty ) -> $Int {
// SAFETY: rem by zero is checked because `other` is a nonzero,
// and MIN/-1 is checked because `self` is an unsigned int.
2024-02-07 16:00:12 +01:00
unsafe { intrinsics ::unchecked_rem ( self , other . get ( ) ) }
2020-11-18 07:48:03 +02:00
}
2023-12-05 21:07:42 -08:00
}
2023-12-05 18:41:24 -08:00
} ;
2022-01-15 17:14:13 -08:00
2023-12-05 21:50:14 -08:00
// Impls for signed nonzero types only.
( $Ty :ident signed $Int :ty ) = > {
#[ stable(feature = " signed_nonzero_neg " , since = " 1.71.0 " ) ]
impl Neg for $Ty {
2024-01-22 18:30:54 +01:00
type Output = Self ;
2022-02-11 12:55:25 +01:00
2023-12-05 21:50:14 -08:00
#[ inline ]
2024-01-22 18:30:54 +01:00
fn neg ( self ) -> Self {
2023-12-05 21:50:14 -08:00
// SAFETY: negation of nonzero cannot yield zero values.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( self . get ( ) . neg ( ) ) }
2021-04-15 12:10:05 +02:00
}
2023-12-05 21:50:14 -08:00
}
2021-04-15 12:10:05 +02:00
2023-12-05 21:50:14 -08:00
forward_ref_unop! { impl Neg , neg for $Ty ,
#[ stable(feature = " signed_nonzero_neg " , since = " 1.71.0 " ) ] }
} ;
2021-04-15 12:10:05 +02:00
}
2023-12-05 22:38:38 -08:00
#[ rustfmt::skip ] // https://github.com/rust-lang/rustfmt/issues/5974
2023-12-05 22:03:55 -08:00
macro_rules ! nonzero_integer_signedness_dependent_methods {
2023-12-05 22:49:44 -08:00
// Associated items for unsigned nonzero types only.
2023-12-05 22:03:55 -08:00
(
Self = $Ty :ident ,
Primitive = unsigned $Int :ident ,
UnsignedPrimitive = $Uint :ty ,
) = > {
2023-12-05 22:49:44 -08:00
/// The smallest value that can be represented by this non-zero
/// integer type, 1.
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::MIN.get(), 1 " , stringify!($Int), " ); " ) ]
/// ```
#[ stable(feature = " nonzero_min_max " , since = " 1.70.0 " ) ]
pub const MIN : Self = Self ::new ( 1 ) . unwrap ( ) ;
/// The largest value that can be represented by this non-zero
/// integer type,
#[ doc = concat!( " equal to [` " , stringify!($Int), " ::MAX`]. " ) ]
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::MAX.get(), " , stringify!($Int), " ::MAX); " ) ]
/// ```
#[ stable(feature = " nonzero_min_max " , since = " 1.70.0 " ) ]
pub const MAX : Self = Self ::new ( < $Int > ::MAX ) . unwrap ( ) ;
2023-12-05 22:06:40 -08:00
/// Adds an unsigned integer to a non-zero value.
/// Checks for overflow and returns [`None`] on overflow.
/// As a consequence, the result cannot wrap to zero.
///
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let one = " , stringify!($Ty), " ::new(1)?; " ) ]
#[ doc = concat!( " let two = " , stringify!($Ty), " ::new(2)?; " ) ]
#[ doc = concat!( " let max = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MAX)?; " ) ]
///
/// assert_eq!(Some(two), one.checked_add(1));
/// assert_eq!(None, max.checked_add(1));
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn checked_add ( self , other : $Int ) -> Option < Self > {
2023-12-05 22:06:40 -08:00
if let Some ( result ) = self . get ( ) . checked_add ( other ) {
// SAFETY:
// - `checked_add` returns `None` on overflow
// - `self` is non-zero
// - the only way to get zero from an addition without overflow is for both
// sides to be zero
//
// So the result cannot be zero.
2024-01-22 18:30:54 +01:00
Some ( unsafe { Self ::new_unchecked ( result ) } )
2023-12-05 22:06:40 -08:00
} else {
None
}
}
2021-04-15 12:23:02 +02:00
2023-12-05 22:06:40 -08:00
/// Adds an unsigned integer to a non-zero value.
#[ doc = concat!( " Return [` " , stringify!($Ty), " ::MAX`] on overflow. " ) ]
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let one = " , stringify!($Ty), " ::new(1)?; " ) ]
#[ doc = concat!( " let two = " , stringify!($Ty), " ::new(2)?; " ) ]
#[ doc = concat!( " let max = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MAX)?; " ) ]
///
/// assert_eq!(two, one.saturating_add(1));
/// assert_eq!(max, max.saturating_add(1));
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn saturating_add ( self , other : $Int ) -> Self {
2023-12-05 22:06:40 -08:00
// SAFETY:
// - `saturating_add` returns `u*::MAX` on overflow, which is non-zero
// - `self` is non-zero
// - the only way to get zero from an addition without overflow is for both
// sides to be zero
//
// So the result cannot be zero.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( self . get ( ) . saturating_add ( other ) ) }
2023-12-05 22:06:40 -08:00
}
2021-04-15 12:25:13 +02:00
2023-12-05 22:06:40 -08:00
/// Adds an unsigned integer to a non-zero value,
/// assuming overflow cannot occur.
/// Overflow is unchecked, and it is undefined behaviour to overflow
/// *even if the result would wrap to a non-zero value*.
/// The behaviour is undefined as soon as
#[ doc = concat!( " `self + rhs > " , stringify!($Int), " ::MAX`. " ) ]
///
/// # Examples
///
/// ```
/// #![feature(nonzero_ops)]
///
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let one = " , stringify!($Ty), " ::new(1)?; " ) ]
#[ doc = concat!( " let two = " , stringify!($Ty), " ::new(2)?; " ) ]
///
/// assert_eq!(two, unsafe { one.unchecked_add(1) });
/// # Some(())
/// # }
/// ```
#[ unstable(feature = " nonzero_ops " , issue = " 84186 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const unsafe fn unchecked_add ( self , other : $Int ) -> Self {
2023-12-05 22:06:40 -08:00
// SAFETY: The caller ensures there is no overflow.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( self . get ( ) . unchecked_add ( other ) ) }
2023-12-05 22:06:40 -08:00
}
2021-04-15 12:26:39 +02:00
2023-12-05 22:06:40 -08:00
/// Returns the smallest power of two greater than or equal to n.
/// Checks for overflow and returns [`None`]
/// if the next power of two is greater than the type’ s maximum value.
/// As a consequence, the result cannot wrap to zero.
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let two = " , stringify!($Ty), " ::new(2)?; " ) ]
#[ doc = concat!( " let three = " , stringify!($Ty), " ::new(3)?; " ) ]
#[ doc = concat!( " let four = " , stringify!($Ty), " ::new(4)?; " ) ]
#[ doc = concat!( " let max = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MAX)?; " ) ]
///
/// assert_eq!(Some(two), two.checked_next_power_of_two() );
/// assert_eq!(Some(four), three.checked_next_power_of_two() );
/// assert_eq!(None, max.checked_next_power_of_two() );
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn checked_next_power_of_two ( self ) -> Option < Self > {
2023-12-05 22:06:40 -08:00
if let Some ( nz ) = self . get ( ) . checked_next_power_of_two ( ) {
// SAFETY: The next power of two is positive
// and overflow is checked.
2024-01-22 18:30:54 +01:00
Some ( unsafe { Self ::new_unchecked ( nz ) } )
2023-12-05 22:06:40 -08:00
} else {
None
}
}
2022-09-18 10:51:36 +09:00
2023-12-05 22:06:40 -08:00
/// Returns the base 2 logarithm of the number, rounded down.
///
/// This is the same operation as
#[ doc = concat!( " [` " , stringify!($Int), " ::ilog2`], " ) ]
/// except that it has no failure cases to worry about
/// since this value can never be zero.
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::new(7).unwrap().ilog2(), 2); " ) ]
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::new(8).unwrap().ilog2(), 3); " ) ]
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::new(9).unwrap().ilog2(), 3); " ) ]
/// ```
#[ stable(feature = " int_log " , since = " 1.67.0 " ) ]
#[ rustc_const_stable(feature = " int_log " , since = " 1.67.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
pub const fn ilog2 ( self ) -> u32 {
Self ::BITS - 1 - self . leading_zeros ( )
}
2023-05-04 19:37:33 +09:00
2023-12-05 22:06:40 -08:00
/// Returns the base 10 logarithm of the number, rounded down.
///
/// This is the same operation as
#[ doc = concat!( " [` " , stringify!($Int), " ::ilog10`], " ) ]
/// except that it has no failure cases to worry about
/// since this value can never be zero.
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::new(99).unwrap().ilog10(), 1); " ) ]
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::new(100).unwrap().ilog10(), 2); " ) ]
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::new(101).unwrap().ilog10(), 2); " ) ]
/// ```
#[ stable(feature = " int_log " , since = " 1.67.0 " ) ]
#[ rustc_const_stable(feature = " int_log " , since = " 1.67.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
pub const fn ilog10 ( self ) -> u32 {
super ::int_log10 ::$Int ( self . get ( ) )
}
2022-09-18 10:51:36 +09:00
2023-12-05 22:06:40 -08:00
/// Calculates the middle point of `self` and `rhs`.
///
/// `midpoint(a, b)` is `(a + b) >> 1` as if it were performed in a
/// sufficiently-large signed integral type. This implies that the result is
/// always rounded towards negative infinity and that no overflow will ever occur.
///
/// # Examples
///
/// ```
/// #![feature(num_midpoint)]
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
///
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let one = " , stringify!($Ty), " ::new(1)?; " ) ]
#[ doc = concat!( " let two = " , stringify!($Ty), " ::new(2)?; " ) ]
#[ doc = concat!( " let four = " , stringify!($Ty), " ::new(4)?; " ) ]
///
/// assert_eq!(one.midpoint(four), two);
/// assert_eq!(four.midpoint(one), two);
/// # Some(())
/// # }
/// ```
#[ unstable(feature = " num_midpoint " , issue = " 110840 " ) ]
#[ rustc_const_unstable(feature = " const_num_midpoint " , issue = " 110840 " ) ]
#[ rustc_allow_const_fn_unstable(const_num_midpoint) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
pub const fn midpoint ( self , rhs : Self ) -> Self {
// SAFETY: The only way to get `0` with midpoint is to have two opposite or
// near opposite numbers: (-5, 5), (0, 1), (0, 0) which is impossible because
2024-01-22 18:30:54 +01:00
// of the unsignedness of this number and also because `Self` is guaranteed to
2023-12-05 22:06:40 -08:00
// never being 0.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( self . get ( ) . midpoint ( rhs . get ( ) ) ) }
2023-12-05 22:06:40 -08:00
}
2022-09-18 10:51:36 +09:00
2023-12-05 22:47:53 -08:00
/// Returns `true` if and only if `self == (1 << k)` for some `k`.
///
/// On many architectures, this function can perform better than `is_power_of_two()`
/// on the underlying integer type, as special handling of zero can be avoided.
///
/// # Examples
///
/// Basic usage:
///
/// ```
#[ doc = concat!( " let eight = std::num:: " , stringify!($Ty), " ::new(8).unwrap(); " ) ]
/// assert!(eight.is_power_of_two());
#[ doc = concat!( " let ten = std::num:: " , stringify!($Ty), " ::new(10).unwrap(); " ) ]
/// assert!(!ten.is_power_of_two());
/// ```
#[ must_use ]
#[ stable(feature = " nonzero_is_power_of_two " , since = " 1.59.0 " ) ]
#[ rustc_const_stable(feature = " nonzero_is_power_of_two " , since = " 1.59.0 " ) ]
#[ inline ]
pub const fn is_power_of_two ( self ) -> bool {
// LLVM 11 normalizes `unchecked_sub(x, 1) & x == 0` to the implementation seen here.
// On the basic x86-64 target, this saves 3 instructions for the zero check.
// On x86_64 with BMI1, being nonzero lets it codegen to `BLSR`, which saves an instruction
// compared to the `POPCNT` implementation on the underlying integer type.
intrinsics ::ctpop ( self . get ( ) ) < 2
}
2023-12-05 22:03:55 -08:00
} ;
2022-09-18 10:51:36 +09:00
2023-12-05 22:50:31 -08:00
// Associated items for signed nonzero types only.
2023-12-05 22:03:55 -08:00
(
Self = $Ty :ident ,
Primitive = signed $Int :ident ,
UnsignedNonZero = $Uty :ident ,
UnsignedPrimitive = $Uint :ty ,
) = > {
2023-12-05 22:50:31 -08:00
/// The smallest value that can be represented by this non-zero
/// integer type,
#[ doc = concat!( " equal to [` " , stringify!($Int), " ::MIN`]. " ) ]
///
/// Note: While most integer types are defined for every whole
/// number between `MIN` and `MAX`, signed non-zero integers are
/// a special case. They have a "gap" at 0.
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::MIN.get(), " , stringify!($Int), " ::MIN); " ) ]
/// ```
#[ stable(feature = " nonzero_min_max " , since = " 1.70.0 " ) ]
pub const MIN : Self = Self ::new ( < $Int > ::MIN ) . unwrap ( ) ;
/// The largest value that can be represented by this non-zero
/// integer type,
#[ doc = concat!( " equal to [` " , stringify!($Int), " ::MAX`]. " ) ]
///
/// Note: While most integer types are defined for every whole
/// number between `MIN` and `MAX`, signed non-zero integers are
/// a special case. They have a "gap" at 0.
///
/// # Examples
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
#[ doc = concat!( " assert_eq!( " , stringify!($Ty), " ::MAX.get(), " , stringify!($Int), " ::MAX); " ) ]
/// ```
#[ stable(feature = " nonzero_min_max " , since = " 1.70.0 " ) ]
pub const MAX : Self = Self ::new ( < $Int > ::MAX ) . unwrap ( ) ;
2023-12-05 22:06:40 -08:00
/// Computes the absolute value of self.
#[ doc = concat!( " See [` " , stringify!($Int), " ::abs`] " ) ]
/// for documentation on overflow behaviour.
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos = " , stringify!($Ty), " ::new(1)?; " ) ]
#[ doc = concat!( " let neg = " , stringify!($Ty), " ::new(-1)?; " ) ]
///
/// assert_eq!(pos, pos.abs());
/// assert_eq!(pos, neg.abs());
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn abs ( self ) -> Self {
2023-12-05 22:06:40 -08:00
// SAFETY: This cannot overflow to zero.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( self . get ( ) . abs ( ) ) }
2023-12-05 22:06:40 -08:00
}
2022-09-18 10:51:36 +09:00
2023-12-05 22:06:40 -08:00
/// Checked absolute value.
/// Checks for overflow and returns [`None`] if
#[ doc = concat!( " `self == " , stringify!($Ty), " ::MIN`. " ) ]
/// The result cannot be zero.
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos = " , stringify!($Ty), " ::new(1)?; " ) ]
#[ doc = concat!( " let neg = " , stringify!($Ty), " ::new(-1)?; " ) ]
#[ doc = concat!( " let min = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN)?; " ) ]
///
/// assert_eq!(Some(pos), neg.checked_abs());
/// assert_eq!(None, min.checked_abs());
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn checked_abs ( self ) -> Option < Self > {
2023-12-05 22:06:40 -08:00
if let Some ( nz ) = self . get ( ) . checked_abs ( ) {
// SAFETY: absolute value of nonzero cannot yield zero values.
2024-01-22 18:30:54 +01:00
Some ( unsafe { Self ::new_unchecked ( nz ) } )
2023-12-05 22:06:40 -08:00
} else {
None
2021-04-15 12:18:04 +02:00
}
2023-12-05 22:06:40 -08:00
}
2022-09-27 11:40:39 +09:00
2023-12-05 22:06:40 -08:00
/// Computes the absolute value of self,
/// with overflow information, see
#[ doc = concat!( " [` " , stringify!($Int), " ::overflowing_abs`]. " ) ]
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos = " , stringify!($Ty), " ::new(1)?; " ) ]
#[ doc = concat!( " let neg = " , stringify!($Ty), " ::new(-1)?; " ) ]
#[ doc = concat!( " let min = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN)?; " ) ]
///
/// assert_eq!((pos, false), pos.overflowing_abs());
/// assert_eq!((pos, false), neg.overflowing_abs());
/// assert_eq!((min, true), min.overflowing_abs());
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn overflowing_abs ( self ) -> ( Self , bool ) {
2023-12-05 22:06:40 -08:00
let ( nz , flag ) = self . get ( ) . overflowing_abs ( ) ;
(
// SAFETY: absolute value of nonzero cannot yield zero values.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( nz ) } ,
2023-12-05 22:06:40 -08:00
flag ,
)
}
2022-09-27 11:40:39 +09:00
2023-12-05 22:06:40 -08:00
/// Saturating absolute value, see
#[ doc = concat!( " [` " , stringify!($Int), " ::saturating_abs`]. " ) ]
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos = " , stringify!($Ty), " ::new(1)?; " ) ]
#[ doc = concat!( " let neg = " , stringify!($Ty), " ::new(-1)?; " ) ]
#[ doc = concat!( " let min = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN)?; " ) ]
#[ doc = concat!( " let min_plus = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN + 1)?; " ) ]
#[ doc = concat!( " let max = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MAX)?; " ) ]
///
/// assert_eq!(pos, pos.saturating_abs());
/// assert_eq!(pos, neg.saturating_abs());
/// assert_eq!(max, min.saturating_abs());
/// assert_eq!(max, min_plus.saturating_abs());
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn saturating_abs ( self ) -> Self {
2023-12-05 22:06:40 -08:00
// SAFETY: absolute value of nonzero cannot yield zero values.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( self . get ( ) . saturating_abs ( ) ) }
2023-12-05 22:06:40 -08:00
}
2022-09-27 11:40:39 +09:00
2023-12-05 22:06:40 -08:00
/// Wrapping absolute value, see
#[ doc = concat!( " [` " , stringify!($Int), " ::wrapping_abs`]. " ) ]
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos = " , stringify!($Ty), " ::new(1)?; " ) ]
#[ doc = concat!( " let neg = " , stringify!($Ty), " ::new(-1)?; " ) ]
#[ doc = concat!( " let min = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN)?; " ) ]
#[ doc = concat!( " # let max = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MAX)?; " ) ]
///
/// assert_eq!(pos, pos.wrapping_abs());
/// assert_eq!(pos, neg.wrapping_abs());
/// assert_eq!(min, min.wrapping_abs());
/// assert_eq!(max, (-max).wrapping_abs());
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
2024-01-22 18:30:54 +01:00
pub const fn wrapping_abs ( self ) -> Self {
2023-12-05 22:06:40 -08:00
// SAFETY: absolute value of nonzero cannot yield zero values.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( self . get ( ) . wrapping_abs ( ) ) }
2023-12-05 22:06:40 -08:00
}
2021-04-15 12:18:04 +02:00
2023-12-05 22:06:40 -08:00
/// Computes the absolute value of self
/// without any wrapping or panicking.
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
#[ doc = concat!( " # use std::num:: " , stringify!($Uty), " ; " ) ]
///
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let u_pos = " , stringify!($Uty), " ::new(1)?; " ) ]
#[ doc = concat!( " let i_pos = " , stringify!($Ty), " ::new(1)?; " ) ]
#[ doc = concat!( " let i_neg = " , stringify!($Ty), " ::new(-1)?; " ) ]
#[ doc = concat!( " let i_min = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN)?; " ) ]
#[ doc = concat!( " let u_max = " , stringify!($Uty), " ::new( " ,
stringify! ( $Uint ) , " ::MAX / 2 + 1)?; " ) ]
///
/// assert_eq!(u_pos, i_pos.unsigned_abs());
/// assert_eq!(u_pos, i_neg.unsigned_abs());
/// assert_eq!(u_max, i_min.unsigned_abs());
/// # Some(())
/// # }
/// ```
#[ stable(feature = " nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ rustc_const_stable(feature = " const_nonzero_checked_ops " , since = " 1.64.0 " ) ]
#[ must_use = " this returns the result of the operation, \
without modifying the original " ]
#[ inline ]
pub const fn unsigned_abs ( self ) -> $Uty {
// SAFETY: absolute value of nonzero cannot yield zero values.
unsafe { $Uty ::new_unchecked ( self . get ( ) . unsigned_abs ( ) ) }
}
2021-04-15 12:18:04 +02:00
2023-12-05 22:06:40 -08:00
/// Returns `true` if `self` is positive and `false` if the
/// number is negative.
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos_five = " , stringify!($Ty), " ::new(5)?; " ) ]
#[ doc = concat!( " let neg_five = " , stringify!($Ty), " ::new(-5)?; " ) ]
///
/// assert!(pos_five.is_positive());
/// assert!(!neg_five.is_positive());
/// # Some(())
/// # }
/// ```
#[ must_use ]
#[ inline ]
#[ stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
#[ rustc_const_stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
pub const fn is_positive ( self ) -> bool {
self . get ( ) . is_positive ( )
}
2021-04-15 12:30:13 +02:00
2023-12-05 22:06:40 -08:00
/// Returns `true` if `self` is negative and `false` if the
/// number is positive.
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos_five = " , stringify!($Ty), " ::new(5)?; " ) ]
#[ doc = concat!( " let neg_five = " , stringify!($Ty), " ::new(-5)?; " ) ]
///
/// assert!(neg_five.is_negative());
/// assert!(!pos_five.is_negative());
/// # Some(())
/// # }
/// ```
#[ must_use ]
#[ inline ]
#[ stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
#[ rustc_const_stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
pub const fn is_negative ( self ) -> bool {
self . get ( ) . is_negative ( )
}
2021-04-15 12:31:32 +02:00
2023-12-05 22:06:40 -08:00
/// Checked negation. Computes `-self`,
#[ doc = concat!( " returning `None` if `self == " , stringify!($Ty), " ::MIN`. " ) ]
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos_five = " , stringify!($Ty), " ::new(5)?; " ) ]
#[ doc = concat!( " let neg_five = " , stringify!($Ty), " ::new(-5)?; " ) ]
#[ doc = concat!( " let min = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN)?; " ) ]
///
/// assert_eq!(pos_five.checked_neg(), Some(neg_five));
/// assert_eq!(min.checked_neg(), None);
/// # Some(())
/// # }
/// ```
#[ inline ]
#[ stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
#[ rustc_const_stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
2024-01-22 18:30:54 +01:00
pub const fn checked_neg ( self ) -> Option < Self > {
2023-12-05 22:06:40 -08:00
if let Some ( result ) = self . get ( ) . checked_neg ( ) {
// SAFETY: negation of nonzero cannot yield zero values.
2024-01-22 18:30:54 +01:00
return Some ( unsafe { Self ::new_unchecked ( result ) } ) ;
2023-12-05 22:06:40 -08:00
}
None
}
2021-04-15 12:32:48 +02:00
2023-12-05 22:06:40 -08:00
/// Negates self, overflowing if this is equal to the minimum value.
///
#[ doc = concat!( " See [` " , stringify!($Int), " ::overflowing_neg`] " ) ]
/// for documentation on overflow behaviour.
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos_five = " , stringify!($Ty), " ::new(5)?; " ) ]
#[ doc = concat!( " let neg_five = " , stringify!($Ty), " ::new(-5)?; " ) ]
#[ doc = concat!( " let min = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN)?; " ) ]
///
/// assert_eq!(pos_five.overflowing_neg(), (neg_five, false));
/// assert_eq!(min.overflowing_neg(), (min, true));
/// # Some(())
/// # }
/// ```
#[ inline ]
#[ stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
#[ rustc_const_stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
2024-01-22 18:30:54 +01:00
pub const fn overflowing_neg ( self ) -> ( Self , bool ) {
2023-12-05 22:06:40 -08:00
let ( result , overflow ) = self . get ( ) . overflowing_neg ( ) ;
// SAFETY: negation of nonzero cannot yield zero values.
2024-01-22 18:30:54 +01:00
( ( unsafe { Self ::new_unchecked ( result ) } ) , overflow )
2023-12-05 22:06:40 -08:00
}
2021-04-15 12:34:03 +02:00
2023-12-05 22:06:40 -08:00
/// Saturating negation. Computes `-self`,
#[ doc = concat!( " returning [` " , stringify!($Ty), " ::MAX`] " ) ]
#[ doc = concat!( " if `self == " , stringify!($Ty), " ::MIN` " ) ]
/// instead of overflowing.
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos_five = " , stringify!($Ty), " ::new(5)?; " ) ]
#[ doc = concat!( " let neg_five = " , stringify!($Ty), " ::new(-5)?; " ) ]
#[ doc = concat!( " let min = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN)?; " ) ]
#[ doc = concat!( " let min_plus_one = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN + 1)?; " ) ]
#[ doc = concat!( " let max = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MAX)?; " ) ]
///
/// assert_eq!(pos_five.saturating_neg(), neg_five);
/// assert_eq!(min.saturating_neg(), max);
/// assert_eq!(max.saturating_neg(), min_plus_one);
/// # Some(())
/// # }
/// ```
#[ inline ]
#[ stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
#[ rustc_const_stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
2024-01-22 18:30:54 +01:00
pub const fn saturating_neg ( self ) -> Self {
2023-12-05 22:06:40 -08:00
if let Some ( result ) = self . checked_neg ( ) {
return result ;
2021-04-15 12:28:45 +02:00
}
2024-01-22 18:30:54 +01:00
Self ::MAX
2023-12-05 22:06:40 -08:00
}
2022-09-18 10:51:36 +09:00
2023-12-05 22:06:40 -08:00
/// Wrapping (modular) negation. Computes `-self`, wrapping around at the boundary
/// of the type.
///
#[ doc = concat!( " See [` " , stringify!($Int), " ::wrapping_neg`] " ) ]
/// for documentation on overflow behaviour.
///
/// # Example
///
/// ```
#[ doc = concat!( " # use std::num:: " , stringify!($Ty), " ; " ) ]
/// # fn main() { test().unwrap(); }
/// # fn test() -> Option<()> {
#[ doc = concat!( " let pos_five = " , stringify!($Ty), " ::new(5)?; " ) ]
#[ doc = concat!( " let neg_five = " , stringify!($Ty), " ::new(-5)?; " ) ]
#[ doc = concat!( " let min = " , stringify!($Ty), " ::new( " ,
stringify! ( $Int ) , " ::MIN)?; " ) ]
///
/// assert_eq!(pos_five.wrapping_neg(), neg_five);
/// assert_eq!(min.wrapping_neg(), min);
/// # Some(())
/// # }
/// ```
#[ inline ]
#[ stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
#[ rustc_const_stable(feature = " nonzero_negation_ops " , since = " 1.71.0 " ) ]
2024-01-22 18:30:54 +01:00
pub const fn wrapping_neg ( self ) -> Self {
2023-12-05 22:06:40 -08:00
let result = self . get ( ) . wrapping_neg ( ) ;
// SAFETY: negation of nonzero cannot yield zero values.
2024-01-22 18:30:54 +01:00
unsafe { Self ::new_unchecked ( result ) }
2023-12-05 22:06:40 -08:00
}
2023-12-05 22:03:55 -08:00
} ;
2021-04-15 12:28:45 +02:00
}
2021-06-07 16:19:54 +02:00
// Use this when the generated code should differ between signed and unsigned types.
macro_rules ! sign_dependent_expr {
( signed ? if signed { $signed_case :expr } if unsigned { $unsigned_case :expr } ) = > {
$signed_case
} ;
( unsigned ? if signed { $signed_case :expr } if unsigned { $unsigned_case :expr } ) = > {
$unsigned_case
} ;
}
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroU8 ,
Primitive = unsigned u8 ,
2021-04-15 12:28:45 +02:00
}
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroU16 ,
Primitive = unsigned u16 ,
2023-12-05 18:21:50 -08:00
}
2021-01-16 19:27:51 -08:00
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroU32 ,
Primitive = unsigned u32 ,
2023-12-05 18:21:50 -08:00
}
2021-01-16 19:27:51 -08:00
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroU64 ,
Primitive = unsigned u64 ,
2021-01-16 19:27:51 -08:00
}
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroU128 ,
Primitive = unsigned u128 ,
2023-12-05 18:21:50 -08:00
}
2022-01-25 04:29:40 -05:00
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroUsize ,
Primitive = unsigned usize ,
2022-01-25 04:29:40 -05:00
}
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroI8 ,
Primitive = signed i8 ,
2023-12-05 22:03:55 -08:00
UnsignedNonZero = NonZeroU8 ,
2023-12-05 21:37:28 -08:00
UnsignedPrimitive = u8 ,
2022-01-25 04:29:40 -05:00
}
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroI16 ,
Primitive = signed i16 ,
2023-12-05 22:03:55 -08:00
UnsignedNonZero = NonZeroU16 ,
2023-12-05 21:37:28 -08:00
UnsignedPrimitive = u16 ,
2022-01-25 04:29:40 -05:00
}
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroI32 ,
Primitive = signed i32 ,
2023-12-05 22:03:55 -08:00
UnsignedNonZero = NonZeroU32 ,
2023-12-05 21:37:28 -08:00
UnsignedPrimitive = u32 ,
2022-01-25 04:29:40 -05:00
}
2022-03-12 08:00:45 -05:00
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroI64 ,
Primitive = signed i64 ,
2023-12-05 22:03:55 -08:00
UnsignedNonZero = NonZeroU64 ,
2023-12-05 21:37:28 -08:00
UnsignedPrimitive = u64 ,
2023-12-05 18:21:50 -08:00
}
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroI128 ,
Primitive = signed i128 ,
2023-12-05 22:03:55 -08:00
UnsignedNonZero = NonZeroU128 ,
2023-12-05 21:37:28 -08:00
UnsignedPrimitive = u128 ,
2022-03-12 08:00:45 -05:00
}
2023-12-05 18:21:50 -08:00
nonzero_integer! {
2023-12-05 18:24:16 -08:00
Self = NonZeroIsize ,
Primitive = signed isize ,
2023-12-05 22:03:55 -08:00
UnsignedNonZero = NonZeroUsize ,
2023-12-05 21:37:28 -08:00
UnsignedPrimitive = usize ,
2022-03-12 08:00:45 -05:00
}