1use super::{IntErrorKind, ParseIntError, TryFromIntError};
4use crate::clone::{TrivialClone, UseCloned};
5use crate::cmp::Ordering;
6use crate::hash::{Hash, Hasher};
7use crate::marker::{Destruct, Freeze, StructuralPartialEq};
8use crate::num::imp;
9use crate::ops::{BitOr, BitOrAssign, Div, DivAssign, Neg, Rem, RemAssign};
10use crate::panic::{RefUnwindSafe, UnwindSafe};
11use crate::str::FromStr;
12use crate::{fmt, intrinsics, ptr, slice, ub_checks};
13
14#[unstable(
30 feature = "nonzero_internals",
31 reason = "implementation detail which may disappear or be replaced at any time",
32 issue = "none"
33)]
34pub impl(self) unsafe trait ZeroablePrimitive: Sized + Copy {
35 type NonZeroInner: Sized + Copy;
37}
38
39macro_rules! impl_zeroable_primitive {
40 ($($NonZeroInner:ident ( $primitive:ty )),+ $(,)?) => {
41 $(
42 #[unstable(
43 feature = "nonzero_internals",
44 reason = "implementation detail which may disappear or be replaced at any time",
45 issue = "none"
46 )]
47 unsafe impl ZeroablePrimitive for $primitive {
48 type NonZeroInner = super::niche_types::$NonZeroInner;
49 }
50 )+
51 };
52}
53
54#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for u8 {
type NonZeroInner = super::niche_types::NonZeroU8Inner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for u16 {
type NonZeroInner = super::niche_types::NonZeroU16Inner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for u32 {
type NonZeroInner = super::niche_types::NonZeroU32Inner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for u64 {
type NonZeroInner = super::niche_types::NonZeroU64Inner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for u128 {
type NonZeroInner = super::niche_types::NonZeroU128Inner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for usize {
type NonZeroInner = super::niche_types::NonZeroUsizeInner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for i8 {
type NonZeroInner = super::niche_types::NonZeroI8Inner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for i16 {
type NonZeroInner = super::niche_types::NonZeroI16Inner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for i32 {
type NonZeroInner = super::niche_types::NonZeroI32Inner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for i64 {
type NonZeroInner = super::niche_types::NonZeroI64Inner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for i128 {
type NonZeroInner = super::niche_types::NonZeroI128Inner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for isize {
type NonZeroInner = super::niche_types::NonZeroIsizeInner;
}
#[unstable(feature = "nonzero_internals", reason =
"implementation detail which may disappear or be replaced at any time", issue
= "none")]
unsafe impl ZeroablePrimitive for char {
type NonZeroInner = super::niche_types::NonZeroCharInner;
}impl_zeroable_primitive!(
55 NonZeroU8Inner(u8),
56 NonZeroU16Inner(u16),
57 NonZeroU32Inner(u32),
58 NonZeroU64Inner(u64),
59 NonZeroU128Inner(u128),
60 NonZeroUsizeInner(usize),
61 NonZeroI8Inner(i8),
62 NonZeroI16Inner(i16),
63 NonZeroI32Inner(i32),
64 NonZeroI64Inner(i64),
65 NonZeroI128Inner(i128),
66 NonZeroIsizeInner(isize),
67 NonZeroCharInner(char),
68);
69
70#[stable(feature = "generic_nonzero", since = "1.79.0")]
109#[repr(transparent)]
110#[rustc_nonnull_optimization_guaranteed]
111#[rustc_diagnostic_item = "NonZero"]
112pub struct NonZero<T: ZeroablePrimitive>(T::NonZeroInner);
113
114macro_rules! impl_nonzero_fmt {
115 ($(#[$Attribute:meta] $Trait:ident)*) => {
116 $(
117 #[$Attribute]
118 impl<T> fmt::$Trait for NonZero<T>
119 where
120 T: ZeroablePrimitive + fmt::$Trait,
121 {
122 #[inline]
123 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
124 self.get().fmt(f)
125 }
126 }
127 )*
128 };
129}
130
131#[stable(feature = "nonzero", since = "1.28.0")]
impl<T> fmt::Debug for NonZero<T> where T: ZeroablePrimitive + fmt::Debug {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.get().fmt(f)
}
}
#[stable(feature = "nonzero", since = "1.28.0")]
impl<T> fmt::Display for NonZero<T> where T: ZeroablePrimitive + fmt::Display
{
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.get().fmt(f)
}
}
#[stable(feature = "nonzero", since = "1.28.0")]
impl<T> fmt::Binary for NonZero<T> where T: ZeroablePrimitive + fmt::Binary {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.get().fmt(f)
}
}
#[stable(feature = "nonzero", since = "1.28.0")]
impl<T> fmt::Octal for NonZero<T> where T: ZeroablePrimitive + fmt::Octal {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.get().fmt(f)
}
}
#[stable(feature = "nonzero", since = "1.28.0")]
impl<T> fmt::LowerHex for NonZero<T> where T: ZeroablePrimitive +
fmt::LowerHex {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.get().fmt(f)
}
}
#[stable(feature = "nonzero", since = "1.28.0")]
impl<T> fmt::UpperHex for NonZero<T> where T: ZeroablePrimitive +
fmt::UpperHex {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.get().fmt(f)
}
}
#[stable(feature = "nonzero_fmt_exp", since = "1.84.0")]
impl<T> fmt::LowerExp for NonZero<T> where T: ZeroablePrimitive +
fmt::LowerExp {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.get().fmt(f)
}
}
#[stable(feature = "nonzero_fmt_exp", since = "1.84.0")]
impl<T> fmt::UpperExp for NonZero<T> where T: ZeroablePrimitive +
fmt::UpperExp {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.get().fmt(f)
}
}impl_nonzero_fmt! {
132 #[stable(feature = "nonzero", since = "1.28.0")]
133 Debug
134 #[stable(feature = "nonzero", since = "1.28.0")]
135 Display
136 #[stable(feature = "nonzero", since = "1.28.0")]
137 Binary
138 #[stable(feature = "nonzero", since = "1.28.0")]
139 Octal
140 #[stable(feature = "nonzero", since = "1.28.0")]
141 LowerHex
142 #[stable(feature = "nonzero", since = "1.28.0")]
143 UpperHex
144 #[stable(feature = "nonzero_fmt_exp", since = "1.84.0")]
145 LowerExp
146 #[stable(feature = "nonzero_fmt_exp", since = "1.84.0")]
147 UpperExp
148}
149
150macro_rules! impl_nonzero_auto_trait {
151 (unsafe $Trait:ident) => {
152 #[stable(feature = "nonzero", since = "1.28.0")]
153 unsafe impl<T> $Trait for NonZero<T> where T: ZeroablePrimitive + $Trait {}
154 };
155 ($Trait:ident) => {
156 #[stable(feature = "nonzero", since = "1.28.0")]
157 impl<T> $Trait for NonZero<T> where T: ZeroablePrimitive + $Trait {}
158 };
159}
160
161#[stable(feature = "nonzero", since = "1.28.0")]
unsafe impl<T> Freeze for NonZero<T> where T: ZeroablePrimitive + Freeze { }impl_nonzero_auto_trait!(unsafe Freeze);
164#[stable(feature = "nonzero", since = "1.28.0")]
impl<T> RefUnwindSafe for NonZero<T> where T: ZeroablePrimitive +
RefUnwindSafe {
}impl_nonzero_auto_trait!(RefUnwindSafe);
165#[stable(feature = "nonzero", since = "1.28.0")]
unsafe impl<T> Send for NonZero<T> where T: ZeroablePrimitive + Send { }impl_nonzero_auto_trait!(unsafe Send);
166#[stable(feature = "nonzero", since = "1.28.0")]
unsafe impl<T> Sync for NonZero<T> where T: ZeroablePrimitive + Sync { }impl_nonzero_auto_trait!(unsafe Sync);
167#[stable(feature = "nonzero", since = "1.28.0")]
impl<T> Unpin for NonZero<T> where T: ZeroablePrimitive + Unpin { }impl_nonzero_auto_trait!(Unpin);
168#[stable(feature = "nonzero", since = "1.28.0")]
impl<T> UnwindSafe for NonZero<T> where T: ZeroablePrimitive + UnwindSafe { }impl_nonzero_auto_trait!(UnwindSafe);
169
170#[stable(feature = "nonzero", since = "1.28.0")]
171#[rustc_const_unstable(feature = "const_clone", issue = "142757")]
172const impl<T> Clone for NonZero<T>
173where
174 T: ZeroablePrimitive,
175{
176 #[inline]
177 fn clone(&self) -> Self {
178 *self
179 }
180}
181
182#[unstable(feature = "ergonomic_clones", issue = "132290")]
183impl<T> UseCloned for NonZero<T> where T: ZeroablePrimitive {}
184
185#[stable(feature = "nonzero", since = "1.28.0")]
186impl<T> Copy for NonZero<T> where T: ZeroablePrimitive {}
187
188#[doc(hidden)]
189#[unstable(feature = "trivial_clone", issue = "none")]
190#[rustc_const_unstable(feature = "const_clone", issue = "142757")]
191const unsafe impl<T> TrivialClone for NonZero<T> where T: ZeroablePrimitive {}
192
193#[stable(feature = "nonzero", since = "1.28.0")]
194#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
195const impl<T> PartialEq for NonZero<T>
196where
197 T: ZeroablePrimitive + [const] PartialEq,
198{
199 #[inline]
200 fn eq(&self, other: &Self) -> bool {
201 self.get() == other.get()
202 }
203
204 #[inline]
205 fn ne(&self, other: &Self) -> bool {
206 self.get() != other.get()
207 }
208}
209
210#[unstable(feature = "structural_match", issue = "31434")]
211impl<T> StructuralPartialEq for NonZero<T> where T: ZeroablePrimitive + StructuralPartialEq {}
212
213#[stable(feature = "nonzero", since = "1.28.0")]
214#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
215const impl<T> Eq for NonZero<T> where T: ZeroablePrimitive + [const] Eq {}
216
217#[stable(feature = "nonzero", since = "1.28.0")]
218#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
219const impl<T> PartialOrd for NonZero<T>
220where
221 T: ZeroablePrimitive + [const] PartialOrd,
222{
223 #[inline]
224 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
225 self.get().partial_cmp(&other.get())
226 }
227
228 #[inline]
229 fn lt(&self, other: &Self) -> bool {
230 self.get() < other.get()
231 }
232
233 #[inline]
234 fn le(&self, other: &Self) -> bool {
235 self.get() <= other.get()
236 }
237
238 #[inline]
239 fn gt(&self, other: &Self) -> bool {
240 self.get() > other.get()
241 }
242
243 #[inline]
244 fn ge(&self, other: &Self) -> bool {
245 self.get() >= other.get()
246 }
247}
248
249#[stable(feature = "nonzero", since = "1.28.0")]
250#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
251const impl<T> Ord for NonZero<T>
252where
253 T: ZeroablePrimitive + [const] Ord + [const] Destruct,
256{
257 #[inline]
258 fn cmp(&self, other: &Self) -> Ordering {
259 self.get().cmp(&other.get())
260 }
261
262 #[inline]
263 fn max(self, other: Self) -> Self {
264 unsafe { Self::new_unchecked(self.get().max(other.get())) }
266 }
267
268 #[inline]
269 fn min(self, other: Self) -> Self {
270 unsafe { Self::new_unchecked(self.get().min(other.get())) }
272 }
273
274 #[inline]
275 fn clamp(self, min: Self, max: Self) -> Self {
276 unsafe { Self::new_unchecked(self.get().clamp(min.get(), max.get())) }
278 }
279}
280
281#[stable(feature = "nonzero", since = "1.28.0")]
282impl<T> Hash for NonZero<T>
283where
284 T: ZeroablePrimitive + Hash,
285{
286 #[inline]
287 fn hash<H>(&self, state: &mut H)
288 where
289 H: Hasher,
290 {
291 self.get().hash(state)
292 }
293}
294
295#[stable(feature = "from_nonzero", since = "1.31.0")]
296#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
297const impl<T> From<NonZero<T>> for T
298where
299 T: ZeroablePrimitive,
300{
301 #[inline]
302 fn from(nonzero: NonZero<T>) -> Self {
303 nonzero.get()
305 }
306}
307
308#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
309impl<'a, T> From<&'a NonZero<T>> for &'a T
310where
311 T: ZeroablePrimitive,
312{
313 #[inline]
314 fn from(nonzero: &'a NonZero<T>) -> &'a T {
315 nonzero.as_ref()
316 }
317}
318
319#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
347impl<T, const N: usize> From<[NonZero<T>; N]> for [T; N]
348where
349 T: ZeroablePrimitive,
350{
351 #[inline]
352 fn from(nonzero: [NonZero<T>; N]) -> [T; N] {
353 nonzero.into_zeroable()
354 }
355}
356
357macro_rules! impl_ref_try_from {
359 ($($t:ty),* $(,)?) => {
360 $(
361 #[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
362 impl<'a> TryFrom<&'a $t> for &'a NonZero<$t> {
363 type Error = TryFromIntError;
364
365 #[inline]
366 fn try_from(zeroable: &'a $t) -> Result<&'a NonZero<$t>, TryFromIntError> {
367 NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
368 }
369 }
370 )*
371 }
372}
373
374#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a u8> for &'a NonZero<u8> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a u8)
-> Result<&'a NonZero<u8>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a u16> for &'a NonZero<u16> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a u16)
-> Result<&'a NonZero<u16>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a u32> for &'a NonZero<u32> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a u32)
-> Result<&'a NonZero<u32>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a u64> for &'a NonZero<u64> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a u64)
-> Result<&'a NonZero<u64>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a u128> for &'a NonZero<u128> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a u128)
-> Result<&'a NonZero<u128>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a usize> for &'a NonZero<usize> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a usize)
-> Result<&'a NonZero<usize>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a i8> for &'a NonZero<i8> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a i8)
-> Result<&'a NonZero<i8>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a i16> for &'a NonZero<i16> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a i16)
-> Result<&'a NonZero<i16>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a i32> for &'a NonZero<i32> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a i32)
-> Result<&'a NonZero<i32>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a i64> for &'a NonZero<i64> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a i64)
-> Result<&'a NonZero<i64>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a i128> for &'a NonZero<i128> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a i128)
-> Result<&'a NonZero<i128>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a isize> for &'a NonZero<isize> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a isize)
-> Result<&'a NonZero<isize>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}
#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
impl<'a> TryFrom<&'a char> for &'a NonZero<char> {
type Error = TryFromIntError;
#[inline]
fn try_from(zeroable: &'a char)
-> Result<&'a NonZero<char>, TryFromIntError> {
NonZero::from_ref(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
}
}impl_ref_try_from! {
375 u8,
376 u16,
377 u32,
378 u64,
379 u128,
380 usize,
381 i8,
382 i16,
383 i32,
384 i64,
385 i128,
386 isize,
387 char,
388}
389
390#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
391impl<'a, T> TryFrom<&'a [T]> for &'a [NonZero<T>]
392where
393 T: ZeroablePrimitive,
394{
395 type Error = TryFromIntError;
396
397 #[inline]
398 fn try_from(zeroable: &'a [T]) -> Result<&'a [NonZero<T>], TryFromIntError> {
399 NonZero::from_slice(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
400 }
401}
402
403#[stable(feature = "more_from_nonzero", since = "CURRENT_RUSTC_VERSION")]
404impl<T, const N: usize> TryFrom<[T; N]> for [NonZero<T>; N]
405where
406 T: ZeroablePrimitive,
407{
408 type Error = TryFromIntError;
409
410 #[inline]
411 fn try_from(zeroable: [T; N]) -> Result<[NonZero<T>; N], TryFromIntError> {
412 NonZero::from_array(zeroable).ok_or(TryFromIntError(IntErrorKind::Zero))
413 }
414}
415
416#[stable(feature = "nonzero_bitor", since = "1.45.0")]
417#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
418const impl<T> BitOr for NonZero<T>
419where
420 T: ZeroablePrimitive + [const] BitOr<Output = T>,
421{
422 type Output = Self;
423
424 #[inline]
425 fn bitor(self, rhs: Self) -> Self::Output {
426 unsafe { Self::new_unchecked(self.get() | rhs.get()) }
428 }
429}
430
431#[stable(feature = "nonzero_bitor", since = "1.45.0")]
432#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
433const impl<T> BitOr<T> for NonZero<T>
434where
435 T: ZeroablePrimitive + [const] BitOr<Output = T>,
436{
437 type Output = Self;
438
439 #[inline]
440 fn bitor(self, rhs: T) -> Self::Output {
441 unsafe { Self::new_unchecked(self.get() | rhs) }
443 }
444}
445
446#[stable(feature = "nonzero_bitor", since = "1.45.0")]
447#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
448const impl<T> BitOr<NonZero<T>> for T
449where
450 T: ZeroablePrimitive + [const] BitOr<Output = T>,
451{
452 type Output = NonZero<T>;
453
454 #[inline]
455 fn bitor(self, rhs: NonZero<T>) -> Self::Output {
456 unsafe { NonZero::new_unchecked(self | rhs.get()) }
458 }
459}
460
461#[stable(feature = "nonzero_bitor", since = "1.45.0")]
462#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
463const impl<T> BitOrAssign for NonZero<T>
464where
465 T: ZeroablePrimitive,
466 Self: [const] BitOr<Output = Self>,
467{
468 #[inline]
469 fn bitor_assign(&mut self, rhs: Self) {
470 *self = *self | rhs;
471 }
472}
473
474#[stable(feature = "nonzero_bitor", since = "1.45.0")]
475#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
476const impl<T> BitOrAssign<T> for NonZero<T>
477where
478 T: ZeroablePrimitive,
479 Self: [const] BitOr<T, Output = Self>,
480{
481 #[inline]
482 fn bitor_assign(&mut self, rhs: T) {
483 *self = *self | rhs;
484 }
485}
486
487impl<T> NonZero<T>
488where
489 T: ZeroablePrimitive,
490{
491 #[stable(feature = "nonzero", since = "1.28.0")]
493 #[rustc_const_stable(feature = "const_nonzero_int_methods", since = "1.47.0")]
494 #[must_use]
495 #[inline]
496 pub const fn new(n: T) -> Option<Self> {
497 unsafe { intrinsics::transmute_unchecked(n) }
500 }
501
502 #[stable(feature = "nonzero", since = "1.28.0")]
509 #[rustc_const_stable(feature = "nonzero", since = "1.28.0")]
510 #[must_use]
511 #[inline]
512 #[track_caller]
513 pub const unsafe fn new_unchecked(n: T) -> Self {
514 match Self::new(n) {
515 Some(n) => n,
516 None => {
517 unsafe {
519 {
#[rustc_no_mir_inline]
#[inline]
#[rustc_nounwind]
#[track_caller]
const fn precondition_check() {
if !false {
let msg =
"unsafe precondition(s) violated: NonZero::new_unchecked requires the argument to be non-zero\n\nThis indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.";
::core::panicking::panic_nounwind_fmt(::core::fmt::Arguments::from_str(msg),
false);
}
}
if ::core::ub_checks::check_language_ub() { precondition_check(); }
};ub_checks::assert_unsafe_precondition!(
520 check_language_ub,
521 "NonZero::new_unchecked requires the argument to be non-zero",
522 () => false,
523 );
524 intrinsics::unreachable()
525 }
526 }
527 }
528 }
529
530 #[unstable(feature = "nonzero_from_mut", issue = "106290")]
533 #[must_use]
534 #[inline]
535 pub fn from_mut(n: &mut T) -> Option<&mut Self> {
536 let opt_n = unsafe { &mut *(ptr::from_mut(n).cast::<Option<Self>>()) };
539
540 opt_n.as_mut()
541 }
542
543 #[unstable(feature = "nonzero_from_mut", issue = "106290")]
551 #[must_use]
552 #[inline]
553 #[track_caller]
554 pub unsafe fn from_mut_unchecked(n: &mut T) -> &mut Self {
555 match Self::from_mut(n) {
556 Some(n) => n,
557 None => {
558 unsafe {
560 {
#[rustc_no_mir_inline]
#[inline]
#[rustc_nounwind]
#[track_caller]
const fn precondition_check() {
if !false {
let msg =
"unsafe precondition(s) violated: NonZero::from_mut_unchecked requires the argument to dereference as non-zero\n\nThis indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.";
::core::panicking::panic_nounwind_fmt(::core::fmt::Arguments::from_str(msg),
false);
}
}
if ::core::ub_checks::check_library_ub() { precondition_check(); }
};ub_checks::assert_unsafe_precondition!(
561 check_library_ub,
562 "NonZero::from_mut_unchecked requires the argument to dereference as non-zero",
563 () => false,
564 );
565 intrinsics::unreachable()
566 }
567 }
568 }
569 }
570
571 #[must_use]
573 #[inline]
574 fn as_ref(&self) -> &T {
575 unsafe { &*(ptr::from_ref(self).cast::<T>()) }
577 }
578
579 #[must_use]
581 #[inline]
582 fn from_ref(n: &T) -> Option<&Self> {
583 let opt_n = unsafe { &*(ptr::from_ref(n).cast::<Option<Self>>()) };
586
587 opt_n.as_ref()
588 }
589
590 #[must_use]
592 #[inline]
593 fn from_slice(n: &[T]) -> Option<&[Self]> {
594 if n.iter().all(|x| NonZero::new(*x).is_some()) {
595 Some(unsafe { slice::from_raw_parts(n.as_ptr().cast::<NonZero<T>>(), n.len()) })
598 } else {
599 None
600 }
601 }
602
603 #[must_use]
605 #[inline]
606 fn from_array<const N: usize>(n: [T; N]) -> Option<[Self; N]> {
607 n.try_map(NonZero::new)
608 }
609
610 #[stable(feature = "nonzero", since = "1.28.0")]
612 #[rustc_const_stable(feature = "const_nonzero_get", since = "1.34.0")]
613 #[inline]
614 pub const fn get(self) -> T {
615 unsafe { intrinsics::transmute_unchecked(self) }
634 }
635}
636
637impl<T, const N: usize> [NonZero<T>; N]
638where
639 T: ZeroablePrimitive,
640{
641 #[must_use]
643 #[inline]
644 fn into_zeroable(self) -> [T; N] {
645 self.map(NonZero::get)
646 }
647}
648
649macro_rules! nonzero_integer {
650 (
651 #[$stability:meta]
652 Self = $Ty:ident,
653 Primitive = $signedness:ident $Int:ident,
654 SignedPrimitive = $Sint:ty,
655 UnsignedPrimitive = $Uint:ty,
656
657 rot = $rot:literal,
659 rot_op = $rot_op:literal,
660 rot_result = $rot_result:literal,
661 swap_op = $swap_op:literal,
662 swapped = $swapped:literal,
663 reversed = $reversed:literal,
664 leading_zeros_test = $leading_zeros_test:expr,
665 ) => {
666 #[doc = sign_dependent_expr!{
667 $signedness ?
668 if signed {
669 concat!("An [`", stringify!($Int), "`] that is known not to equal zero.")
670 }
671 if unsigned {
672 concat!("A [`", stringify!($Int), "`] that is known not to equal zero.")
673 }
674 }]
675 #[doc = concat!("For example, `Option<", stringify!($Ty), ">` is the same size as `", stringify!($Int), "`:")]
678 #[doc = concat!("assert_eq!(size_of::<Option<core::num::", stringify!($Ty), ">>(), size_of::<", stringify!($Int), ">());")]
681 #[doc = concat!("`", stringify!($Ty), "` is guaranteed to have the same layout and bit validity as `", stringify!($Int), "`")]
686 #[doc = concat!("`Option<", stringify!($Ty), ">` is guaranteed to be ABI-compatible with `", stringify!($Int), "`,")]
688 #[doc = concat!("`", stringify!($Ty), "` and `Option<", stringify!($Ty), ">`")]
692 #[doc = concat!("use std::num::", stringify!($Ty), ";")]
696 #[doc = concat!("assert_eq!(size_of::<", stringify!($Ty), ">(), size_of::<Option<", stringify!($Ty), ">>());")]
698 #[doc = concat!("assert_eq!(align_of::<", stringify!($Ty), ">(), align_of::<Option<", stringify!($Ty), ">>());")]
699 #[doc = concat!("`", stringify!($Ty), "`")]
706 #[doc = concat!("use std::num::", stringify!($Ty), ";")]
709 #[doc = concat!("const TEN: ", stringify!($Ty), " = ", stringify!($Ty) , r#"::new(10).expect("ten is non-zero");"#)]
711 #[$stability]
715 pub type $Ty = NonZero<$Int>;
716
717 impl NonZero<$Int> {
718 #[doc = concat!("This value is equal to [`", stringify!($Int), "::BITS`].")]
721 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::BITS, ", stringify!($Int), "::BITS);")]
728 #[stable(feature = "nonzero_bits", since = "1.67.0")]
730 pub const BITS: u32 = <$Int>::BITS;
731
732 #[doc = concat!("let n = NonZero::<", stringify!($Int), ">::new(", $leading_zeros_test, ")?;")]
744 #[stable(feature = "nonzero_leading_trailing_zeros", since = "1.53.0")]
750 #[rustc_const_stable(feature = "nonzero_leading_trailing_zeros", since = "1.53.0")]
751 #[must_use = "this returns the result of the operation, \
752 without modifying the original"]
753 #[inline]
754 pub const fn leading_zeros(self) -> u32 {
755 unsafe {
757 intrinsics::ctlz_nonzero(self.get() as $Uint)
758 }
759 }
760
761 #[doc = concat!("let n = NonZero::<", stringify!($Int), ">::new(0b0101000)?;")]
774 #[stable(feature = "nonzero_leading_trailing_zeros", since = "1.53.0")]
780 #[rustc_const_stable(feature = "nonzero_leading_trailing_zeros", since = "1.53.0")]
781 #[must_use = "this returns the result of the operation, \
782 without modifying the original"]
783 #[inline]
784 pub const fn trailing_zeros(self) -> u32 {
785 unsafe {
787 intrinsics::cttz_nonzero(self.get() as $Uint)
788 }
789 }
790
791 #[doc = concat!("let a = NonZero::<", stringify!($Int), ">::new(0b_01100100)?;")]
800 #[doc = concat!("let b = NonZero::<", stringify!($Int), ">::new(0b_01000000)?;")]
801 #[stable(feature = "isolate_most_least_significant_one", since = "1.97.0")]
807 #[rustc_const_stable(feature = "isolate_most_least_significant_one", since = "1.97.0")]
808 #[must_use = "this returns the result of the operation, \
809 without modifying the original"]
810 #[inline(always)]
811 pub const fn isolate_highest_one(self) -> Self {
812 unsafe {
818 let bit = (((1 as $Uint) << (<$Uint>::BITS - 1)).unchecked_shr(self.leading_zeros()));
819 NonZero::new_unchecked(bit as $Int)
820 }
821 }
822
823 #[doc = concat!("let a = NonZero::<", stringify!($Int), ">::new(0b_01100100)?;")]
832 #[doc = concat!("let b = NonZero::<", stringify!($Int), ">::new(0b_00000100)?;")]
833 #[stable(feature = "isolate_most_least_significant_one", since = "1.97.0")]
839 #[rustc_const_stable(feature = "isolate_most_least_significant_one", since = "1.97.0")]
840 #[must_use = "this returns the result of the operation, \
841 without modifying the original"]
842 #[inline(always)]
843 pub const fn isolate_lowest_one(self) -> Self {
844 let n = self.get();
845 let n = n & n.wrapping_neg();
846
847 unsafe { NonZero::new_unchecked(n) }
850 }
851
852 #[doc = sign_dependent_expr!{
855 $signedness ?
856 if signed {
857 ""
858 }
859 if unsigned {
860 "Note that this is equivalent to [`ilog2`](Self::ilog2)."
861 }
862 }]
863 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1)?.highest_one(), 0);")]
871 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1_0000)?.highest_one(), 4);")]
872 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1_1111)?.highest_one(), 4);")]
873 #[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
877 #[rustc_const_stable(feature = "int_lowest_highest_one", since = "1.97.0")]
878 #[must_use = "this returns the result of the operation, \
879 without modifying the original"]
880 #[inline(always)]
881 pub const fn highest_one(self) -> u32 {
882 Self::BITS - 1 - self.leading_zeros()
883 }
884
885 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1)?.lowest_one(), 0);")]
894 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1_0000)?.lowest_one(), 4);")]
895 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1_1111)?.lowest_one(), 0);")]
896 #[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
900 #[rustc_const_stable(feature = "int_lowest_highest_one", since = "1.97.0")]
901 #[must_use = "this returns the result of the operation, \
902 without modifying the original"]
903 #[inline(always)]
904 pub const fn lowest_one(self) -> u32 {
905 self.trailing_zeros()
906 }
907
908 #[doc = concat!("let a = NonZero::<", stringify!($Int), ">::new(0b100_0000)?;")]
918 #[doc = concat!("let b = NonZero::<", stringify!($Int), ">::new(0b100_0011)?;")]
919 #[stable(feature = "non_zero_count_ones", since = "1.86.0")]
927 #[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
928 #[doc(alias = "popcount")]
929 #[doc(alias = "popcnt")]
930 #[must_use = "this returns the result of the operation, \
931 without modifying the original"]
932 #[inline(always)]
933 pub const fn count_ones(self) -> NonZero<u32> {
934 unsafe { NonZero::new_unchecked(self.get().count_ones()) }
938 }
939
940 #[doc = concat!("let n = NonZero::new(", $rot_op, stringify!($Int), ")?;")]
954 #[doc = concat!("let m = NonZero::new(", $rot_result, ")?;")]
955 #[doc = concat!("assert_eq!(n.rotate_left(", $rot, "), m);")]
957 #[unstable(feature = "nonzero_bitwise", issue = "128281")]
961 #[must_use = "this returns the result of the operation, \
962 without modifying the original"]
963 #[inline(always)]
964 pub const fn rotate_left(self, n: u32) -> Self {
965 let result = self.get().rotate_left(n);
966 unsafe { Self::new_unchecked(result) }
968 }
969
970 #[doc = concat!("let n = NonZero::new(", $rot_result, stringify!($Int), ")?;")]
985 #[doc = concat!("let m = NonZero::new(", $rot_op, ")?;")]
986 #[doc = concat!("assert_eq!(n.rotate_right(", $rot, "), m);")]
988 #[unstable(feature = "nonzero_bitwise", issue = "128281")]
992 #[must_use = "this returns the result of the operation, \
993 without modifying the original"]
994 #[inline(always)]
995 pub const fn rotate_right(self, n: u32) -> Self {
996 let result = self.get().rotate_right(n);
997 unsafe { Self::new_unchecked(result) }
999 }
1000
1001 #[doc = concat!("let n = NonZero::new(", $swap_op, stringify!($Int), ")?;")]
1012 #[doc = concat!("assert_eq!(m, NonZero::new(", $swapped, ")?);")]
1015 #[unstable(feature = "nonzero_bitwise", issue = "128281")]
1019 #[must_use = "this returns the result of the operation, \
1020 without modifying the original"]
1021 #[inline(always)]
1022 pub const fn swap_bytes(self) -> Self {
1023 let result = self.get().swap_bytes();
1024 unsafe { Self::new_unchecked(result) }
1026 }
1027
1028 #[doc = concat!("let n = NonZero::new(", $swap_op, stringify!($Int), ")?;")]
1040 #[doc = concat!("assert_eq!(m, NonZero::new(", $reversed, ")?);")]
1043 #[unstable(feature = "nonzero_bitwise", issue = "128281")]
1047 #[must_use = "this returns the result of the operation, \
1048 without modifying the original"]
1049 #[inline(always)]
1050 pub const fn reverse_bits(self) -> Self {
1051 let result = self.get().reverse_bits();
1052 unsafe { Self::new_unchecked(result) }
1054 }
1055
1056 #[doc = concat!("use std::num::", stringify!($Ty), ";")]
1067 #[doc = concat!("let n = NonZero::new(0x1A", stringify!($Int), ")?;")]
1071 #[doc = concat!(" assert_eq!(", stringify!($Ty), "::from_be(n), n)")]
1074 #[doc = concat!(" assert_eq!(", stringify!($Ty), "::from_be(n), n.swap_bytes())")]
1076 #[unstable(feature = "nonzero_bitwise", issue = "128281")]
1081 #[must_use]
1082 #[inline(always)]
1083 pub const fn from_be(x: Self) -> Self {
1084 let result = $Int::from_be(x.get());
1085 unsafe { Self::new_unchecked(result) }
1087 }
1088
1089 #[doc = concat!("use std::num::", stringify!($Ty), ";")]
1100 #[doc = concat!("let n = NonZero::new(0x1A", stringify!($Int), ")?;")]
1104 #[doc = concat!(" assert_eq!(", stringify!($Ty), "::from_le(n), n)")]
1107 #[doc = concat!(" assert_eq!(", stringify!($Ty), "::from_le(n), n.swap_bytes())")]
1109 #[unstable(feature = "nonzero_bitwise", issue = "128281")]
1114 #[must_use]
1115 #[inline(always)]
1116 pub const fn from_le(x: Self) -> Self {
1117 let result = $Int::from_le(x.get());
1118 unsafe { Self::new_unchecked(result) }
1120 }
1121
1122 #[doc = concat!("let n = NonZero::new(0x1A", stringify!($Int), ")?;")]
1136 #[unstable(feature = "nonzero_bitwise", issue = "128281")]
1146 #[must_use = "this returns the result of the operation, \
1147 without modifying the original"]
1148 #[inline(always)]
1149 pub const fn to_be(self) -> Self {
1150 let result = self.get().to_be();
1151 unsafe { Self::new_unchecked(result) }
1153 }
1154
1155 #[doc = concat!("let n = NonZero::new(0x1A", stringify!($Int), ")?;")]
1169 #[unstable(feature = "nonzero_bitwise", issue = "128281")]
1179 #[must_use = "this returns the result of the operation, \
1180 without modifying the original"]
1181 #[inline(always)]
1182 pub const fn to_le(self) -> Self {
1183 let result = self.get().to_le();
1184 unsafe { Self::new_unchecked(result) }
1186 }
1187
1188 nonzero_integer_signedness_dependent_methods! {
1189 Primitive = $signedness $Int,
1190 SignedPrimitive = $Sint,
1191 UnsignedPrimitive = $Uint,
1192 }
1193
1194 #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1206 #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1207 #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1208 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1215 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1216 #[must_use = "this returns the result of the operation, \
1217 without modifying the original"]
1218 #[inline]
1219 pub const fn checked_mul(self, other: Self) -> Option<Self> {
1220 if let Some(result) = self.get().checked_mul(other.get()) {
1221 Some(unsafe { Self::new_unchecked(result) })
1229 } else {
1230 None
1231 }
1232 }
1233
1234 #[doc = concat!("Return [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")]
1236 #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1245 #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1246 #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1247 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1254 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1255 #[must_use = "this returns the result of the operation, \
1256 without modifying the original"]
1257 #[inline]
1258 pub const fn saturating_mul(self, other: Self) -> Self {
1259 unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
1268 }
1269
1270 #[doc = sign_dependent_expr!{
1279 $signedness ?
1280 if signed {
1281 concat!("`self * rhs > ", stringify!($Int), "::MAX`, ",
1282 "or `self * rhs < ", stringify!($Int), "::MIN`.")
1283 }
1284 if unsigned {
1285 concat!("`self * rhs > ", stringify!($Int), "::MAX`.")
1286 }
1287 }]
1288 #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1299 #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1300 #[unstable(feature = "nonzero_ops", issue = "84186")]
1306 #[must_use = "this returns the result of the operation, \
1307 without modifying the original"]
1308 #[inline]
1309 pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
1310 unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
1312 }
1313
1314 #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
1326 #[doc = concat!("let twenty_seven = NonZero::new(27", stringify!($Int), ")?;")]
1327 #[doc = concat!("let half_max = NonZero::new(", stringify!($Int), "::MAX / 2)?;")]
1328 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1335 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1336 #[must_use = "this returns the result of the operation, \
1337 without modifying the original"]
1338 #[inline]
1339 pub const fn checked_pow(self, other: u32) -> Option<Self> {
1340 if let Some(result) = self.get().checked_pow(other) {
1341 Some(unsafe { Self::new_unchecked(result) })
1349 } else {
1350 None
1351 }
1352 }
1353
1354 #[doc = sign_dependent_expr!{
1356 $signedness ?
1357 if signed {
1358 concat!("Return [`NonZero::<", stringify!($Int), ">::MIN`] ",
1359 "or [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")
1360 }
1361 if unsigned {
1362 concat!("Return [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")
1363 }
1364 }]
1365 #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
1374 #[doc = concat!("let twenty_seven = NonZero::new(27", stringify!($Int), ")?;")]
1375 #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1376 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1383 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1384 #[must_use = "this returns the result of the operation, \
1385 without modifying the original"]
1386 #[inline]
1387 pub const fn saturating_pow(self, other: u32) -> Self {
1388 unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
1397 }
1398
1399 #[doc = sign_dependent_expr!{
1403 $signedness ?
1404 if signed {
1405 " `+` or `-` "
1406 }
1407 if unsigned {
1408 " `+` "
1409 }
1410 }]
1411 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));")]
1425 #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_ascii_bytes(b\"1 \").is_err());")]
1437 #[unstable(feature = "int_from_ascii", issue = "134821")]
1439 #[rustc_const_unstable(feature = "const_convert", issue = "143773")]
1440 #[inline]
1441 pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
1442 where
1443 T: [const] AsRef<[u8]> + [const] crate::marker::Destruct
1444 {
1445 Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
1446 }
1447
1448 #[doc = sign_dependent_expr!{
1452 $signedness ?
1453 if signed {
1454 " `+` or `-` "
1455 }
1456 if unsigned {
1457 " `+` "
1458 }
1459 }]
1460 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));")]
1484 #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_ascii_bytes_radix(b\"1 \", 10).is_err());")]
1496 #[unstable(feature = "int_from_ascii", issue = "134821")]
1498 #[rustc_const_unstable(feature = "const_convert", issue = "143773")]
1499 #[inline]
1500 pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32) -> Result<Self, ParseIntError>
1501 where
1502 T: [const] AsRef<[u8]> + [const] crate::marker::Destruct
1503 {
1504 Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
1505 }
1506
1507 #[inline]
1508 const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32) -> Result<Self, ParseIntError> {
1509 let n = match <$Int>::from_ascii_bytes_radix_impl(src, radix) {
1510 Ok(n) => n,
1511 Err(err) => return Err(err),
1512 };
1513 if let Some(n) = Self::new(n) {
1514 Ok(n)
1515 } else {
1516 Err(ParseIntError { kind: IntErrorKind::Zero })
1517 }
1518 }
1519
1520 #[doc = sign_dependent_expr!{
1524 $signedness ?
1525 if signed {
1526 " `+` or `-` "
1527 }
1528 if unsigned {
1529 " `+` "
1530 }
1531 }]
1532 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));")]
1554 #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_str_radix(\"1 \", 10).is_err());")]
1564 #[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
1566 #[rustc_const_stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
1567 #[inline]
1568 pub const fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
1569 Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
1570 }
1571 }
1572
1573 #[stable(feature = "nonzero_parse", since = "1.35.0")]
1574 #[rustc_const_unstable(feature = "const_convert", issue = "143773")]
1575 const impl FromStr for NonZero<$Int> {
1576 type Err = ParseIntError;
1577
1578 #[doc = sign_dependent_expr!{
1582 $signedness ?
1583 if signed {
1584 " `+` or `-` "
1585 }
1586 if unsigned {
1587 " `+` "
1588 }
1589 }]
1590 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));")]
1601 #[doc = concat!("assert!(NonZero::<", stringify!($Int), ">::from_str(\"1 \").is_err());")]
1610 #[inline]
1612 fn from_str(src: &str) -> Result<Self, Self::Err> {
1613 Self::from_str_radix(src, 10)
1614 }
1615 }
1616
1617 nonzero_integer_signedness_dependent_impls!($signedness $Int);
1618 };
1619
1620 (
1621 Self = $Ty:ident,
1622 Primitive = unsigned $Int:ident,
1623 SignedPrimitive = $Sint:ident,
1624 rot = $rot:literal,
1625 rot_op = $rot_op:literal,
1626 rot_result = $rot_result:literal,
1627 swap_op = $swap_op:literal,
1628 swapped = $swapped:literal,
1629 reversed = $reversed:literal,
1630 $(,)?
1631 ) => {
1632 nonzero_integer! {
1633 #[stable(feature = "nonzero", since = "1.28.0")]
1634 Self = $Ty,
1635 Primitive = unsigned $Int,
1636 SignedPrimitive = $Sint,
1637 UnsignedPrimitive = $Int,
1638 rot = $rot,
1639 rot_op = $rot_op,
1640 rot_result = $rot_result,
1641 swap_op = $swap_op,
1642 swapped = $swapped,
1643 reversed = $reversed,
1644 leading_zeros_test = concat!(stringify!($Int), "::MAX"),
1645 }
1646 };
1647
1648 (
1649 Self = $Ty:ident,
1650 Primitive = signed $Int:ident,
1651 UnsignedPrimitive = $Uint:ident,
1652 rot = $rot:literal,
1653 rot_op = $rot_op:literal,
1654 rot_result = $rot_result:literal,
1655 swap_op = $swap_op:literal,
1656 swapped = $swapped:literal,
1657 reversed = $reversed:literal,
1658 ) => {
1659 nonzero_integer! {
1660 #[stable(feature = "signed_nonzero", since = "1.34.0")]
1661 Self = $Ty,
1662 Primitive = signed $Int,
1663 SignedPrimitive = $Int,
1664 UnsignedPrimitive = $Uint,
1665 rot = $rot,
1666 rot_op = $rot_op,
1667 rot_result = $rot_result,
1668 swap_op = $swap_op,
1669 swapped = $swapped,
1670 reversed = $reversed,
1671 leading_zeros_test = concat!("-1", stringify!($Int)),
1672 }
1673 };
1674}
1675
1676macro_rules! nonzero_integer_signedness_dependent_impls {
1677 (unsigned $Int:ty) => {
1679 #[stable(feature = "nonzero_div", since = "1.51.0")]
1680 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1681 const impl Div<NonZero<$Int>> for $Int {
1682 type Output = $Int;
1683
1684 #[doc(alias = "unchecked_div")]
1690 #[inline]
1691 fn div(self, other: NonZero<$Int>) -> $Int {
1692 unsafe { intrinsics::unchecked_div(self, other.get()) }
1695 }
1696 }
1697
1698 #[stable(feature = "nonzero_div_assign", since = "1.79.0")]
1699 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1700 const impl DivAssign<NonZero<$Int>> for $Int {
1701 #[inline]
1707 fn div_assign(&mut self, other: NonZero<$Int>) {
1708 *self = *self / other;
1709 }
1710 }
1711
1712 #[stable(feature = "nonzero_div", since = "1.51.0")]
1713 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1714 const impl Rem<NonZero<$Int>> for $Int {
1715 type Output = $Int;
1716
1717 #[inline]
1719 fn rem(self, other: NonZero<$Int>) -> $Int {
1720 unsafe { intrinsics::unchecked_rem(self, other.get()) }
1723 }
1724 }
1725
1726 #[stable(feature = "nonzero_div_assign", since = "1.79.0")]
1727 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1728 const impl RemAssign<NonZero<$Int>> for $Int {
1729 #[inline]
1731 fn rem_assign(&mut self, other: NonZero<$Int>) {
1732 *self = *self % other;
1733 }
1734 }
1735 };
1736 (signed $Int:ty) => {
1738 #[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
1739 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1740 const impl Neg for NonZero<$Int> {
1741 type Output = Self;
1742
1743 #[inline]
1744 fn neg(self) -> Self {
1745 unsafe { Self::new_unchecked(self.get().neg()) }
1747 }
1748 }
1749
1750 forward_ref_unop! { impl Neg, neg for NonZero<$Int>,
1751 #[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
1752 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
1753 };
1754}
1755
1756#[rustfmt::skip] macro_rules! nonzero_integer_signedness_dependent_methods {
1758 (
1760 Primitive = unsigned $Int:ident,
1761 SignedPrimitive = $Sint:ty,
1762 UnsignedPrimitive = $Uint:ty,
1763 ) => {
1764 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MIN.get(), 1", stringify!($Int), ");")]
1773 #[stable(feature = "nonzero_min_max", since = "1.70.0")]
1775 pub const MIN: Self = Self::new(1).unwrap();
1776
1777 #[doc = concat!("equal to [`", stringify!($Int), "::MAX`].")]
1780 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MAX.get(), ", stringify!($Int), "::MAX);")]
1787 #[stable(feature = "nonzero_min_max", since = "1.70.0")]
1789 pub const MAX: Self = Self::new(<$Int>::MAX).unwrap();
1790
1791 #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
1804 #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1805 #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1806 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1813 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1814 #[must_use = "this returns the result of the operation, \
1815 without modifying the original"]
1816 #[inline]
1817 pub const fn checked_add(self, other: $Int) -> Option<Self> {
1818 if let Some(result) = self.get().checked_add(other) {
1819 Some(unsafe { Self::new_unchecked(result) })
1827 } else {
1828 None
1829 }
1830 }
1831
1832 #[doc = concat!("Return [`NonZero::<", stringify!($Int), ">::MAX`] on overflow.")]
1834 #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
1843 #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1844 #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1845 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1852 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1853 #[must_use = "this returns the result of the operation, \
1854 without modifying the original"]
1855 #[inline]
1856 pub const fn saturating_add(self, other: $Int) -> Self {
1857 unsafe { Self::new_unchecked(self.get().saturating_add(other)) }
1865 }
1866
1867 #[doc = concat!("`self + rhs > ", stringify!($Int), "::MAX`.")]
1876 #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
1887 #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1888 #[unstable(feature = "nonzero_ops", issue = "84186")]
1894 #[must_use = "this returns the result of the operation, \
1895 without modifying the original"]
1896 #[inline]
1897 pub const unsafe fn unchecked_add(self, other: $Int) -> Self {
1898 unsafe { Self::new_unchecked(self.get().unchecked_add(other)) }
1900 }
1901
1902 #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ").unwrap();")]
1911 #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX).unwrap();")]
1912 #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ").unwrap();")]
1915 #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ").unwrap();")]
1916 #[stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
1919 #[rustc_const_stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
1920 #[must_use = "this returns the result of the operation, \
1921 without modifying the original"]
1922 #[inline]
1923 pub const fn div_ceil(self, rhs: Self) -> Self {
1924 let v = (self.get() - 1) / rhs.get() + 1;
1928 unsafe { Self::new_unchecked(v) }
1930 }
1931
1932 #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
1945 #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
1946 #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
1947 #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
1948 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
1956 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
1957 #[must_use = "this returns the result of the operation, \
1958 without modifying the original"]
1959 #[inline]
1960 pub const fn checked_next_power_of_two(self) -> Option<Self> {
1961 if let Some(nz) = self.get().checked_next_power_of_two() {
1962 Some(unsafe { Self::new_unchecked(nz) })
1965 } else {
1966 None
1967 }
1968 }
1969
1970 #[doc = concat!("[`", stringify!($Int), "::ilog2`],")]
1974 #[doc = concat!("assert_eq!(NonZero::new(7", stringify!($Int), ")?.ilog2(), 2);")]
1987 #[doc = concat!("assert_eq!(NonZero::new(8", stringify!($Int), ")?.ilog2(), 3);")]
1988 #[doc = concat!("assert_eq!(NonZero::new(9", stringify!($Int), ")?.ilog2(), 3);")]
1989 #[stable(feature = "int_log", since = "1.67.0")]
1993 #[rustc_const_stable(feature = "int_log", since = "1.67.0")]
1994 #[must_use = "this returns the result of the operation, \
1995 without modifying the original"]
1996 #[inline]
1997 pub const fn ilog2(self) -> u32 {
1998 Self::BITS - 1 - self.leading_zeros()
1999 }
2000
2001 #[doc = concat!("[`", stringify!($Int), "::ilog10`],")]
2005 #[doc = concat!("assert_eq!(NonZero::new(99", stringify!($Int), ")?.ilog10(), 1);")]
2016 #[doc = concat!("assert_eq!(NonZero::new(100", stringify!($Int), ")?.ilog10(), 2);")]
2017 #[doc = concat!("assert_eq!(NonZero::new(101", stringify!($Int), ")?.ilog10(), 2);")]
2018 #[stable(feature = "int_log", since = "1.67.0")]
2022 #[rustc_const_stable(feature = "int_log", since = "1.67.0")]
2023 #[must_use = "this returns the result of the operation, \
2024 without modifying the original"]
2025 #[inline]
2026 pub const fn ilog10(self) -> u32 {
2027 imp::int_log10::$Int(self)
2028 }
2029
2030 #[doc = concat!("let one = NonZero::new(1", stringify!($Int), ")?;")]
2044 #[doc = concat!("let two = NonZero::new(2", stringify!($Int), ")?;")]
2045 #[doc = concat!("let four = NonZero::new(4", stringify!($Int), ")?;")]
2046 #[stable(feature = "num_midpoint", since = "1.85.0")]
2053 #[rustc_const_stable(feature = "num_midpoint", since = "1.85.0")]
2054 #[must_use = "this returns the result of the operation, \
2055 without modifying the original"]
2056 #[doc(alias = "average_floor")]
2057 #[doc(alias = "average")]
2058 #[inline]
2059 pub const fn midpoint(self, rhs: Self) -> Self {
2060 unsafe { Self::new_unchecked(self.get().midpoint(rhs.get())) }
2065 }
2066
2067 #[doc = concat!("let eight = NonZero::new(8", stringify!($Int), ")?;")]
2080 #[doc = concat!("let ten = NonZero::new(10", stringify!($Int), ")?;")]
2082 #[must_use]
2087 #[stable(feature = "nonzero_is_power_of_two", since = "1.59.0")]
2088 #[rustc_const_stable(feature = "nonzero_is_power_of_two", since = "1.59.0")]
2089 #[inline]
2090 pub const fn is_power_of_two(self) -> bool {
2091 intrinsics::ctpop(self.get()) < 2
2097 }
2098
2099 #[doc = concat!("let ten = NonZero::new(10", stringify!($Int), ")?;")]
2109 #[doc = concat!("let three = NonZero::new(3", stringify!($Int), ")?;")]
2110 #[stable(feature = "isqrt", since = "1.84.0")]
2116 #[rustc_const_stable(feature = "isqrt", since = "1.84.0")]
2117 #[must_use = "this returns the result of the operation, \
2118 without modifying the original"]
2119 #[inline]
2120 pub const fn isqrt(self) -> Self {
2121 let result = self.get().isqrt();
2122
2123 unsafe { Self::new_unchecked(result) }
2129 }
2130
2131 #[doc = concat!("let n = NonZero::<", stringify!($Int), ">::MAX;")]
2139 #[doc = concat!("assert_eq!(n.cast_signed(), NonZero::new(-1", stringify!($Sint), ").unwrap());")]
2141 #[stable(feature = "integer_sign_cast", since = "1.87.0")]
2143 #[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
2144 #[must_use = "this returns the result of the operation, \
2145 without modifying the original"]
2146 #[inline(always)]
2147 pub const fn cast_signed(self) -> NonZero<$Sint> {
2148 unsafe { NonZero::new_unchecked(self.get().cast_signed()) }
2150 }
2151
2152 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1)?.bit_width(), NonZero::new(1)?);")]
2162 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b111)?.bit_width(), NonZero::new(3)?);")]
2163 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::new(0b1110)?.bit_width(), NonZero::new(4)?);")]
2164 #[stable(feature = "uint_bit_width", since = "1.97.0")]
2168 #[rustc_const_stable(feature = "uint_bit_width", since = "1.97.0")]
2169 #[must_use = "this returns the result of the operation, \
2170 without modifying the original"]
2171 #[inline(always)]
2172 pub const fn bit_width(self) -> NonZero<u32> {
2173 unsafe { NonZero::new_unchecked(Self::BITS - self.leading_zeros()) }
2176 }
2177 };
2178
2179 (
2181 Primitive = signed $Int:ident,
2182 SignedPrimitive = $Sint:ty,
2183 UnsignedPrimitive = $Uint:ty,
2184 ) => {
2185 #[doc = concat!("equal to [`", stringify!($Int), "::MIN`].")]
2188 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MIN.get(), ", stringify!($Int), "::MIN);")]
2199 #[stable(feature = "nonzero_min_max", since = "1.70.0")]
2201 pub const MIN: Self = Self::new(<$Int>::MIN).unwrap();
2202
2203 #[doc = concat!("equal to [`", stringify!($Int), "::MAX`].")]
2206 #[doc = concat!("assert_eq!(NonZero::<", stringify!($Int), ">::MAX.get(), ", stringify!($Int), "::MAX);")]
2217 #[stable(feature = "nonzero_min_max", since = "1.70.0")]
2219 pub const MAX: Self = Self::new(<$Int>::MAX).unwrap();
2220
2221 #[doc = concat!("See [`", stringify!($Int), "::abs`]")]
2223 #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2233 #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2234 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2241 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2242 #[must_use = "this returns the result of the operation, \
2243 without modifying the original"]
2244 #[inline]
2245 pub const fn abs(self) -> Self {
2246 unsafe { Self::new_unchecked(self.get().abs()) }
2248 }
2249
2250 #[doc = concat!("`self == NonZero::<", stringify!($Int), ">::MIN`.")]
2253 #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2263 #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2264 #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2265 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2272 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2273 #[must_use = "this returns the result of the operation, \
2274 without modifying the original"]
2275 #[inline]
2276 pub const fn checked_abs(self) -> Option<Self> {
2277 if let Some(nz) = self.get().checked_abs() {
2278 Some(unsafe { Self::new_unchecked(nz) })
2280 } else {
2281 None
2282 }
2283 }
2284
2285 #[doc = concat!("[`", stringify!($Int), "::overflowing_abs`].")]
2288 #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2297 #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2298 #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2299 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2307 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2308 #[must_use = "this returns the result of the operation, \
2309 without modifying the original"]
2310 #[inline]
2311 pub const fn overflowing_abs(self) -> (Self, bool) {
2312 let (nz, flag) = self.get().overflowing_abs();
2313 (
2314 unsafe { Self::new_unchecked(nz) },
2316 flag,
2317 )
2318 }
2319
2320 #[doc = concat!("[`", stringify!($Int), "::saturating_abs`].")]
2322 #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2331 #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2332 #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2333 #[doc = concat!("let min_plus = NonZero::new(", stringify!($Int), "::MIN + 1)?;")]
2334 #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
2335 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2344 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2345 #[must_use = "this returns the result of the operation, \
2346 without modifying the original"]
2347 #[inline]
2348 pub const fn saturating_abs(self) -> Self {
2349 unsafe { Self::new_unchecked(self.get().saturating_abs()) }
2351 }
2352
2353 #[doc = concat!("[`", stringify!($Int), "::wrapping_abs`].")]
2355 #[doc = concat!("let pos = NonZero::new(1", stringify!($Int), ")?;")]
2364 #[doc = concat!("let neg = NonZero::new(-1", stringify!($Int), ")?;")]
2365 #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2366 #[doc = concat!("# let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
2367 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2376 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2377 #[must_use = "this returns the result of the operation, \
2378 without modifying the original"]
2379 #[inline]
2380 pub const fn wrapping_abs(self) -> Self {
2381 unsafe { Self::new_unchecked(self.get().wrapping_abs()) }
2383 }
2384
2385 #[doc = concat!("let u_pos = NonZero::new(1", stringify!($Uint), ")?;")]
2396 #[doc = concat!("let i_pos = NonZero::new(1", stringify!($Int), ")?;")]
2397 #[doc = concat!("let i_neg = NonZero::new(-1", stringify!($Int), ")?;")]
2398 #[doc = concat!("let i_min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2399 #[doc = concat!("let u_max = NonZero::new(", stringify!($Uint), "::MAX / 2 + 1)?;")]
2400 #[stable(feature = "nonzero_checked_ops", since = "1.64.0")]
2408 #[rustc_const_stable(feature = "const_nonzero_checked_ops", since = "1.64.0")]
2409 #[must_use = "this returns the result of the operation, \
2410 without modifying the original"]
2411 #[inline]
2412 pub const fn unsigned_abs(self) -> NonZero<$Uint> {
2413 unsafe { NonZero::new_unchecked(self.get().unsigned_abs()) }
2415 }
2416
2417 #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2428 #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2429 #[must_use]
2436 #[inline]
2437 #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2438 #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2439 pub const fn is_positive(self) -> bool {
2440 self.get().is_positive()
2441 }
2442
2443 #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2454 #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2455 #[must_use]
2462 #[inline]
2463 #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2464 #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2465 pub const fn is_negative(self) -> bool {
2466 self.get().is_negative()
2467 }
2468
2469 #[doc = concat!("returning `None` if `self == NonZero::<", stringify!($Int), ">::MIN`.")]
2471 #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2480 #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2481 #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2482 #[inline]
2489 #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2490 #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2491 pub const fn checked_neg(self) -> Option<Self> {
2492 if let Some(result) = self.get().checked_neg() {
2493 return Some(unsafe { Self::new_unchecked(result) });
2495 }
2496 None
2497 }
2498
2499 #[doc = concat!("See [`", stringify!($Int), "::overflowing_neg`]")]
2502 #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2512 #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2513 #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2514 #[inline]
2521 #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2522 #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2523 pub const fn overflowing_neg(self) -> (Self, bool) {
2524 let (result, overflow) = self.get().overflowing_neg();
2525 ((unsafe { Self::new_unchecked(result) }), overflow)
2527 }
2528
2529 #[doc = concat!("returning [`NonZero::<", stringify!($Int), ">::MAX`]")]
2531 #[doc = concat!("if `self == NonZero::<", stringify!($Int), ">::MIN`")]
2532 #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2542 #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2543 #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2544 #[doc = concat!("let min_plus_one = NonZero::new(", stringify!($Int), "::MIN + 1)?;")]
2545 #[doc = concat!("let max = NonZero::new(", stringify!($Int), "::MAX)?;")]
2546 #[inline]
2554 #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2555 #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2556 pub const fn saturating_neg(self) -> Self {
2557 if let Some(result) = self.checked_neg() {
2558 return result;
2559 }
2560 Self::MAX
2561 }
2562
2563 #[doc = concat!("See [`", stringify!($Int), "::wrapping_neg`]")]
2567 #[doc = concat!("let pos_five = NonZero::new(5", stringify!($Int), ")?;")]
2577 #[doc = concat!("let neg_five = NonZero::new(-5", stringify!($Int), ")?;")]
2578 #[doc = concat!("let min = NonZero::new(", stringify!($Int), "::MIN)?;")]
2579 #[inline]
2586 #[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2587 #[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
2588 pub const fn wrapping_neg(self) -> Self {
2589 let result = self.get().wrapping_neg();
2590 unsafe { Self::new_unchecked(result) }
2592 }
2593
2594 #[doc = concat!("let n = NonZero::new(-1", stringify!($Int), ").unwrap();")]
2602 #[doc = concat!("assert_eq!(n.cast_unsigned(), NonZero::<", stringify!($Uint), ">::MAX);")]
2604 #[stable(feature = "integer_sign_cast", since = "1.87.0")]
2606 #[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
2607 #[must_use = "this returns the result of the operation, \
2608 without modifying the original"]
2609 #[inline(always)]
2610 pub const fn cast_unsigned(self) -> NonZero<$Uint> {
2611 unsafe { NonZero::new_unchecked(self.get().cast_unsigned()) }
2613 }
2614
2615 #[doc = concat!("let limit = NonZero::<", stringify!($Uint), ">::new(100).unwrap();")]
2629 #[doc = concat!(" NonZero::<", stringify!($Int), ">::new(120).unwrap().clamp_magnitude(limit),")]
2632 #[doc = concat!(" NonZero::<", stringify!($Int), ">::new(100).unwrap(),")]
2633 #[doc = concat!(" NonZero::<", stringify!($Int), ">::new(-120).unwrap().clamp_magnitude(limit),")]
2637 #[doc = concat!(" NonZero::<", stringify!($Int), ">::new(-100).unwrap(),")]
2638 #[doc = concat!(" NonZero::<", stringify!($Int), ">::new(80).unwrap().clamp_magnitude(limit),")]
2642 #[doc = concat!(" NonZero::<", stringify!($Int), ">::new(80).unwrap(),")]
2643 #[doc = concat!(" NonZero::<", stringify!($Int), ">::new(-80).unwrap().clamp_magnitude(limit),")]
2647 #[doc = concat!(" NonZero::<", stringify!($Int), ">::new(-80).unwrap(),")]
2648 #[inline]
2651 #[must_use = "method returns a new number and does not mutate the original value"]
2652 #[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
2653 #[unstable(feature = "clamp_magnitude", issue = "148519")]
2654 pub const fn clamp_magnitude(self, limit: NonZero<$Uint>) -> Self {
2655 unsafe { Self::new_unchecked(self.get().clamp_magnitude(limit.get())) }
2657 }
2658
2659 };
2660}
2661
2662#[doc = "A [`u8`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroU8>` is the same size as `u8`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroU8>>(), size_of::<u8>());"]
#[doc =
"`NonZeroU8` is guaranteed to have the same layout and bit validity as `u8`"]
#[doc = "`Option<NonZeroU8>` is guaranteed to be ABI-compatible with `u8`,"]
#[doc = "`NonZeroU8` and `Option<NonZeroU8>`"]
#[doc = "use std::num::NonZeroU8;"]
#[doc = "assert_eq!(size_of::<NonZeroU8>(), size_of::<Option<NonZeroU8>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroU8>(), align_of::<Option<NonZeroU8>>());"]
#[doc = "`NonZeroU8`"]
#[doc = "use std::num::NonZeroU8;"]
#[doc =
"const TEN: NonZeroU8 = NonZeroU8::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "nonzero", since = "1.28.0")]
pub type NonZeroU8 = NonZero<u8>;
impl NonZero<u8> {
#[doc = "This value is equal to [`u8::BITS`]."]
#[doc = "assert_eq!(NonZero::<u8>::BITS, u8::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <u8>::BITS;
#[doc = "let n = NonZero::<u8>::new(u8::MAX)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as u8) }
}
#[doc = "let n = NonZero::<u8>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as u8) }
}
#[doc = "let a = NonZero::<u8>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<u8>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as u8) <<
(<u8>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as u8)
}
}
#[doc = "let a = NonZero::<u8>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<u8>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = "Note that this is equivalent to [`ilog2`](Self::ilog2)."]
#[doc = "assert_eq!(NonZero::<u8>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<u8>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<u8>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<u8>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<u8>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<u8>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<u8>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<u8>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(0x82u8)?;"]
#[doc = "let m = NonZero::new(0xa)?;"]
#[doc = "assert_eq!(n.rotate_left(2), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0xau8)?;"]
#[doc = "let m = NonZero::new(0x82)?;"]
#[doc = "assert_eq!(n.rotate_right(2), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12u8)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x12)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12u8)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroU8;"]
#[doc = "let n = NonZero::new(0x1Au8)?;"]
#[doc = " assert_eq!(NonZeroU8::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroU8::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = u8::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroU8;"]
#[doc = "let n = NonZero::new(0x1Au8)?;"]
#[doc = " assert_eq!(NonZeroU8::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroU8::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = u8::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Au8)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Au8)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "assert_eq!(NonZero::<u8>::MIN.get(), 1u8);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(1).unwrap();
#[doc = "equal to [`u8::MAX`]."]
#[doc = "assert_eq!(NonZero::<u8>::MAX.get(), u8::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<u8>::MAX).unwrap();
#[doc = "let one = NonZero::new(1u8)?;"]
#[doc = "let two = NonZero::new(2u8)?;"]
#[doc = "let max = NonZero::new(u8::MAX)?;"]
#[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 checked_add(self, other: u8) -> Option<Self> {
if let Some(result) = self.get().checked_add(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u8>::MAX`] on overflow."]
#[doc = "let one = NonZero::new(1u8)?;"]
#[doc = "let two = NonZero::new(2u8)?;"]
#[doc = "let max = NonZero::new(u8::MAX)?;"]
#[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 saturating_add(self, other: u8) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_add(other)) }
}
#[doc = "`self + rhs > u8::MAX`."]
#[doc = "let one = NonZero::new(1u8)?;"]
#[doc = "let two = NonZero::new(2u8)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_add(self, other: u8) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_add(other)) }
}
#[doc = "let one = NonZero::new(1u8).unwrap();"]
#[doc = "let max = NonZero::new(u8::MAX).unwrap();"]
#[doc = "let two = NonZero::new(2u8).unwrap();"]
#[doc = "let three = NonZero::new(3u8).unwrap();"]
#[stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
#[rustc_const_stable(feature = "unsigned_nonzero_div_ceil", since =
"1.92.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn div_ceil(self, rhs: Self) -> Self {
let v = (self.get() - 1) / rhs.get() + 1;
unsafe { Self::new_unchecked(v) }
}
#[doc = "let two = NonZero::new(2u8)?;"]
#[doc = "let three = NonZero::new(3u8)?;"]
#[doc = "let four = NonZero::new(4u8)?;"]
#[doc = "let max = NonZero::new(u8::MAX)?;"]
#[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 checked_next_power_of_two(self) -> Option<Self> {
if let Some(nz) = self.get().checked_next_power_of_two() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`u8::ilog2`],"]
#[doc = "assert_eq!(NonZero::new(7u8)?.ilog2(), 2);"]
#[doc = "assert_eq!(NonZero::new(8u8)?.ilog2(), 3);"]
#[doc = "assert_eq!(NonZero::new(9u8)?.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() }
#[doc = "[`u8::ilog10`],"]
#[doc = "assert_eq!(NonZero::new(99u8)?.ilog10(), 1);"]
#[doc = "assert_eq!(NonZero::new(100u8)?.ilog10(), 2);"]
#[doc = "assert_eq!(NonZero::new(101u8)?.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 { imp::int_log10::u8(self) }
#[doc = "let one = NonZero::new(1u8)?;"]
#[doc = "let two = NonZero::new(2u8)?;"]
#[doc = "let four = NonZero::new(4u8)?;"]
#[stable(feature = "num_midpoint", since = "1.85.0")]
#[rustc_const_stable(feature = "num_midpoint", since = "1.85.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[doc(alias = "average_floor")]
#[doc(alias = "average")]
#[inline]
pub const fn midpoint(self, rhs: Self) -> Self {
unsafe { Self::new_unchecked(self.get().midpoint(rhs.get())) }
}
#[doc = "let eight = NonZero::new(8u8)?;"]
#[doc = "let ten = NonZero::new(10u8)?;"]
#[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 {
intrinsics::ctpop(self.get()) < 2
}
#[doc = "let ten = NonZero::new(10u8)?;"]
#[doc = "let three = NonZero::new(3u8)?;"]
#[stable(feature = "isqrt", since = "1.84.0")]
#[rustc_const_stable(feature = "isqrt", since = "1.84.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn isqrt(self) -> Self {
let result = self.get().isqrt();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::<u8>::MAX;"]
#[doc = "assert_eq!(n.cast_signed(), NonZero::new(-1i8).unwrap());"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_signed(self) -> NonZero<i8> {
unsafe { NonZero::new_unchecked(self.get().cast_signed()) }
}
#[doc =
"assert_eq!(NonZero::<u8>::new(0b1)?.bit_width(), NonZero::new(1)?);"]
#[doc =
"assert_eq!(NonZero::<u8>::new(0b111)?.bit_width(), NonZero::new(3)?);"]
#[doc =
"assert_eq!(NonZero::<u8>::new(0b1110)?.bit_width(), NonZero::new(4)?);"]
#[stable(feature = "uint_bit_width", since = "1.97.0")]
#[rustc_const_stable(feature = "uint_bit_width", since = "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn bit_width(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(Self::BITS - self.leading_zeros()) }
}
#[doc = "let two = NonZero::new(2u8)?;"]
#[doc = "let four = NonZero::new(4u8)?;"]
#[doc = "let max = NonZero::new(u8::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u8>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2u8)?;"]
#[doc = "let four = NonZero::new(4u8)?;"]
#[doc = "let max = NonZero::new(u8::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > u8::MAX`."]
#[doc = "let two = NonZero::new(2u8)?;"]
#[doc = "let four = NonZero::new(4u8)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3u8)?;"]
#[doc = "let twenty_seven = NonZero::new(27u8)?;"]
#[doc = "let half_max = NonZero::new(u8::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u8>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3u8)?;"]
#[doc = "let twenty_seven = NonZero::new(27u8)?;"]
#[doc = "let max = NonZero::new(u8::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u8>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<u8>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u8>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<u8>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <u8>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u8>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<u8>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<u8> {
type Err = ParseIntError;
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u8>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<u8>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Div<NonZero<u8>> for u8 {
type Output = u8;
#[doc(alias = "unchecked_div")]
#[inline]
fn div(self, other: NonZero<u8>) -> u8 {
unsafe { intrinsics::unchecked_div(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl DivAssign<NonZero<u8>> for u8 {
#[inline]
fn div_assign(&mut self, other: NonZero<u8>) { *self = *self / other; }
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Rem<NonZero<u8>> for u8 {
type Output = u8;
#[inline]
fn rem(self, other: NonZero<u8>) -> u8 {
unsafe { intrinsics::unchecked_rem(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl RemAssign<NonZero<u8>> for u8 {
#[inline]
fn rem_assign(&mut self, other: NonZero<u8>) { *self = *self % other; }
}nonzero_integer! {
2663 Self = NonZeroU8,
2664 Primitive = unsigned u8,
2665 SignedPrimitive = i8,
2666 rot = 2,
2667 rot_op = "0x82",
2668 rot_result = "0xa",
2669 swap_op = "0x12",
2670 swapped = "0x12",
2671 reversed = "0x48",
2672}
2673
2674#[doc = "A [`u16`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroU16>` is the same size as `u16`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroU16>>(), size_of::<u16>());"]
#[doc =
"`NonZeroU16` is guaranteed to have the same layout and bit validity as `u16`"]
#[doc = "`Option<NonZeroU16>` is guaranteed to be ABI-compatible with `u16`,"]
#[doc = "`NonZeroU16` and `Option<NonZeroU16>`"]
#[doc = "use std::num::NonZeroU16;"]
#[doc =
"assert_eq!(size_of::<NonZeroU16>(), size_of::<Option<NonZeroU16>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroU16>(), align_of::<Option<NonZeroU16>>());"]
#[doc = "`NonZeroU16`"]
#[doc = "use std::num::NonZeroU16;"]
#[doc =
"const TEN: NonZeroU16 = NonZeroU16::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "nonzero", since = "1.28.0")]
pub type NonZeroU16 = NonZero<u16>;
impl NonZero<u16> {
#[doc = "This value is equal to [`u16::BITS`]."]
#[doc = "assert_eq!(NonZero::<u16>::BITS, u16::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <u16>::BITS;
#[doc = "let n = NonZero::<u16>::new(u16::MAX)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as u16) }
}
#[doc = "let n = NonZero::<u16>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as u16) }
}
#[doc = "let a = NonZero::<u16>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<u16>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as u16) <<
(<u16>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as u16)
}
}
#[doc = "let a = NonZero::<u16>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<u16>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = "Note that this is equivalent to [`ilog2`](Self::ilog2)."]
#[doc = "assert_eq!(NonZero::<u16>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<u16>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<u16>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<u16>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<u16>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<u16>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<u16>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<u16>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(0xa003u16)?;"]
#[doc = "let m = NonZero::new(0x3a)?;"]
#[doc = "assert_eq!(n.rotate_left(4), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x3au16)?;"]
#[doc = "let m = NonZero::new(0xa003)?;"]
#[doc = "assert_eq!(n.rotate_right(4), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234u16)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x3412)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234u16)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x2c48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroU16;"]
#[doc = "let n = NonZero::new(0x1Au16)?;"]
#[doc = " assert_eq!(NonZeroU16::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroU16::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = u16::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroU16;"]
#[doc = "let n = NonZero::new(0x1Au16)?;"]
#[doc = " assert_eq!(NonZeroU16::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroU16::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = u16::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Au16)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Au16)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "assert_eq!(NonZero::<u16>::MIN.get(), 1u16);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(1).unwrap();
#[doc = "equal to [`u16::MAX`]."]
#[doc = "assert_eq!(NonZero::<u16>::MAX.get(), u16::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<u16>::MAX).unwrap();
#[doc = "let one = NonZero::new(1u16)?;"]
#[doc = "let two = NonZero::new(2u16)?;"]
#[doc = "let max = NonZero::new(u16::MAX)?;"]
#[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 checked_add(self, other: u16) -> Option<Self> {
if let Some(result) = self.get().checked_add(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u16>::MAX`] on overflow."]
#[doc = "let one = NonZero::new(1u16)?;"]
#[doc = "let two = NonZero::new(2u16)?;"]
#[doc = "let max = NonZero::new(u16::MAX)?;"]
#[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 saturating_add(self, other: u16) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_add(other)) }
}
#[doc = "`self + rhs > u16::MAX`."]
#[doc = "let one = NonZero::new(1u16)?;"]
#[doc = "let two = NonZero::new(2u16)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_add(self, other: u16) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_add(other)) }
}
#[doc = "let one = NonZero::new(1u16).unwrap();"]
#[doc = "let max = NonZero::new(u16::MAX).unwrap();"]
#[doc = "let two = NonZero::new(2u16).unwrap();"]
#[doc = "let three = NonZero::new(3u16).unwrap();"]
#[stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
#[rustc_const_stable(feature = "unsigned_nonzero_div_ceil", since =
"1.92.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn div_ceil(self, rhs: Self) -> Self {
let v = (self.get() - 1) / rhs.get() + 1;
unsafe { Self::new_unchecked(v) }
}
#[doc = "let two = NonZero::new(2u16)?;"]
#[doc = "let three = NonZero::new(3u16)?;"]
#[doc = "let four = NonZero::new(4u16)?;"]
#[doc = "let max = NonZero::new(u16::MAX)?;"]
#[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 checked_next_power_of_two(self) -> Option<Self> {
if let Some(nz) = self.get().checked_next_power_of_two() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`u16::ilog2`],"]
#[doc = "assert_eq!(NonZero::new(7u16)?.ilog2(), 2);"]
#[doc = "assert_eq!(NonZero::new(8u16)?.ilog2(), 3);"]
#[doc = "assert_eq!(NonZero::new(9u16)?.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() }
#[doc = "[`u16::ilog10`],"]
#[doc = "assert_eq!(NonZero::new(99u16)?.ilog10(), 1);"]
#[doc = "assert_eq!(NonZero::new(100u16)?.ilog10(), 2);"]
#[doc = "assert_eq!(NonZero::new(101u16)?.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 { imp::int_log10::u16(self) }
#[doc = "let one = NonZero::new(1u16)?;"]
#[doc = "let two = NonZero::new(2u16)?;"]
#[doc = "let four = NonZero::new(4u16)?;"]
#[stable(feature = "num_midpoint", since = "1.85.0")]
#[rustc_const_stable(feature = "num_midpoint", since = "1.85.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[doc(alias = "average_floor")]
#[doc(alias = "average")]
#[inline]
pub const fn midpoint(self, rhs: Self) -> Self {
unsafe { Self::new_unchecked(self.get().midpoint(rhs.get())) }
}
#[doc = "let eight = NonZero::new(8u16)?;"]
#[doc = "let ten = NonZero::new(10u16)?;"]
#[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 {
intrinsics::ctpop(self.get()) < 2
}
#[doc = "let ten = NonZero::new(10u16)?;"]
#[doc = "let three = NonZero::new(3u16)?;"]
#[stable(feature = "isqrt", since = "1.84.0")]
#[rustc_const_stable(feature = "isqrt", since = "1.84.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn isqrt(self) -> Self {
let result = self.get().isqrt();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::<u16>::MAX;"]
#[doc = "assert_eq!(n.cast_signed(), NonZero::new(-1i16).unwrap());"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_signed(self) -> NonZero<i16> {
unsafe { NonZero::new_unchecked(self.get().cast_signed()) }
}
#[doc =
"assert_eq!(NonZero::<u16>::new(0b1)?.bit_width(), NonZero::new(1)?);"]
#[doc =
"assert_eq!(NonZero::<u16>::new(0b111)?.bit_width(), NonZero::new(3)?);"]
#[doc =
"assert_eq!(NonZero::<u16>::new(0b1110)?.bit_width(), NonZero::new(4)?);"]
#[stable(feature = "uint_bit_width", since = "1.97.0")]
#[rustc_const_stable(feature = "uint_bit_width", since = "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn bit_width(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(Self::BITS - self.leading_zeros()) }
}
#[doc = "let two = NonZero::new(2u16)?;"]
#[doc = "let four = NonZero::new(4u16)?;"]
#[doc = "let max = NonZero::new(u16::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u16>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2u16)?;"]
#[doc = "let four = NonZero::new(4u16)?;"]
#[doc = "let max = NonZero::new(u16::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > u16::MAX`."]
#[doc = "let two = NonZero::new(2u16)?;"]
#[doc = "let four = NonZero::new(4u16)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3u16)?;"]
#[doc = "let twenty_seven = NonZero::new(27u16)?;"]
#[doc = "let half_max = NonZero::new(u16::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u16>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3u16)?;"]
#[doc = "let twenty_seven = NonZero::new(27u16)?;"]
#[doc = "let max = NonZero::new(u16::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u16>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<u16>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u16>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<u16>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <u16>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u16>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<u16>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<u16> {
type Err = ParseIntError;
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u16>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<u16>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Div<NonZero<u16>> for u16 {
type Output = u16;
#[doc(alias = "unchecked_div")]
#[inline]
fn div(self, other: NonZero<u16>) -> u16 {
unsafe { intrinsics::unchecked_div(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl DivAssign<NonZero<u16>> for u16 {
#[inline]
fn div_assign(&mut self, other: NonZero<u16>) { *self = *self / other; }
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Rem<NonZero<u16>> for u16 {
type Output = u16;
#[inline]
fn rem(self, other: NonZero<u16>) -> u16 {
unsafe { intrinsics::unchecked_rem(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl RemAssign<NonZero<u16>> for u16 {
#[inline]
fn rem_assign(&mut self, other: NonZero<u16>) { *self = *self % other; }
}nonzero_integer! {
2675 Self = NonZeroU16,
2676 Primitive = unsigned u16,
2677 SignedPrimitive = i16,
2678 rot = 4,
2679 rot_op = "0xa003",
2680 rot_result = "0x3a",
2681 swap_op = "0x1234",
2682 swapped = "0x3412",
2683 reversed = "0x2c48",
2684}
2685
2686#[doc = "A [`u32`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroU32>` is the same size as `u32`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroU32>>(), size_of::<u32>());"]
#[doc =
"`NonZeroU32` is guaranteed to have the same layout and bit validity as `u32`"]
#[doc = "`Option<NonZeroU32>` is guaranteed to be ABI-compatible with `u32`,"]
#[doc = "`NonZeroU32` and `Option<NonZeroU32>`"]
#[doc = "use std::num::NonZeroU32;"]
#[doc =
"assert_eq!(size_of::<NonZeroU32>(), size_of::<Option<NonZeroU32>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroU32>(), align_of::<Option<NonZeroU32>>());"]
#[doc = "`NonZeroU32`"]
#[doc = "use std::num::NonZeroU32;"]
#[doc =
"const TEN: NonZeroU32 = NonZeroU32::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "nonzero", since = "1.28.0")]
pub type NonZeroU32 = NonZero<u32>;
impl NonZero<u32> {
#[doc = "This value is equal to [`u32::BITS`]."]
#[doc = "assert_eq!(NonZero::<u32>::BITS, u32::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <u32>::BITS;
#[doc = "let n = NonZero::<u32>::new(u32::MAX)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as u32) }
}
#[doc = "let n = NonZero::<u32>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as u32) }
}
#[doc = "let a = NonZero::<u32>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<u32>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as u32) <<
(<u32>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as u32)
}
}
#[doc = "let a = NonZero::<u32>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<u32>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = "Note that this is equivalent to [`ilog2`](Self::ilog2)."]
#[doc = "assert_eq!(NonZero::<u32>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<u32>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<u32>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<u32>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<u32>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<u32>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<u32>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<u32>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(0x10000b3u32)?;"]
#[doc = "let m = NonZero::new(0xb301)?;"]
#[doc = "assert_eq!(n.rotate_left(8), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0xb301u32)?;"]
#[doc = "let m = NonZero::new(0x10000b3)?;"]
#[doc = "assert_eq!(n.rotate_right(8), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12345678u32)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x78563412)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12345678u32)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x1e6a2c48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroU32;"]
#[doc = "let n = NonZero::new(0x1Au32)?;"]
#[doc = " assert_eq!(NonZeroU32::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroU32::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = u32::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroU32;"]
#[doc = "let n = NonZero::new(0x1Au32)?;"]
#[doc = " assert_eq!(NonZeroU32::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroU32::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = u32::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Au32)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Au32)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "assert_eq!(NonZero::<u32>::MIN.get(), 1u32);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(1).unwrap();
#[doc = "equal to [`u32::MAX`]."]
#[doc = "assert_eq!(NonZero::<u32>::MAX.get(), u32::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<u32>::MAX).unwrap();
#[doc = "let one = NonZero::new(1u32)?;"]
#[doc = "let two = NonZero::new(2u32)?;"]
#[doc = "let max = NonZero::new(u32::MAX)?;"]
#[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 checked_add(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_add(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u32>::MAX`] on overflow."]
#[doc = "let one = NonZero::new(1u32)?;"]
#[doc = "let two = NonZero::new(2u32)?;"]
#[doc = "let max = NonZero::new(u32::MAX)?;"]
#[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 saturating_add(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_add(other)) }
}
#[doc = "`self + rhs > u32::MAX`."]
#[doc = "let one = NonZero::new(1u32)?;"]
#[doc = "let two = NonZero::new(2u32)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_add(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_add(other)) }
}
#[doc = "let one = NonZero::new(1u32).unwrap();"]
#[doc = "let max = NonZero::new(u32::MAX).unwrap();"]
#[doc = "let two = NonZero::new(2u32).unwrap();"]
#[doc = "let three = NonZero::new(3u32).unwrap();"]
#[stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
#[rustc_const_stable(feature = "unsigned_nonzero_div_ceil", since =
"1.92.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn div_ceil(self, rhs: Self) -> Self {
let v = (self.get() - 1) / rhs.get() + 1;
unsafe { Self::new_unchecked(v) }
}
#[doc = "let two = NonZero::new(2u32)?;"]
#[doc = "let three = NonZero::new(3u32)?;"]
#[doc = "let four = NonZero::new(4u32)?;"]
#[doc = "let max = NonZero::new(u32::MAX)?;"]
#[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 checked_next_power_of_two(self) -> Option<Self> {
if let Some(nz) = self.get().checked_next_power_of_two() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`u32::ilog2`],"]
#[doc = "assert_eq!(NonZero::new(7u32)?.ilog2(), 2);"]
#[doc = "assert_eq!(NonZero::new(8u32)?.ilog2(), 3);"]
#[doc = "assert_eq!(NonZero::new(9u32)?.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() }
#[doc = "[`u32::ilog10`],"]
#[doc = "assert_eq!(NonZero::new(99u32)?.ilog10(), 1);"]
#[doc = "assert_eq!(NonZero::new(100u32)?.ilog10(), 2);"]
#[doc = "assert_eq!(NonZero::new(101u32)?.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 { imp::int_log10::u32(self) }
#[doc = "let one = NonZero::new(1u32)?;"]
#[doc = "let two = NonZero::new(2u32)?;"]
#[doc = "let four = NonZero::new(4u32)?;"]
#[stable(feature = "num_midpoint", since = "1.85.0")]
#[rustc_const_stable(feature = "num_midpoint", since = "1.85.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[doc(alias = "average_floor")]
#[doc(alias = "average")]
#[inline]
pub const fn midpoint(self, rhs: Self) -> Self {
unsafe { Self::new_unchecked(self.get().midpoint(rhs.get())) }
}
#[doc = "let eight = NonZero::new(8u32)?;"]
#[doc = "let ten = NonZero::new(10u32)?;"]
#[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 {
intrinsics::ctpop(self.get()) < 2
}
#[doc = "let ten = NonZero::new(10u32)?;"]
#[doc = "let three = NonZero::new(3u32)?;"]
#[stable(feature = "isqrt", since = "1.84.0")]
#[rustc_const_stable(feature = "isqrt", since = "1.84.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn isqrt(self) -> Self {
let result = self.get().isqrt();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::<u32>::MAX;"]
#[doc = "assert_eq!(n.cast_signed(), NonZero::new(-1i32).unwrap());"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_signed(self) -> NonZero<i32> {
unsafe { NonZero::new_unchecked(self.get().cast_signed()) }
}
#[doc =
"assert_eq!(NonZero::<u32>::new(0b1)?.bit_width(), NonZero::new(1)?);"]
#[doc =
"assert_eq!(NonZero::<u32>::new(0b111)?.bit_width(), NonZero::new(3)?);"]
#[doc =
"assert_eq!(NonZero::<u32>::new(0b1110)?.bit_width(), NonZero::new(4)?);"]
#[stable(feature = "uint_bit_width", since = "1.97.0")]
#[rustc_const_stable(feature = "uint_bit_width", since = "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn bit_width(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(Self::BITS - self.leading_zeros()) }
}
#[doc = "let two = NonZero::new(2u32)?;"]
#[doc = "let four = NonZero::new(4u32)?;"]
#[doc = "let max = NonZero::new(u32::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u32>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2u32)?;"]
#[doc = "let four = NonZero::new(4u32)?;"]
#[doc = "let max = NonZero::new(u32::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > u32::MAX`."]
#[doc = "let two = NonZero::new(2u32)?;"]
#[doc = "let four = NonZero::new(4u32)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3u32)?;"]
#[doc = "let twenty_seven = NonZero::new(27u32)?;"]
#[doc = "let half_max = NonZero::new(u32::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u32>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3u32)?;"]
#[doc = "let twenty_seven = NonZero::new(27u32)?;"]
#[doc = "let max = NonZero::new(u32::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u32>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<u32>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u32>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<u32>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <u32>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u32>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<u32>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<u32> {
type Err = ParseIntError;
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u32>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<u32>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Div<NonZero<u32>> for u32 {
type Output = u32;
#[doc(alias = "unchecked_div")]
#[inline]
fn div(self, other: NonZero<u32>) -> u32 {
unsafe { intrinsics::unchecked_div(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl DivAssign<NonZero<u32>> for u32 {
#[inline]
fn div_assign(&mut self, other: NonZero<u32>) { *self = *self / other; }
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Rem<NonZero<u32>> for u32 {
type Output = u32;
#[inline]
fn rem(self, other: NonZero<u32>) -> u32 {
unsafe { intrinsics::unchecked_rem(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl RemAssign<NonZero<u32>> for u32 {
#[inline]
fn rem_assign(&mut self, other: NonZero<u32>) { *self = *self % other; }
}nonzero_integer! {
2687 Self = NonZeroU32,
2688 Primitive = unsigned u32,
2689 SignedPrimitive = i32,
2690 rot = 8,
2691 rot_op = "0x10000b3",
2692 rot_result = "0xb301",
2693 swap_op = "0x12345678",
2694 swapped = "0x78563412",
2695 reversed = "0x1e6a2c48",
2696}
2697
2698#[doc = "A [`u64`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroU64>` is the same size as `u64`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroU64>>(), size_of::<u64>());"]
#[doc =
"`NonZeroU64` is guaranteed to have the same layout and bit validity as `u64`"]
#[doc = "`Option<NonZeroU64>` is guaranteed to be ABI-compatible with `u64`,"]
#[doc = "`NonZeroU64` and `Option<NonZeroU64>`"]
#[doc = "use std::num::NonZeroU64;"]
#[doc =
"assert_eq!(size_of::<NonZeroU64>(), size_of::<Option<NonZeroU64>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroU64>(), align_of::<Option<NonZeroU64>>());"]
#[doc = "`NonZeroU64`"]
#[doc = "use std::num::NonZeroU64;"]
#[doc =
"const TEN: NonZeroU64 = NonZeroU64::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "nonzero", since = "1.28.0")]
pub type NonZeroU64 = NonZero<u64>;
impl NonZero<u64> {
#[doc = "This value is equal to [`u64::BITS`]."]
#[doc = "assert_eq!(NonZero::<u64>::BITS, u64::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <u64>::BITS;
#[doc = "let n = NonZero::<u64>::new(u64::MAX)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as u64) }
}
#[doc = "let n = NonZero::<u64>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as u64) }
}
#[doc = "let a = NonZero::<u64>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<u64>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as u64) <<
(<u64>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as u64)
}
}
#[doc = "let a = NonZero::<u64>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<u64>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = "Note that this is equivalent to [`ilog2`](Self::ilog2)."]
#[doc = "assert_eq!(NonZero::<u64>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<u64>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<u64>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<u64>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<u64>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<u64>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<u64>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<u64>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(0xaa00000000006e1u64)?;"]
#[doc = "let m = NonZero::new(0x6e10aa)?;"]
#[doc = "assert_eq!(n.rotate_left(12), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x6e10aau64)?;"]
#[doc = "let m = NonZero::new(0xaa00000000006e1)?;"]
#[doc = "assert_eq!(n.rotate_right(12), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234567890123456u64)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x5634129078563412)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234567890123456u64)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x6a2c48091e6a2c48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroU64;"]
#[doc = "let n = NonZero::new(0x1Au64)?;"]
#[doc = " assert_eq!(NonZeroU64::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroU64::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = u64::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroU64;"]
#[doc = "let n = NonZero::new(0x1Au64)?;"]
#[doc = " assert_eq!(NonZeroU64::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroU64::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = u64::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Au64)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Au64)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "assert_eq!(NonZero::<u64>::MIN.get(), 1u64);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(1).unwrap();
#[doc = "equal to [`u64::MAX`]."]
#[doc = "assert_eq!(NonZero::<u64>::MAX.get(), u64::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<u64>::MAX).unwrap();
#[doc = "let one = NonZero::new(1u64)?;"]
#[doc = "let two = NonZero::new(2u64)?;"]
#[doc = "let max = NonZero::new(u64::MAX)?;"]
#[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 checked_add(self, other: u64) -> Option<Self> {
if let Some(result) = self.get().checked_add(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u64>::MAX`] on overflow."]
#[doc = "let one = NonZero::new(1u64)?;"]
#[doc = "let two = NonZero::new(2u64)?;"]
#[doc = "let max = NonZero::new(u64::MAX)?;"]
#[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 saturating_add(self, other: u64) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_add(other)) }
}
#[doc = "`self + rhs > u64::MAX`."]
#[doc = "let one = NonZero::new(1u64)?;"]
#[doc = "let two = NonZero::new(2u64)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_add(self, other: u64) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_add(other)) }
}
#[doc = "let one = NonZero::new(1u64).unwrap();"]
#[doc = "let max = NonZero::new(u64::MAX).unwrap();"]
#[doc = "let two = NonZero::new(2u64).unwrap();"]
#[doc = "let three = NonZero::new(3u64).unwrap();"]
#[stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
#[rustc_const_stable(feature = "unsigned_nonzero_div_ceil", since =
"1.92.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn div_ceil(self, rhs: Self) -> Self {
let v = (self.get() - 1) / rhs.get() + 1;
unsafe { Self::new_unchecked(v) }
}
#[doc = "let two = NonZero::new(2u64)?;"]
#[doc = "let three = NonZero::new(3u64)?;"]
#[doc = "let four = NonZero::new(4u64)?;"]
#[doc = "let max = NonZero::new(u64::MAX)?;"]
#[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 checked_next_power_of_two(self) -> Option<Self> {
if let Some(nz) = self.get().checked_next_power_of_two() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`u64::ilog2`],"]
#[doc = "assert_eq!(NonZero::new(7u64)?.ilog2(), 2);"]
#[doc = "assert_eq!(NonZero::new(8u64)?.ilog2(), 3);"]
#[doc = "assert_eq!(NonZero::new(9u64)?.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() }
#[doc = "[`u64::ilog10`],"]
#[doc = "assert_eq!(NonZero::new(99u64)?.ilog10(), 1);"]
#[doc = "assert_eq!(NonZero::new(100u64)?.ilog10(), 2);"]
#[doc = "assert_eq!(NonZero::new(101u64)?.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 { imp::int_log10::u64(self) }
#[doc = "let one = NonZero::new(1u64)?;"]
#[doc = "let two = NonZero::new(2u64)?;"]
#[doc = "let four = NonZero::new(4u64)?;"]
#[stable(feature = "num_midpoint", since = "1.85.0")]
#[rustc_const_stable(feature = "num_midpoint", since = "1.85.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[doc(alias = "average_floor")]
#[doc(alias = "average")]
#[inline]
pub const fn midpoint(self, rhs: Self) -> Self {
unsafe { Self::new_unchecked(self.get().midpoint(rhs.get())) }
}
#[doc = "let eight = NonZero::new(8u64)?;"]
#[doc = "let ten = NonZero::new(10u64)?;"]
#[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 {
intrinsics::ctpop(self.get()) < 2
}
#[doc = "let ten = NonZero::new(10u64)?;"]
#[doc = "let three = NonZero::new(3u64)?;"]
#[stable(feature = "isqrt", since = "1.84.0")]
#[rustc_const_stable(feature = "isqrt", since = "1.84.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn isqrt(self) -> Self {
let result = self.get().isqrt();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::<u64>::MAX;"]
#[doc = "assert_eq!(n.cast_signed(), NonZero::new(-1i64).unwrap());"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_signed(self) -> NonZero<i64> {
unsafe { NonZero::new_unchecked(self.get().cast_signed()) }
}
#[doc =
"assert_eq!(NonZero::<u64>::new(0b1)?.bit_width(), NonZero::new(1)?);"]
#[doc =
"assert_eq!(NonZero::<u64>::new(0b111)?.bit_width(), NonZero::new(3)?);"]
#[doc =
"assert_eq!(NonZero::<u64>::new(0b1110)?.bit_width(), NonZero::new(4)?);"]
#[stable(feature = "uint_bit_width", since = "1.97.0")]
#[rustc_const_stable(feature = "uint_bit_width", since = "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn bit_width(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(Self::BITS - self.leading_zeros()) }
}
#[doc = "let two = NonZero::new(2u64)?;"]
#[doc = "let four = NonZero::new(4u64)?;"]
#[doc = "let max = NonZero::new(u64::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u64>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2u64)?;"]
#[doc = "let four = NonZero::new(4u64)?;"]
#[doc = "let max = NonZero::new(u64::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > u64::MAX`."]
#[doc = "let two = NonZero::new(2u64)?;"]
#[doc = "let four = NonZero::new(4u64)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3u64)?;"]
#[doc = "let twenty_seven = NonZero::new(27u64)?;"]
#[doc = "let half_max = NonZero::new(u64::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u64>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3u64)?;"]
#[doc = "let twenty_seven = NonZero::new(27u64)?;"]
#[doc = "let max = NonZero::new(u64::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u64>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<u64>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u64>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<u64>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <u64>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u64>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<u64>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<u64> {
type Err = ParseIntError;
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u64>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<u64>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Div<NonZero<u64>> for u64 {
type Output = u64;
#[doc(alias = "unchecked_div")]
#[inline]
fn div(self, other: NonZero<u64>) -> u64 {
unsafe { intrinsics::unchecked_div(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl DivAssign<NonZero<u64>> for u64 {
#[inline]
fn div_assign(&mut self, other: NonZero<u64>) { *self = *self / other; }
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Rem<NonZero<u64>> for u64 {
type Output = u64;
#[inline]
fn rem(self, other: NonZero<u64>) -> u64 {
unsafe { intrinsics::unchecked_rem(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl RemAssign<NonZero<u64>> for u64 {
#[inline]
fn rem_assign(&mut self, other: NonZero<u64>) { *self = *self % other; }
}nonzero_integer! {
2699 Self = NonZeroU64,
2700 Primitive = unsigned u64,
2701 SignedPrimitive = i64,
2702 rot = 12,
2703 rot_op = "0xaa00000000006e1",
2704 rot_result = "0x6e10aa",
2705 swap_op = "0x1234567890123456",
2706 swapped = "0x5634129078563412",
2707 reversed = "0x6a2c48091e6a2c48",
2708}
2709
2710#[doc = "A [`u128`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroU128>` is the same size as `u128`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroU128>>(), size_of::<u128>());"]
#[doc =
"`NonZeroU128` is guaranteed to have the same layout and bit validity as `u128`"]
#[doc =
"`Option<NonZeroU128>` is guaranteed to be ABI-compatible with `u128`,"]
#[doc = "`NonZeroU128` and `Option<NonZeroU128>`"]
#[doc = "use std::num::NonZeroU128;"]
#[doc =
"assert_eq!(size_of::<NonZeroU128>(), size_of::<Option<NonZeroU128>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroU128>(), align_of::<Option<NonZeroU128>>());"]
#[doc = "`NonZeroU128`"]
#[doc = "use std::num::NonZeroU128;"]
#[doc =
"const TEN: NonZeroU128 = NonZeroU128::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "nonzero", since = "1.28.0")]
pub type NonZeroU128 = NonZero<u128>;
impl NonZero<u128> {
#[doc = "This value is equal to [`u128::BITS`]."]
#[doc = "assert_eq!(NonZero::<u128>::BITS, u128::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <u128>::BITS;
#[doc = "let n = NonZero::<u128>::new(u128::MAX)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as u128) }
}
#[doc = "let n = NonZero::<u128>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as u128) }
}
#[doc = "let a = NonZero::<u128>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<u128>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as u128) <<
(<u128>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as u128)
}
}
#[doc = "let a = NonZero::<u128>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<u128>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = "Note that this is equivalent to [`ilog2`](Self::ilog2)."]
#[doc = "assert_eq!(NonZero::<u128>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<u128>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<u128>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<u128>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<u128>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<u128>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<u128>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<u128>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(0x13f40000000000000000000000004f76u128)?;"]
#[doc = "let m = NonZero::new(0x4f7613f4)?;"]
#[doc = "assert_eq!(n.rotate_left(16), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x4f7613f4u128)?;"]
#[doc = "let m = NonZero::new(0x13f40000000000000000000000004f76)?;"]
#[doc = "assert_eq!(n.rotate_right(16), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12345678901234567890123456789012u128)?;"]
#[doc =
"assert_eq!(m, NonZero::new(0x12907856341290785634129078563412)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12345678901234567890123456789012u128)?;"]
#[doc =
"assert_eq!(m, NonZero::new(0x48091e6a2c48091e6a2c48091e6a2c48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroU128;"]
#[doc = "let n = NonZero::new(0x1Au128)?;"]
#[doc = " assert_eq!(NonZeroU128::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroU128::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = u128::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroU128;"]
#[doc = "let n = NonZero::new(0x1Au128)?;"]
#[doc = " assert_eq!(NonZeroU128::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroU128::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = u128::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Au128)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Au128)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "assert_eq!(NonZero::<u128>::MIN.get(), 1u128);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(1).unwrap();
#[doc = "equal to [`u128::MAX`]."]
#[doc = "assert_eq!(NonZero::<u128>::MAX.get(), u128::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<u128>::MAX).unwrap();
#[doc = "let one = NonZero::new(1u128)?;"]
#[doc = "let two = NonZero::new(2u128)?;"]
#[doc = "let max = NonZero::new(u128::MAX)?;"]
#[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 checked_add(self, other: u128) -> Option<Self> {
if let Some(result) = self.get().checked_add(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u128>::MAX`] on overflow."]
#[doc = "let one = NonZero::new(1u128)?;"]
#[doc = "let two = NonZero::new(2u128)?;"]
#[doc = "let max = NonZero::new(u128::MAX)?;"]
#[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 saturating_add(self, other: u128) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_add(other)) }
}
#[doc = "`self + rhs > u128::MAX`."]
#[doc = "let one = NonZero::new(1u128)?;"]
#[doc = "let two = NonZero::new(2u128)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_add(self, other: u128) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_add(other)) }
}
#[doc = "let one = NonZero::new(1u128).unwrap();"]
#[doc = "let max = NonZero::new(u128::MAX).unwrap();"]
#[doc = "let two = NonZero::new(2u128).unwrap();"]
#[doc = "let three = NonZero::new(3u128).unwrap();"]
#[stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
#[rustc_const_stable(feature = "unsigned_nonzero_div_ceil", since =
"1.92.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn div_ceil(self, rhs: Self) -> Self {
let v = (self.get() - 1) / rhs.get() + 1;
unsafe { Self::new_unchecked(v) }
}
#[doc = "let two = NonZero::new(2u128)?;"]
#[doc = "let three = NonZero::new(3u128)?;"]
#[doc = "let four = NonZero::new(4u128)?;"]
#[doc = "let max = NonZero::new(u128::MAX)?;"]
#[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 checked_next_power_of_two(self) -> Option<Self> {
if let Some(nz) = self.get().checked_next_power_of_two() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`u128::ilog2`],"]
#[doc = "assert_eq!(NonZero::new(7u128)?.ilog2(), 2);"]
#[doc = "assert_eq!(NonZero::new(8u128)?.ilog2(), 3);"]
#[doc = "assert_eq!(NonZero::new(9u128)?.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() }
#[doc = "[`u128::ilog10`],"]
#[doc = "assert_eq!(NonZero::new(99u128)?.ilog10(), 1);"]
#[doc = "assert_eq!(NonZero::new(100u128)?.ilog10(), 2);"]
#[doc = "assert_eq!(NonZero::new(101u128)?.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 { imp::int_log10::u128(self) }
#[doc = "let one = NonZero::new(1u128)?;"]
#[doc = "let two = NonZero::new(2u128)?;"]
#[doc = "let four = NonZero::new(4u128)?;"]
#[stable(feature = "num_midpoint", since = "1.85.0")]
#[rustc_const_stable(feature = "num_midpoint", since = "1.85.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[doc(alias = "average_floor")]
#[doc(alias = "average")]
#[inline]
pub const fn midpoint(self, rhs: Self) -> Self {
unsafe { Self::new_unchecked(self.get().midpoint(rhs.get())) }
}
#[doc = "let eight = NonZero::new(8u128)?;"]
#[doc = "let ten = NonZero::new(10u128)?;"]
#[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 {
intrinsics::ctpop(self.get()) < 2
}
#[doc = "let ten = NonZero::new(10u128)?;"]
#[doc = "let three = NonZero::new(3u128)?;"]
#[stable(feature = "isqrt", since = "1.84.0")]
#[rustc_const_stable(feature = "isqrt", since = "1.84.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn isqrt(self) -> Self {
let result = self.get().isqrt();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::<u128>::MAX;"]
#[doc = "assert_eq!(n.cast_signed(), NonZero::new(-1i128).unwrap());"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_signed(self) -> NonZero<i128> {
unsafe { NonZero::new_unchecked(self.get().cast_signed()) }
}
#[doc =
"assert_eq!(NonZero::<u128>::new(0b1)?.bit_width(), NonZero::new(1)?);"]
#[doc =
"assert_eq!(NonZero::<u128>::new(0b111)?.bit_width(), NonZero::new(3)?);"]
#[doc =
"assert_eq!(NonZero::<u128>::new(0b1110)?.bit_width(), NonZero::new(4)?);"]
#[stable(feature = "uint_bit_width", since = "1.97.0")]
#[rustc_const_stable(feature = "uint_bit_width", since = "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn bit_width(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(Self::BITS - self.leading_zeros()) }
}
#[doc = "let two = NonZero::new(2u128)?;"]
#[doc = "let four = NonZero::new(4u128)?;"]
#[doc = "let max = NonZero::new(u128::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u128>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2u128)?;"]
#[doc = "let four = NonZero::new(4u128)?;"]
#[doc = "let max = NonZero::new(u128::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > u128::MAX`."]
#[doc = "let two = NonZero::new(2u128)?;"]
#[doc = "let four = NonZero::new(4u128)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3u128)?;"]
#[doc = "let twenty_seven = NonZero::new(27u128)?;"]
#[doc = "let half_max = NonZero::new(u128::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<u128>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3u128)?;"]
#[doc = "let twenty_seven = NonZero::new(27u128)?;"]
#[doc = "let max = NonZero::new(u128::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u128>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<u128>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u128>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<u128>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <u128>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u128>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<u128>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<u128> {
type Err = ParseIntError;
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<u128>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<u128>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Div<NonZero<u128>> for u128 {
type Output = u128;
#[doc(alias = "unchecked_div")]
#[inline]
fn div(self, other: NonZero<u128>) -> u128 {
unsafe { intrinsics::unchecked_div(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl DivAssign<NonZero<u128>> for u128 {
#[inline]
fn div_assign(&mut self, other: NonZero<u128>) { *self = *self / other; }
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Rem<NonZero<u128>> for u128 {
type Output = u128;
#[inline]
fn rem(self, other: NonZero<u128>) -> u128 {
unsafe { intrinsics::unchecked_rem(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl RemAssign<NonZero<u128>> for u128 {
#[inline]
fn rem_assign(&mut self, other: NonZero<u128>) { *self = *self % other; }
}nonzero_integer! {
2711 Self = NonZeroU128,
2712 Primitive = unsigned u128,
2713 SignedPrimitive = i128,
2714 rot = 16,
2715 rot_op = "0x13f40000000000000000000000004f76",
2716 rot_result = "0x4f7613f4",
2717 swap_op = "0x12345678901234567890123456789012",
2718 swapped = "0x12907856341290785634129078563412",
2719 reversed = "0x48091e6a2c48091e6a2c48091e6a2c48",
2720}
2721
2722#[cfg(target_pointer_width = "16")]
2723nonzero_integer! {
2724 Self = NonZeroUsize,
2725 Primitive = unsigned usize,
2726 SignedPrimitive = isize,
2727 rot = 4,
2728 rot_op = "0xa003",
2729 rot_result = "0x3a",
2730 swap_op = "0x1234",
2731 swapped = "0x3412",
2732 reversed = "0x2c48",
2733}
2734
2735#[cfg(target_pointer_width = "32")]
2736nonzero_integer! {
2737 Self = NonZeroUsize,
2738 Primitive = unsigned usize,
2739 SignedPrimitive = isize,
2740 rot = 8,
2741 rot_op = "0x10000b3",
2742 rot_result = "0xb301",
2743 swap_op = "0x12345678",
2744 swapped = "0x78563412",
2745 reversed = "0x1e6a2c48",
2746}
2747
2748#[cfg(target_pointer_width = "64")]
2749#[doc = "A [`usize`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroUsize>` is the same size as `usize`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroUsize>>(), size_of::<usize>());"]
#[doc =
"`NonZeroUsize` is guaranteed to have the same layout and bit validity as `usize`"]
#[doc =
"`Option<NonZeroUsize>` is guaranteed to be ABI-compatible with `usize`,"]
#[doc = "`NonZeroUsize` and `Option<NonZeroUsize>`"]
#[doc = "use std::num::NonZeroUsize;"]
#[doc =
"assert_eq!(size_of::<NonZeroUsize>(), size_of::<Option<NonZeroUsize>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroUsize>(), align_of::<Option<NonZeroUsize>>());"]
#[doc = "`NonZeroUsize`"]
#[doc = "use std::num::NonZeroUsize;"]
#[doc =
"const TEN: NonZeroUsize = NonZeroUsize::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "nonzero", since = "1.28.0")]
pub type NonZeroUsize = NonZero<usize>;
impl NonZero<usize> {
#[doc = "This value is equal to [`usize::BITS`]."]
#[doc = "assert_eq!(NonZero::<usize>::BITS, usize::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <usize>::BITS;
#[doc = "let n = NonZero::<usize>::new(usize::MAX)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as usize) }
}
#[doc = "let n = NonZero::<usize>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as usize) }
}
#[doc = "let a = NonZero::<usize>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<usize>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as usize) <<
(<usize>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as usize)
}
}
#[doc = "let a = NonZero::<usize>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<usize>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = "Note that this is equivalent to [`ilog2`](Self::ilog2)."]
#[doc = "assert_eq!(NonZero::<usize>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<usize>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<usize>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<usize>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<usize>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<usize>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<usize>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<usize>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(0xaa00000000006e1usize)?;"]
#[doc = "let m = NonZero::new(0x6e10aa)?;"]
#[doc = "assert_eq!(n.rotate_left(12), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x6e10aausize)?;"]
#[doc = "let m = NonZero::new(0xaa00000000006e1)?;"]
#[doc = "assert_eq!(n.rotate_right(12), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234567890123456usize)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x5634129078563412)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234567890123456usize)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x6a2c48091e6a2c48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroUsize;"]
#[doc = "let n = NonZero::new(0x1Ausize)?;"]
#[doc = " assert_eq!(NonZeroUsize::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroUsize::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = usize::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroUsize;"]
#[doc = "let n = NonZero::new(0x1Ausize)?;"]
#[doc = " assert_eq!(NonZeroUsize::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroUsize::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = usize::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ausize)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ausize)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "assert_eq!(NonZero::<usize>::MIN.get(), 1usize);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(1).unwrap();
#[doc = "equal to [`usize::MAX`]."]
#[doc = "assert_eq!(NonZero::<usize>::MAX.get(), usize::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<usize>::MAX).unwrap();
#[doc = "let one = NonZero::new(1usize)?;"]
#[doc = "let two = NonZero::new(2usize)?;"]
#[doc = "let max = NonZero::new(usize::MAX)?;"]
#[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 checked_add(self, other: usize) -> Option<Self> {
if let Some(result) = self.get().checked_add(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<usize>::MAX`] on overflow."]
#[doc = "let one = NonZero::new(1usize)?;"]
#[doc = "let two = NonZero::new(2usize)?;"]
#[doc = "let max = NonZero::new(usize::MAX)?;"]
#[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 saturating_add(self, other: usize) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_add(other)) }
}
#[doc = "`self + rhs > usize::MAX`."]
#[doc = "let one = NonZero::new(1usize)?;"]
#[doc = "let two = NonZero::new(2usize)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_add(self, other: usize) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_add(other)) }
}
#[doc = "let one = NonZero::new(1usize).unwrap();"]
#[doc = "let max = NonZero::new(usize::MAX).unwrap();"]
#[doc = "let two = NonZero::new(2usize).unwrap();"]
#[doc = "let three = NonZero::new(3usize).unwrap();"]
#[stable(feature = "unsigned_nonzero_div_ceil", since = "1.92.0")]
#[rustc_const_stable(feature = "unsigned_nonzero_div_ceil", since =
"1.92.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn div_ceil(self, rhs: Self) -> Self {
let v = (self.get() - 1) / rhs.get() + 1;
unsafe { Self::new_unchecked(v) }
}
#[doc = "let two = NonZero::new(2usize)?;"]
#[doc = "let three = NonZero::new(3usize)?;"]
#[doc = "let four = NonZero::new(4usize)?;"]
#[doc = "let max = NonZero::new(usize::MAX)?;"]
#[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 checked_next_power_of_two(self) -> Option<Self> {
if let Some(nz) = self.get().checked_next_power_of_two() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`usize::ilog2`],"]
#[doc = "assert_eq!(NonZero::new(7usize)?.ilog2(), 2);"]
#[doc = "assert_eq!(NonZero::new(8usize)?.ilog2(), 3);"]
#[doc = "assert_eq!(NonZero::new(9usize)?.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() }
#[doc = "[`usize::ilog10`],"]
#[doc = "assert_eq!(NonZero::new(99usize)?.ilog10(), 1);"]
#[doc = "assert_eq!(NonZero::new(100usize)?.ilog10(), 2);"]
#[doc = "assert_eq!(NonZero::new(101usize)?.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 { imp::int_log10::usize(self) }
#[doc = "let one = NonZero::new(1usize)?;"]
#[doc = "let two = NonZero::new(2usize)?;"]
#[doc = "let four = NonZero::new(4usize)?;"]
#[stable(feature = "num_midpoint", since = "1.85.0")]
#[rustc_const_stable(feature = "num_midpoint", since = "1.85.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[doc(alias = "average_floor")]
#[doc(alias = "average")]
#[inline]
pub const fn midpoint(self, rhs: Self) -> Self {
unsafe { Self::new_unchecked(self.get().midpoint(rhs.get())) }
}
#[doc = "let eight = NonZero::new(8usize)?;"]
#[doc = "let ten = NonZero::new(10usize)?;"]
#[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 {
intrinsics::ctpop(self.get()) < 2
}
#[doc = "let ten = NonZero::new(10usize)?;"]
#[doc = "let three = NonZero::new(3usize)?;"]
#[stable(feature = "isqrt", since = "1.84.0")]
#[rustc_const_stable(feature = "isqrt", since = "1.84.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const fn isqrt(self) -> Self {
let result = self.get().isqrt();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::<usize>::MAX;"]
#[doc = "assert_eq!(n.cast_signed(), NonZero::new(-1isize).unwrap());"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_signed(self) -> NonZero<isize> {
unsafe { NonZero::new_unchecked(self.get().cast_signed()) }
}
#[doc =
"assert_eq!(NonZero::<usize>::new(0b1)?.bit_width(), NonZero::new(1)?);"]
#[doc =
"assert_eq!(NonZero::<usize>::new(0b111)?.bit_width(), NonZero::new(3)?);"]
#[doc =
"assert_eq!(NonZero::<usize>::new(0b1110)?.bit_width(), NonZero::new(4)?);"]
#[stable(feature = "uint_bit_width", since = "1.97.0")]
#[rustc_const_stable(feature = "uint_bit_width", since = "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn bit_width(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(Self::BITS - self.leading_zeros()) }
}
#[doc = "let two = NonZero::new(2usize)?;"]
#[doc = "let four = NonZero::new(4usize)?;"]
#[doc = "let max = NonZero::new(usize::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<usize>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2usize)?;"]
#[doc = "let four = NonZero::new(4usize)?;"]
#[doc = "let max = NonZero::new(usize::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > usize::MAX`."]
#[doc = "let two = NonZero::new(2usize)?;"]
#[doc = "let four = NonZero::new(4usize)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3usize)?;"]
#[doc = "let twenty_seven = NonZero::new(27usize)?;"]
#[doc = "let half_max = NonZero::new(usize::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<usize>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3usize)?;"]
#[doc = "let twenty_seven = NonZero::new(27usize)?;"]
#[doc = "let max = NonZero::new(usize::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<usize>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<usize>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<usize>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<usize>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <usize>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<usize>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<usize>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<usize> {
type Err = ParseIntError;
#[doc = " `+` "]
#[doc =
"assert_eq!(NonZero::<usize>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<usize>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Div<NonZero<usize>> for usize {
type Output = usize;
#[doc(alias = "unchecked_div")]
#[inline]
fn div(self, other: NonZero<usize>) -> usize {
unsafe { intrinsics::unchecked_div(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl DivAssign<NonZero<usize>> for usize {
#[inline]
fn div_assign(&mut self, other: NonZero<usize>) { *self = *self / other; }
}
#[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Rem<NonZero<usize>> for usize {
type Output = usize;
#[inline]
fn rem(self, other: NonZero<usize>) -> usize {
unsafe { intrinsics::unchecked_rem(self, other.get()) }
}
}
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl RemAssign<NonZero<usize>> for usize {
#[inline]
fn rem_assign(&mut self, other: NonZero<usize>) { *self = *self % other; }
}nonzero_integer! {
2750 Self = NonZeroUsize,
2751 Primitive = unsigned usize,
2752 SignedPrimitive = isize,
2753 rot = 12,
2754 rot_op = "0xaa00000000006e1",
2755 rot_result = "0x6e10aa",
2756 swap_op = "0x1234567890123456",
2757 swapped = "0x5634129078563412",
2758 reversed = "0x6a2c48091e6a2c48",
2759}
2760
2761#[doc = "An [`i8`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroI8>` is the same size as `i8`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroI8>>(), size_of::<i8>());"]
#[doc =
"`NonZeroI8` is guaranteed to have the same layout and bit validity as `i8`"]
#[doc = "`Option<NonZeroI8>` is guaranteed to be ABI-compatible with `i8`,"]
#[doc = "`NonZeroI8` and `Option<NonZeroI8>`"]
#[doc = "use std::num::NonZeroI8;"]
#[doc = "assert_eq!(size_of::<NonZeroI8>(), size_of::<Option<NonZeroI8>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroI8>(), align_of::<Option<NonZeroI8>>());"]
#[doc = "`NonZeroI8`"]
#[doc = "use std::num::NonZeroI8;"]
#[doc =
"const TEN: NonZeroI8 = NonZeroI8::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "signed_nonzero", since = "1.34.0")]
pub type NonZeroI8 = NonZero<i8>;
impl NonZero<i8> {
#[doc = "This value is equal to [`i8::BITS`]."]
#[doc = "assert_eq!(NonZero::<i8>::BITS, i8::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <i8>::BITS;
#[doc = "let n = NonZero::<i8>::new(-1i8)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as u8) }
}
#[doc = "let n = NonZero::<i8>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as u8) }
}
#[doc = "let a = NonZero::<i8>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<i8>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as u8) <<
(<u8>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as i8)
}
}
#[doc = "let a = NonZero::<i8>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<i8>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = ""]
#[doc = "assert_eq!(NonZero::<i8>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<i8>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<i8>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<i8>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<i8>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<i8>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<i8>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<i8>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(-0x7ei8)?;"]
#[doc = "let m = NonZero::new(0xa)?;"]
#[doc = "assert_eq!(n.rotate_left(2), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0xai8)?;"]
#[doc = "let m = NonZero::new(-0x7e)?;"]
#[doc = "assert_eq!(n.rotate_right(2), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12i8)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x12)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12i8)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroI8;"]
#[doc = "let n = NonZero::new(0x1Ai8)?;"]
#[doc = " assert_eq!(NonZeroI8::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroI8::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = i8::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroI8;"]
#[doc = "let n = NonZero::new(0x1Ai8)?;"]
#[doc = " assert_eq!(NonZeroI8::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroI8::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = i8::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ai8)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ai8)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "equal to [`i8::MIN`]."]
#[doc = "assert_eq!(NonZero::<i8>::MIN.get(), i8::MIN);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(<i8>::MIN).unwrap();
#[doc = "equal to [`i8::MAX`]."]
#[doc = "assert_eq!(NonZero::<i8>::MAX.get(), i8::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<i8>::MAX).unwrap();
#[doc = "See [`i8::abs`]"]
#[doc = "let pos = NonZero::new(1i8)?;"]
#[doc = "let neg = NonZero::new(-1i8)?;"]
#[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 abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().abs()) }
}
#[doc = "`self == NonZero::<i8>::MIN`."]
#[doc = "let pos = NonZero::new(1i8)?;"]
#[doc = "let neg = NonZero::new(-1i8)?;"]
#[doc = "let min = NonZero::new(i8::MIN)?;"]
#[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 checked_abs(self) -> Option<Self> {
if let Some(nz) = self.get().checked_abs() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`i8::overflowing_abs`]."]
#[doc = "let pos = NonZero::new(1i8)?;"]
#[doc = "let neg = NonZero::new(-1i8)?;"]
#[doc = "let min = NonZero::new(i8::MIN)?;"]
#[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 overflowing_abs(self) -> (Self, bool) {
let (nz, flag) = self.get().overflowing_abs();
(unsafe { Self::new_unchecked(nz) }, flag)
}
#[doc = "[`i8::saturating_abs`]."]
#[doc = "let pos = NonZero::new(1i8)?;"]
#[doc = "let neg = NonZero::new(-1i8)?;"]
#[doc = "let min = NonZero::new(i8::MIN)?;"]
#[doc = "let min_plus = NonZero::new(i8::MIN + 1)?;"]
#[doc = "let max = NonZero::new(i8::MAX)?;"]
#[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 saturating_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_abs()) }
}
#[doc = "[`i8::wrapping_abs`]."]
#[doc = "let pos = NonZero::new(1i8)?;"]
#[doc = "let neg = NonZero::new(-1i8)?;"]
#[doc = "let min = NonZero::new(i8::MIN)?;"]
#[doc = "# let max = NonZero::new(i8::MAX)?;"]
#[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 wrapping_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().wrapping_abs()) }
}
#[doc = "let u_pos = NonZero::new(1u8)?;"]
#[doc = "let i_pos = NonZero::new(1i8)?;"]
#[doc = "let i_neg = NonZero::new(-1i8)?;"]
#[doc = "let i_min = NonZero::new(i8::MIN)?;"]
#[doc = "let u_max = NonZero::new(u8::MAX / 2 + 1)?;"]
#[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) -> NonZero<u8> {
unsafe { NonZero::new_unchecked(self.get().unsigned_abs()) }
}
#[doc = "let pos_five = NonZero::new(5i8)?;"]
#[doc = "let neg_five = NonZero::new(-5i8)?;"]
#[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() }
#[doc = "let pos_five = NonZero::new(5i8)?;"]
#[doc = "let neg_five = NonZero::new(-5i8)?;"]
#[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() }
#[doc = "returning `None` if `self == NonZero::<i8>::MIN`."]
#[doc = "let pos_five = NonZero::new(5i8)?;"]
#[doc = "let neg_five = NonZero::new(-5i8)?;"]
#[doc = "let min = NonZero::new(i8::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn checked_neg(self) -> Option<Self> {
if let Some(result) = self.get().checked_neg() {
return Some(unsafe { Self::new_unchecked(result) });
}
None
}
#[doc = "See [`i8::overflowing_neg`]"]
#[doc = "let pos_five = NonZero::new(5i8)?;"]
#[doc = "let neg_five = NonZero::new(-5i8)?;"]
#[doc = "let min = NonZero::new(i8::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn overflowing_neg(self) -> (Self, bool) {
let (result, overflow) = self.get().overflowing_neg();
((unsafe { Self::new_unchecked(result) }), overflow)
}
#[doc = "returning [`NonZero::<i8>::MAX`]"]
#[doc = "if `self == NonZero::<i8>::MIN`"]
#[doc = "let pos_five = NonZero::new(5i8)?;"]
#[doc = "let neg_five = NonZero::new(-5i8)?;"]
#[doc = "let min = NonZero::new(i8::MIN)?;"]
#[doc = "let min_plus_one = NonZero::new(i8::MIN + 1)?;"]
#[doc = "let max = NonZero::new(i8::MAX)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn saturating_neg(self) -> Self {
if let Some(result) = self.checked_neg() { return result; }
Self::MAX
}
#[doc = "See [`i8::wrapping_neg`]"]
#[doc = "let pos_five = NonZero::new(5i8)?;"]
#[doc = "let neg_five = NonZero::new(-5i8)?;"]
#[doc = "let min = NonZero::new(i8::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn wrapping_neg(self) -> Self {
let result = self.get().wrapping_neg();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(-1i8).unwrap();"]
#[doc = "assert_eq!(n.cast_unsigned(), NonZero::<u8>::MAX);"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_unsigned(self) -> NonZero<u8> {
unsafe { NonZero::new_unchecked(self.get().cast_unsigned()) }
}
#[doc = "let limit = NonZero::<u8>::new(100).unwrap();"]
#[doc = " NonZero::<i8>::new(120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i8>::new(100).unwrap(),"]
#[doc = " NonZero::<i8>::new(-120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i8>::new(-100).unwrap(),"]
#[doc = " NonZero::<i8>::new(80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i8>::new(80).unwrap(),"]
#[doc = " NonZero::<i8>::new(-80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i8>::new(-80).unwrap(),"]
#[inline]
#[must_use =
"method returns a new number and does not mutate the original value"]
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
#[unstable(feature = "clamp_magnitude", issue = "148519")]
pub const fn clamp_magnitude(self, limit: NonZero<u8>) -> Self {
unsafe {
Self::new_unchecked(self.get().clamp_magnitude(limit.get()))
}
}
#[doc = "let two = NonZero::new(2i8)?;"]
#[doc = "let four = NonZero::new(4i8)?;"]
#[doc = "let max = NonZero::new(i8::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<i8>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2i8)?;"]
#[doc = "let four = NonZero::new(4i8)?;"]
#[doc = "let max = NonZero::new(i8::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > i8::MAX`, or `self * rhs < i8::MIN`."]
#[doc = "let two = NonZero::new(2i8)?;"]
#[doc = "let four = NonZero::new(4i8)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3i8)?;"]
#[doc = "let twenty_seven = NonZero::new(27i8)?;"]
#[doc = "let half_max = NonZero::new(i8::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc =
"Return [`NonZero::<i8>::MIN`] or [`NonZero::<i8>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3i8)?;"]
#[doc = "let twenty_seven = NonZero::new(27i8)?;"]
#[doc = "let max = NonZero::new(i8::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i8>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<i8>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i8>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<i8>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <i8>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i8>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<i8>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<i8> {
type Err = ParseIntError;
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i8>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<i8>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for NonZero<i8> {
type Output = Self;
#[inline]
fn neg(self) -> Self { unsafe { Self::new_unchecked(self.get().neg()) } }
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for &NonZero<i8> {
type Output = <NonZero<i8> as Neg>::Output;
#[inline]
fn neg(self) -> <NonZero<i8> as Neg>::Output { Neg::neg(*self) }
}nonzero_integer! {
2762 Self = NonZeroI8,
2763 Primitive = signed i8,
2764 UnsignedPrimitive = u8,
2765 rot = 2,
2766 rot_op = "-0x7e",
2767 rot_result = "0xa",
2768 swap_op = "0x12",
2769 swapped = "0x12",
2770 reversed = "0x48",
2771}
2772
2773#[doc = "An [`i16`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroI16>` is the same size as `i16`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroI16>>(), size_of::<i16>());"]
#[doc =
"`NonZeroI16` is guaranteed to have the same layout and bit validity as `i16`"]
#[doc = "`Option<NonZeroI16>` is guaranteed to be ABI-compatible with `i16`,"]
#[doc = "`NonZeroI16` and `Option<NonZeroI16>`"]
#[doc = "use std::num::NonZeroI16;"]
#[doc =
"assert_eq!(size_of::<NonZeroI16>(), size_of::<Option<NonZeroI16>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroI16>(), align_of::<Option<NonZeroI16>>());"]
#[doc = "`NonZeroI16`"]
#[doc = "use std::num::NonZeroI16;"]
#[doc =
"const TEN: NonZeroI16 = NonZeroI16::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "signed_nonzero", since = "1.34.0")]
pub type NonZeroI16 = NonZero<i16>;
impl NonZero<i16> {
#[doc = "This value is equal to [`i16::BITS`]."]
#[doc = "assert_eq!(NonZero::<i16>::BITS, i16::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <i16>::BITS;
#[doc = "let n = NonZero::<i16>::new(-1i16)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as u16) }
}
#[doc = "let n = NonZero::<i16>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as u16) }
}
#[doc = "let a = NonZero::<i16>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<i16>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as u16) <<
(<u16>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as i16)
}
}
#[doc = "let a = NonZero::<i16>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<i16>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = ""]
#[doc = "assert_eq!(NonZero::<i16>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<i16>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<i16>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<i16>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<i16>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<i16>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<i16>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<i16>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(-0x5ffdi16)?;"]
#[doc = "let m = NonZero::new(0x3a)?;"]
#[doc = "assert_eq!(n.rotate_left(4), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x3ai16)?;"]
#[doc = "let m = NonZero::new(-0x5ffd)?;"]
#[doc = "assert_eq!(n.rotate_right(4), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234i16)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x3412)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234i16)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x2c48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroI16;"]
#[doc = "let n = NonZero::new(0x1Ai16)?;"]
#[doc = " assert_eq!(NonZeroI16::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroI16::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = i16::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroI16;"]
#[doc = "let n = NonZero::new(0x1Ai16)?;"]
#[doc = " assert_eq!(NonZeroI16::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroI16::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = i16::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ai16)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ai16)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "equal to [`i16::MIN`]."]
#[doc = "assert_eq!(NonZero::<i16>::MIN.get(), i16::MIN);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(<i16>::MIN).unwrap();
#[doc = "equal to [`i16::MAX`]."]
#[doc = "assert_eq!(NonZero::<i16>::MAX.get(), i16::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<i16>::MAX).unwrap();
#[doc = "See [`i16::abs`]"]
#[doc = "let pos = NonZero::new(1i16)?;"]
#[doc = "let neg = NonZero::new(-1i16)?;"]
#[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 abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().abs()) }
}
#[doc = "`self == NonZero::<i16>::MIN`."]
#[doc = "let pos = NonZero::new(1i16)?;"]
#[doc = "let neg = NonZero::new(-1i16)?;"]
#[doc = "let min = NonZero::new(i16::MIN)?;"]
#[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 checked_abs(self) -> Option<Self> {
if let Some(nz) = self.get().checked_abs() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`i16::overflowing_abs`]."]
#[doc = "let pos = NonZero::new(1i16)?;"]
#[doc = "let neg = NonZero::new(-1i16)?;"]
#[doc = "let min = NonZero::new(i16::MIN)?;"]
#[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 overflowing_abs(self) -> (Self, bool) {
let (nz, flag) = self.get().overflowing_abs();
(unsafe { Self::new_unchecked(nz) }, flag)
}
#[doc = "[`i16::saturating_abs`]."]
#[doc = "let pos = NonZero::new(1i16)?;"]
#[doc = "let neg = NonZero::new(-1i16)?;"]
#[doc = "let min = NonZero::new(i16::MIN)?;"]
#[doc = "let min_plus = NonZero::new(i16::MIN + 1)?;"]
#[doc = "let max = NonZero::new(i16::MAX)?;"]
#[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 saturating_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_abs()) }
}
#[doc = "[`i16::wrapping_abs`]."]
#[doc = "let pos = NonZero::new(1i16)?;"]
#[doc = "let neg = NonZero::new(-1i16)?;"]
#[doc = "let min = NonZero::new(i16::MIN)?;"]
#[doc = "# let max = NonZero::new(i16::MAX)?;"]
#[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 wrapping_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().wrapping_abs()) }
}
#[doc = "let u_pos = NonZero::new(1u16)?;"]
#[doc = "let i_pos = NonZero::new(1i16)?;"]
#[doc = "let i_neg = NonZero::new(-1i16)?;"]
#[doc = "let i_min = NonZero::new(i16::MIN)?;"]
#[doc = "let u_max = NonZero::new(u16::MAX / 2 + 1)?;"]
#[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) -> NonZero<u16> {
unsafe { NonZero::new_unchecked(self.get().unsigned_abs()) }
}
#[doc = "let pos_five = NonZero::new(5i16)?;"]
#[doc = "let neg_five = NonZero::new(-5i16)?;"]
#[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() }
#[doc = "let pos_five = NonZero::new(5i16)?;"]
#[doc = "let neg_five = NonZero::new(-5i16)?;"]
#[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() }
#[doc = "returning `None` if `self == NonZero::<i16>::MIN`."]
#[doc = "let pos_five = NonZero::new(5i16)?;"]
#[doc = "let neg_five = NonZero::new(-5i16)?;"]
#[doc = "let min = NonZero::new(i16::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn checked_neg(self) -> Option<Self> {
if let Some(result) = self.get().checked_neg() {
return Some(unsafe { Self::new_unchecked(result) });
}
None
}
#[doc = "See [`i16::overflowing_neg`]"]
#[doc = "let pos_five = NonZero::new(5i16)?;"]
#[doc = "let neg_five = NonZero::new(-5i16)?;"]
#[doc = "let min = NonZero::new(i16::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn overflowing_neg(self) -> (Self, bool) {
let (result, overflow) = self.get().overflowing_neg();
((unsafe { Self::new_unchecked(result) }), overflow)
}
#[doc = "returning [`NonZero::<i16>::MAX`]"]
#[doc = "if `self == NonZero::<i16>::MIN`"]
#[doc = "let pos_five = NonZero::new(5i16)?;"]
#[doc = "let neg_five = NonZero::new(-5i16)?;"]
#[doc = "let min = NonZero::new(i16::MIN)?;"]
#[doc = "let min_plus_one = NonZero::new(i16::MIN + 1)?;"]
#[doc = "let max = NonZero::new(i16::MAX)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn saturating_neg(self) -> Self {
if let Some(result) = self.checked_neg() { return result; }
Self::MAX
}
#[doc = "See [`i16::wrapping_neg`]"]
#[doc = "let pos_five = NonZero::new(5i16)?;"]
#[doc = "let neg_five = NonZero::new(-5i16)?;"]
#[doc = "let min = NonZero::new(i16::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn wrapping_neg(self) -> Self {
let result = self.get().wrapping_neg();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(-1i16).unwrap();"]
#[doc = "assert_eq!(n.cast_unsigned(), NonZero::<u16>::MAX);"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_unsigned(self) -> NonZero<u16> {
unsafe { NonZero::new_unchecked(self.get().cast_unsigned()) }
}
#[doc = "let limit = NonZero::<u16>::new(100).unwrap();"]
#[doc = " NonZero::<i16>::new(120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i16>::new(100).unwrap(),"]
#[doc = " NonZero::<i16>::new(-120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i16>::new(-100).unwrap(),"]
#[doc = " NonZero::<i16>::new(80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i16>::new(80).unwrap(),"]
#[doc = " NonZero::<i16>::new(-80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i16>::new(-80).unwrap(),"]
#[inline]
#[must_use =
"method returns a new number and does not mutate the original value"]
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
#[unstable(feature = "clamp_magnitude", issue = "148519")]
pub const fn clamp_magnitude(self, limit: NonZero<u16>) -> Self {
unsafe {
Self::new_unchecked(self.get().clamp_magnitude(limit.get()))
}
}
#[doc = "let two = NonZero::new(2i16)?;"]
#[doc = "let four = NonZero::new(4i16)?;"]
#[doc = "let max = NonZero::new(i16::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<i16>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2i16)?;"]
#[doc = "let four = NonZero::new(4i16)?;"]
#[doc = "let max = NonZero::new(i16::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > i16::MAX`, or `self * rhs < i16::MIN`."]
#[doc = "let two = NonZero::new(2i16)?;"]
#[doc = "let four = NonZero::new(4i16)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3i16)?;"]
#[doc = "let twenty_seven = NonZero::new(27i16)?;"]
#[doc = "let half_max = NonZero::new(i16::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc =
"Return [`NonZero::<i16>::MIN`] or [`NonZero::<i16>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3i16)?;"]
#[doc = "let twenty_seven = NonZero::new(27i16)?;"]
#[doc = "let max = NonZero::new(i16::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i16>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<i16>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i16>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<i16>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <i16>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i16>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<i16>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<i16> {
type Err = ParseIntError;
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i16>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<i16>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for NonZero<i16> {
type Output = Self;
#[inline]
fn neg(self) -> Self { unsafe { Self::new_unchecked(self.get().neg()) } }
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for &NonZero<i16> {
type Output = <NonZero<i16> as Neg>::Output;
#[inline]
fn neg(self) -> <NonZero<i16> as Neg>::Output { Neg::neg(*self) }
}nonzero_integer! {
2774 Self = NonZeroI16,
2775 Primitive = signed i16,
2776 UnsignedPrimitive = u16,
2777 rot = 4,
2778 rot_op = "-0x5ffd",
2779 rot_result = "0x3a",
2780 swap_op = "0x1234",
2781 swapped = "0x3412",
2782 reversed = "0x2c48",
2783}
2784
2785#[doc = "An [`i32`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroI32>` is the same size as `i32`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroI32>>(), size_of::<i32>());"]
#[doc =
"`NonZeroI32` is guaranteed to have the same layout and bit validity as `i32`"]
#[doc = "`Option<NonZeroI32>` is guaranteed to be ABI-compatible with `i32`,"]
#[doc = "`NonZeroI32` and `Option<NonZeroI32>`"]
#[doc = "use std::num::NonZeroI32;"]
#[doc =
"assert_eq!(size_of::<NonZeroI32>(), size_of::<Option<NonZeroI32>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroI32>(), align_of::<Option<NonZeroI32>>());"]
#[doc = "`NonZeroI32`"]
#[doc = "use std::num::NonZeroI32;"]
#[doc =
"const TEN: NonZeroI32 = NonZeroI32::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "signed_nonzero", since = "1.34.0")]
pub type NonZeroI32 = NonZero<i32>;
impl NonZero<i32> {
#[doc = "This value is equal to [`i32::BITS`]."]
#[doc = "assert_eq!(NonZero::<i32>::BITS, i32::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <i32>::BITS;
#[doc = "let n = NonZero::<i32>::new(-1i32)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as u32) }
}
#[doc = "let n = NonZero::<i32>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as u32) }
}
#[doc = "let a = NonZero::<i32>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<i32>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as u32) <<
(<u32>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as i32)
}
}
#[doc = "let a = NonZero::<i32>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<i32>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = ""]
#[doc = "assert_eq!(NonZero::<i32>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<i32>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<i32>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<i32>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<i32>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<i32>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<i32>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<i32>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(0x10000b3i32)?;"]
#[doc = "let m = NonZero::new(0xb301)?;"]
#[doc = "assert_eq!(n.rotate_left(8), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0xb301i32)?;"]
#[doc = "let m = NonZero::new(0x10000b3)?;"]
#[doc = "assert_eq!(n.rotate_right(8), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12345678i32)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x78563412)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12345678i32)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x1e6a2c48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroI32;"]
#[doc = "let n = NonZero::new(0x1Ai32)?;"]
#[doc = " assert_eq!(NonZeroI32::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroI32::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = i32::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroI32;"]
#[doc = "let n = NonZero::new(0x1Ai32)?;"]
#[doc = " assert_eq!(NonZeroI32::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroI32::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = i32::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ai32)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ai32)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "equal to [`i32::MIN`]."]
#[doc = "assert_eq!(NonZero::<i32>::MIN.get(), i32::MIN);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(<i32>::MIN).unwrap();
#[doc = "equal to [`i32::MAX`]."]
#[doc = "assert_eq!(NonZero::<i32>::MAX.get(), i32::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<i32>::MAX).unwrap();
#[doc = "See [`i32::abs`]"]
#[doc = "let pos = NonZero::new(1i32)?;"]
#[doc = "let neg = NonZero::new(-1i32)?;"]
#[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 abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().abs()) }
}
#[doc = "`self == NonZero::<i32>::MIN`."]
#[doc = "let pos = NonZero::new(1i32)?;"]
#[doc = "let neg = NonZero::new(-1i32)?;"]
#[doc = "let min = NonZero::new(i32::MIN)?;"]
#[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 checked_abs(self) -> Option<Self> {
if let Some(nz) = self.get().checked_abs() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`i32::overflowing_abs`]."]
#[doc = "let pos = NonZero::new(1i32)?;"]
#[doc = "let neg = NonZero::new(-1i32)?;"]
#[doc = "let min = NonZero::new(i32::MIN)?;"]
#[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 overflowing_abs(self) -> (Self, bool) {
let (nz, flag) = self.get().overflowing_abs();
(unsafe { Self::new_unchecked(nz) }, flag)
}
#[doc = "[`i32::saturating_abs`]."]
#[doc = "let pos = NonZero::new(1i32)?;"]
#[doc = "let neg = NonZero::new(-1i32)?;"]
#[doc = "let min = NonZero::new(i32::MIN)?;"]
#[doc = "let min_plus = NonZero::new(i32::MIN + 1)?;"]
#[doc = "let max = NonZero::new(i32::MAX)?;"]
#[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 saturating_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_abs()) }
}
#[doc = "[`i32::wrapping_abs`]."]
#[doc = "let pos = NonZero::new(1i32)?;"]
#[doc = "let neg = NonZero::new(-1i32)?;"]
#[doc = "let min = NonZero::new(i32::MIN)?;"]
#[doc = "# let max = NonZero::new(i32::MAX)?;"]
#[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 wrapping_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().wrapping_abs()) }
}
#[doc = "let u_pos = NonZero::new(1u32)?;"]
#[doc = "let i_pos = NonZero::new(1i32)?;"]
#[doc = "let i_neg = NonZero::new(-1i32)?;"]
#[doc = "let i_min = NonZero::new(i32::MIN)?;"]
#[doc = "let u_max = NonZero::new(u32::MAX / 2 + 1)?;"]
#[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) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().unsigned_abs()) }
}
#[doc = "let pos_five = NonZero::new(5i32)?;"]
#[doc = "let neg_five = NonZero::new(-5i32)?;"]
#[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() }
#[doc = "let pos_five = NonZero::new(5i32)?;"]
#[doc = "let neg_five = NonZero::new(-5i32)?;"]
#[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() }
#[doc = "returning `None` if `self == NonZero::<i32>::MIN`."]
#[doc = "let pos_five = NonZero::new(5i32)?;"]
#[doc = "let neg_five = NonZero::new(-5i32)?;"]
#[doc = "let min = NonZero::new(i32::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn checked_neg(self) -> Option<Self> {
if let Some(result) = self.get().checked_neg() {
return Some(unsafe { Self::new_unchecked(result) });
}
None
}
#[doc = "See [`i32::overflowing_neg`]"]
#[doc = "let pos_five = NonZero::new(5i32)?;"]
#[doc = "let neg_five = NonZero::new(-5i32)?;"]
#[doc = "let min = NonZero::new(i32::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn overflowing_neg(self) -> (Self, bool) {
let (result, overflow) = self.get().overflowing_neg();
((unsafe { Self::new_unchecked(result) }), overflow)
}
#[doc = "returning [`NonZero::<i32>::MAX`]"]
#[doc = "if `self == NonZero::<i32>::MIN`"]
#[doc = "let pos_five = NonZero::new(5i32)?;"]
#[doc = "let neg_five = NonZero::new(-5i32)?;"]
#[doc = "let min = NonZero::new(i32::MIN)?;"]
#[doc = "let min_plus_one = NonZero::new(i32::MIN + 1)?;"]
#[doc = "let max = NonZero::new(i32::MAX)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn saturating_neg(self) -> Self {
if let Some(result) = self.checked_neg() { return result; }
Self::MAX
}
#[doc = "See [`i32::wrapping_neg`]"]
#[doc = "let pos_five = NonZero::new(5i32)?;"]
#[doc = "let neg_five = NonZero::new(-5i32)?;"]
#[doc = "let min = NonZero::new(i32::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn wrapping_neg(self) -> Self {
let result = self.get().wrapping_neg();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(-1i32).unwrap();"]
#[doc = "assert_eq!(n.cast_unsigned(), NonZero::<u32>::MAX);"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_unsigned(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().cast_unsigned()) }
}
#[doc = "let limit = NonZero::<u32>::new(100).unwrap();"]
#[doc = " NonZero::<i32>::new(120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i32>::new(100).unwrap(),"]
#[doc = " NonZero::<i32>::new(-120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i32>::new(-100).unwrap(),"]
#[doc = " NonZero::<i32>::new(80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i32>::new(80).unwrap(),"]
#[doc = " NonZero::<i32>::new(-80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i32>::new(-80).unwrap(),"]
#[inline]
#[must_use =
"method returns a new number and does not mutate the original value"]
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
#[unstable(feature = "clamp_magnitude", issue = "148519")]
pub const fn clamp_magnitude(self, limit: NonZero<u32>) -> Self {
unsafe {
Self::new_unchecked(self.get().clamp_magnitude(limit.get()))
}
}
#[doc = "let two = NonZero::new(2i32)?;"]
#[doc = "let four = NonZero::new(4i32)?;"]
#[doc = "let max = NonZero::new(i32::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<i32>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2i32)?;"]
#[doc = "let four = NonZero::new(4i32)?;"]
#[doc = "let max = NonZero::new(i32::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > i32::MAX`, or `self * rhs < i32::MIN`."]
#[doc = "let two = NonZero::new(2i32)?;"]
#[doc = "let four = NonZero::new(4i32)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3i32)?;"]
#[doc = "let twenty_seven = NonZero::new(27i32)?;"]
#[doc = "let half_max = NonZero::new(i32::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc =
"Return [`NonZero::<i32>::MIN`] or [`NonZero::<i32>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3i32)?;"]
#[doc = "let twenty_seven = NonZero::new(27i32)?;"]
#[doc = "let max = NonZero::new(i32::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i32>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<i32>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i32>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<i32>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <i32>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i32>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<i32>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<i32> {
type Err = ParseIntError;
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i32>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<i32>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for NonZero<i32> {
type Output = Self;
#[inline]
fn neg(self) -> Self { unsafe { Self::new_unchecked(self.get().neg()) } }
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for &NonZero<i32> {
type Output = <NonZero<i32> as Neg>::Output;
#[inline]
fn neg(self) -> <NonZero<i32> as Neg>::Output { Neg::neg(*self) }
}nonzero_integer! {
2786 Self = NonZeroI32,
2787 Primitive = signed i32,
2788 UnsignedPrimitive = u32,
2789 rot = 8,
2790 rot_op = "0x10000b3",
2791 rot_result = "0xb301",
2792 swap_op = "0x12345678",
2793 swapped = "0x78563412",
2794 reversed = "0x1e6a2c48",
2795}
2796
2797#[doc = "An [`i64`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroI64>` is the same size as `i64`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroI64>>(), size_of::<i64>());"]
#[doc =
"`NonZeroI64` is guaranteed to have the same layout and bit validity as `i64`"]
#[doc = "`Option<NonZeroI64>` is guaranteed to be ABI-compatible with `i64`,"]
#[doc = "`NonZeroI64` and `Option<NonZeroI64>`"]
#[doc = "use std::num::NonZeroI64;"]
#[doc =
"assert_eq!(size_of::<NonZeroI64>(), size_of::<Option<NonZeroI64>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroI64>(), align_of::<Option<NonZeroI64>>());"]
#[doc = "`NonZeroI64`"]
#[doc = "use std::num::NonZeroI64;"]
#[doc =
"const TEN: NonZeroI64 = NonZeroI64::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "signed_nonzero", since = "1.34.0")]
pub type NonZeroI64 = NonZero<i64>;
impl NonZero<i64> {
#[doc = "This value is equal to [`i64::BITS`]."]
#[doc = "assert_eq!(NonZero::<i64>::BITS, i64::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <i64>::BITS;
#[doc = "let n = NonZero::<i64>::new(-1i64)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as u64) }
}
#[doc = "let n = NonZero::<i64>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as u64) }
}
#[doc = "let a = NonZero::<i64>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<i64>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as u64) <<
(<u64>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as i64)
}
}
#[doc = "let a = NonZero::<i64>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<i64>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = ""]
#[doc = "assert_eq!(NonZero::<i64>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<i64>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<i64>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<i64>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<i64>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<i64>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<i64>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<i64>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(0xaa00000000006e1i64)?;"]
#[doc = "let m = NonZero::new(0x6e10aa)?;"]
#[doc = "assert_eq!(n.rotate_left(12), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x6e10aai64)?;"]
#[doc = "let m = NonZero::new(0xaa00000000006e1)?;"]
#[doc = "assert_eq!(n.rotate_right(12), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234567890123456i64)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x5634129078563412)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234567890123456i64)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x6a2c48091e6a2c48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroI64;"]
#[doc = "let n = NonZero::new(0x1Ai64)?;"]
#[doc = " assert_eq!(NonZeroI64::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroI64::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = i64::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroI64;"]
#[doc = "let n = NonZero::new(0x1Ai64)?;"]
#[doc = " assert_eq!(NonZeroI64::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroI64::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = i64::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ai64)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ai64)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "equal to [`i64::MIN`]."]
#[doc = "assert_eq!(NonZero::<i64>::MIN.get(), i64::MIN);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(<i64>::MIN).unwrap();
#[doc = "equal to [`i64::MAX`]."]
#[doc = "assert_eq!(NonZero::<i64>::MAX.get(), i64::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<i64>::MAX).unwrap();
#[doc = "See [`i64::abs`]"]
#[doc = "let pos = NonZero::new(1i64)?;"]
#[doc = "let neg = NonZero::new(-1i64)?;"]
#[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 abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().abs()) }
}
#[doc = "`self == NonZero::<i64>::MIN`."]
#[doc = "let pos = NonZero::new(1i64)?;"]
#[doc = "let neg = NonZero::new(-1i64)?;"]
#[doc = "let min = NonZero::new(i64::MIN)?;"]
#[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 checked_abs(self) -> Option<Self> {
if let Some(nz) = self.get().checked_abs() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`i64::overflowing_abs`]."]
#[doc = "let pos = NonZero::new(1i64)?;"]
#[doc = "let neg = NonZero::new(-1i64)?;"]
#[doc = "let min = NonZero::new(i64::MIN)?;"]
#[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 overflowing_abs(self) -> (Self, bool) {
let (nz, flag) = self.get().overflowing_abs();
(unsafe { Self::new_unchecked(nz) }, flag)
}
#[doc = "[`i64::saturating_abs`]."]
#[doc = "let pos = NonZero::new(1i64)?;"]
#[doc = "let neg = NonZero::new(-1i64)?;"]
#[doc = "let min = NonZero::new(i64::MIN)?;"]
#[doc = "let min_plus = NonZero::new(i64::MIN + 1)?;"]
#[doc = "let max = NonZero::new(i64::MAX)?;"]
#[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 saturating_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_abs()) }
}
#[doc = "[`i64::wrapping_abs`]."]
#[doc = "let pos = NonZero::new(1i64)?;"]
#[doc = "let neg = NonZero::new(-1i64)?;"]
#[doc = "let min = NonZero::new(i64::MIN)?;"]
#[doc = "# let max = NonZero::new(i64::MAX)?;"]
#[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 wrapping_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().wrapping_abs()) }
}
#[doc = "let u_pos = NonZero::new(1u64)?;"]
#[doc = "let i_pos = NonZero::new(1i64)?;"]
#[doc = "let i_neg = NonZero::new(-1i64)?;"]
#[doc = "let i_min = NonZero::new(i64::MIN)?;"]
#[doc = "let u_max = NonZero::new(u64::MAX / 2 + 1)?;"]
#[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) -> NonZero<u64> {
unsafe { NonZero::new_unchecked(self.get().unsigned_abs()) }
}
#[doc = "let pos_five = NonZero::new(5i64)?;"]
#[doc = "let neg_five = NonZero::new(-5i64)?;"]
#[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() }
#[doc = "let pos_five = NonZero::new(5i64)?;"]
#[doc = "let neg_five = NonZero::new(-5i64)?;"]
#[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() }
#[doc = "returning `None` if `self == NonZero::<i64>::MIN`."]
#[doc = "let pos_five = NonZero::new(5i64)?;"]
#[doc = "let neg_five = NonZero::new(-5i64)?;"]
#[doc = "let min = NonZero::new(i64::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn checked_neg(self) -> Option<Self> {
if let Some(result) = self.get().checked_neg() {
return Some(unsafe { Self::new_unchecked(result) });
}
None
}
#[doc = "See [`i64::overflowing_neg`]"]
#[doc = "let pos_five = NonZero::new(5i64)?;"]
#[doc = "let neg_five = NonZero::new(-5i64)?;"]
#[doc = "let min = NonZero::new(i64::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn overflowing_neg(self) -> (Self, bool) {
let (result, overflow) = self.get().overflowing_neg();
((unsafe { Self::new_unchecked(result) }), overflow)
}
#[doc = "returning [`NonZero::<i64>::MAX`]"]
#[doc = "if `self == NonZero::<i64>::MIN`"]
#[doc = "let pos_five = NonZero::new(5i64)?;"]
#[doc = "let neg_five = NonZero::new(-5i64)?;"]
#[doc = "let min = NonZero::new(i64::MIN)?;"]
#[doc = "let min_plus_one = NonZero::new(i64::MIN + 1)?;"]
#[doc = "let max = NonZero::new(i64::MAX)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn saturating_neg(self) -> Self {
if let Some(result) = self.checked_neg() { return result; }
Self::MAX
}
#[doc = "See [`i64::wrapping_neg`]"]
#[doc = "let pos_five = NonZero::new(5i64)?;"]
#[doc = "let neg_five = NonZero::new(-5i64)?;"]
#[doc = "let min = NonZero::new(i64::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn wrapping_neg(self) -> Self {
let result = self.get().wrapping_neg();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(-1i64).unwrap();"]
#[doc = "assert_eq!(n.cast_unsigned(), NonZero::<u64>::MAX);"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_unsigned(self) -> NonZero<u64> {
unsafe { NonZero::new_unchecked(self.get().cast_unsigned()) }
}
#[doc = "let limit = NonZero::<u64>::new(100).unwrap();"]
#[doc = " NonZero::<i64>::new(120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i64>::new(100).unwrap(),"]
#[doc = " NonZero::<i64>::new(-120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i64>::new(-100).unwrap(),"]
#[doc = " NonZero::<i64>::new(80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i64>::new(80).unwrap(),"]
#[doc = " NonZero::<i64>::new(-80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i64>::new(-80).unwrap(),"]
#[inline]
#[must_use =
"method returns a new number and does not mutate the original value"]
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
#[unstable(feature = "clamp_magnitude", issue = "148519")]
pub const fn clamp_magnitude(self, limit: NonZero<u64>) -> Self {
unsafe {
Self::new_unchecked(self.get().clamp_magnitude(limit.get()))
}
}
#[doc = "let two = NonZero::new(2i64)?;"]
#[doc = "let four = NonZero::new(4i64)?;"]
#[doc = "let max = NonZero::new(i64::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<i64>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2i64)?;"]
#[doc = "let four = NonZero::new(4i64)?;"]
#[doc = "let max = NonZero::new(i64::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > i64::MAX`, or `self * rhs < i64::MIN`."]
#[doc = "let two = NonZero::new(2i64)?;"]
#[doc = "let four = NonZero::new(4i64)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3i64)?;"]
#[doc = "let twenty_seven = NonZero::new(27i64)?;"]
#[doc = "let half_max = NonZero::new(i64::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc =
"Return [`NonZero::<i64>::MIN`] or [`NonZero::<i64>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3i64)?;"]
#[doc = "let twenty_seven = NonZero::new(27i64)?;"]
#[doc = "let max = NonZero::new(i64::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i64>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<i64>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i64>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<i64>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <i64>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i64>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<i64>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<i64> {
type Err = ParseIntError;
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i64>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<i64>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for NonZero<i64> {
type Output = Self;
#[inline]
fn neg(self) -> Self { unsafe { Self::new_unchecked(self.get().neg()) } }
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for &NonZero<i64> {
type Output = <NonZero<i64> as Neg>::Output;
#[inline]
fn neg(self) -> <NonZero<i64> as Neg>::Output { Neg::neg(*self) }
}nonzero_integer! {
2798 Self = NonZeroI64,
2799 Primitive = signed i64,
2800 UnsignedPrimitive = u64,
2801 rot = 12,
2802 rot_op = "0xaa00000000006e1",
2803 rot_result = "0x6e10aa",
2804 swap_op = "0x1234567890123456",
2805 swapped = "0x5634129078563412",
2806 reversed = "0x6a2c48091e6a2c48",
2807}
2808
2809#[doc = "An [`i128`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroI128>` is the same size as `i128`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroI128>>(), size_of::<i128>());"]
#[doc =
"`NonZeroI128` is guaranteed to have the same layout and bit validity as `i128`"]
#[doc =
"`Option<NonZeroI128>` is guaranteed to be ABI-compatible with `i128`,"]
#[doc = "`NonZeroI128` and `Option<NonZeroI128>`"]
#[doc = "use std::num::NonZeroI128;"]
#[doc =
"assert_eq!(size_of::<NonZeroI128>(), size_of::<Option<NonZeroI128>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroI128>(), align_of::<Option<NonZeroI128>>());"]
#[doc = "`NonZeroI128`"]
#[doc = "use std::num::NonZeroI128;"]
#[doc =
"const TEN: NonZeroI128 = NonZeroI128::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "signed_nonzero", since = "1.34.0")]
pub type NonZeroI128 = NonZero<i128>;
impl NonZero<i128> {
#[doc = "This value is equal to [`i128::BITS`]."]
#[doc = "assert_eq!(NonZero::<i128>::BITS, i128::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <i128>::BITS;
#[doc = "let n = NonZero::<i128>::new(-1i128)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as u128) }
}
#[doc = "let n = NonZero::<i128>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as u128) }
}
#[doc = "let a = NonZero::<i128>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<i128>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as u128) <<
(<u128>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as i128)
}
}
#[doc = "let a = NonZero::<i128>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<i128>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = ""]
#[doc = "assert_eq!(NonZero::<i128>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<i128>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<i128>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<i128>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<i128>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<i128>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<i128>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<i128>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(0x13f40000000000000000000000004f76i128)?;"]
#[doc = "let m = NonZero::new(0x4f7613f4)?;"]
#[doc = "assert_eq!(n.rotate_left(16), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x4f7613f4i128)?;"]
#[doc = "let m = NonZero::new(0x13f40000000000000000000000004f76)?;"]
#[doc = "assert_eq!(n.rotate_right(16), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12345678901234567890123456789012i128)?;"]
#[doc =
"assert_eq!(m, NonZero::new(0x12907856341290785634129078563412)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x12345678901234567890123456789012i128)?;"]
#[doc =
"assert_eq!(m, NonZero::new(0x48091e6a2c48091e6a2c48091e6a2c48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroI128;"]
#[doc = "let n = NonZero::new(0x1Ai128)?;"]
#[doc = " assert_eq!(NonZeroI128::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroI128::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = i128::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroI128;"]
#[doc = "let n = NonZero::new(0x1Ai128)?;"]
#[doc = " assert_eq!(NonZeroI128::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroI128::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = i128::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ai128)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Ai128)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "equal to [`i128::MIN`]."]
#[doc = "assert_eq!(NonZero::<i128>::MIN.get(), i128::MIN);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(<i128>::MIN).unwrap();
#[doc = "equal to [`i128::MAX`]."]
#[doc = "assert_eq!(NonZero::<i128>::MAX.get(), i128::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<i128>::MAX).unwrap();
#[doc = "See [`i128::abs`]"]
#[doc = "let pos = NonZero::new(1i128)?;"]
#[doc = "let neg = NonZero::new(-1i128)?;"]
#[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 abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().abs()) }
}
#[doc = "`self == NonZero::<i128>::MIN`."]
#[doc = "let pos = NonZero::new(1i128)?;"]
#[doc = "let neg = NonZero::new(-1i128)?;"]
#[doc = "let min = NonZero::new(i128::MIN)?;"]
#[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 checked_abs(self) -> Option<Self> {
if let Some(nz) = self.get().checked_abs() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`i128::overflowing_abs`]."]
#[doc = "let pos = NonZero::new(1i128)?;"]
#[doc = "let neg = NonZero::new(-1i128)?;"]
#[doc = "let min = NonZero::new(i128::MIN)?;"]
#[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 overflowing_abs(self) -> (Self, bool) {
let (nz, flag) = self.get().overflowing_abs();
(unsafe { Self::new_unchecked(nz) }, flag)
}
#[doc = "[`i128::saturating_abs`]."]
#[doc = "let pos = NonZero::new(1i128)?;"]
#[doc = "let neg = NonZero::new(-1i128)?;"]
#[doc = "let min = NonZero::new(i128::MIN)?;"]
#[doc = "let min_plus = NonZero::new(i128::MIN + 1)?;"]
#[doc = "let max = NonZero::new(i128::MAX)?;"]
#[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 saturating_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_abs()) }
}
#[doc = "[`i128::wrapping_abs`]."]
#[doc = "let pos = NonZero::new(1i128)?;"]
#[doc = "let neg = NonZero::new(-1i128)?;"]
#[doc = "let min = NonZero::new(i128::MIN)?;"]
#[doc = "# let max = NonZero::new(i128::MAX)?;"]
#[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 wrapping_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().wrapping_abs()) }
}
#[doc = "let u_pos = NonZero::new(1u128)?;"]
#[doc = "let i_pos = NonZero::new(1i128)?;"]
#[doc = "let i_neg = NonZero::new(-1i128)?;"]
#[doc = "let i_min = NonZero::new(i128::MIN)?;"]
#[doc = "let u_max = NonZero::new(u128::MAX / 2 + 1)?;"]
#[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) -> NonZero<u128> {
unsafe { NonZero::new_unchecked(self.get().unsigned_abs()) }
}
#[doc = "let pos_five = NonZero::new(5i128)?;"]
#[doc = "let neg_five = NonZero::new(-5i128)?;"]
#[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() }
#[doc = "let pos_five = NonZero::new(5i128)?;"]
#[doc = "let neg_five = NonZero::new(-5i128)?;"]
#[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() }
#[doc = "returning `None` if `self == NonZero::<i128>::MIN`."]
#[doc = "let pos_five = NonZero::new(5i128)?;"]
#[doc = "let neg_five = NonZero::new(-5i128)?;"]
#[doc = "let min = NonZero::new(i128::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn checked_neg(self) -> Option<Self> {
if let Some(result) = self.get().checked_neg() {
return Some(unsafe { Self::new_unchecked(result) });
}
None
}
#[doc = "See [`i128::overflowing_neg`]"]
#[doc = "let pos_five = NonZero::new(5i128)?;"]
#[doc = "let neg_five = NonZero::new(-5i128)?;"]
#[doc = "let min = NonZero::new(i128::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn overflowing_neg(self) -> (Self, bool) {
let (result, overflow) = self.get().overflowing_neg();
((unsafe { Self::new_unchecked(result) }), overflow)
}
#[doc = "returning [`NonZero::<i128>::MAX`]"]
#[doc = "if `self == NonZero::<i128>::MIN`"]
#[doc = "let pos_five = NonZero::new(5i128)?;"]
#[doc = "let neg_five = NonZero::new(-5i128)?;"]
#[doc = "let min = NonZero::new(i128::MIN)?;"]
#[doc = "let min_plus_one = NonZero::new(i128::MIN + 1)?;"]
#[doc = "let max = NonZero::new(i128::MAX)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn saturating_neg(self) -> Self {
if let Some(result) = self.checked_neg() { return result; }
Self::MAX
}
#[doc = "See [`i128::wrapping_neg`]"]
#[doc = "let pos_five = NonZero::new(5i128)?;"]
#[doc = "let neg_five = NonZero::new(-5i128)?;"]
#[doc = "let min = NonZero::new(i128::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn wrapping_neg(self) -> Self {
let result = self.get().wrapping_neg();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(-1i128).unwrap();"]
#[doc = "assert_eq!(n.cast_unsigned(), NonZero::<u128>::MAX);"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_unsigned(self) -> NonZero<u128> {
unsafe { NonZero::new_unchecked(self.get().cast_unsigned()) }
}
#[doc = "let limit = NonZero::<u128>::new(100).unwrap();"]
#[doc = " NonZero::<i128>::new(120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i128>::new(100).unwrap(),"]
#[doc = " NonZero::<i128>::new(-120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i128>::new(-100).unwrap(),"]
#[doc = " NonZero::<i128>::new(80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i128>::new(80).unwrap(),"]
#[doc = " NonZero::<i128>::new(-80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<i128>::new(-80).unwrap(),"]
#[inline]
#[must_use =
"method returns a new number and does not mutate the original value"]
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
#[unstable(feature = "clamp_magnitude", issue = "148519")]
pub const fn clamp_magnitude(self, limit: NonZero<u128>) -> Self {
unsafe {
Self::new_unchecked(self.get().clamp_magnitude(limit.get()))
}
}
#[doc = "let two = NonZero::new(2i128)?;"]
#[doc = "let four = NonZero::new(4i128)?;"]
#[doc = "let max = NonZero::new(i128::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<i128>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2i128)?;"]
#[doc = "let four = NonZero::new(4i128)?;"]
#[doc = "let max = NonZero::new(i128::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > i128::MAX`, or `self * rhs < i128::MIN`."]
#[doc = "let two = NonZero::new(2i128)?;"]
#[doc = "let four = NonZero::new(4i128)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3i128)?;"]
#[doc = "let twenty_seven = NonZero::new(27i128)?;"]
#[doc = "let half_max = NonZero::new(i128::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc =
"Return [`NonZero::<i128>::MIN`] or [`NonZero::<i128>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3i128)?;"]
#[doc = "let twenty_seven = NonZero::new(27i128)?;"]
#[doc = "let max = NonZero::new(i128::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i128>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<i128>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i128>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<i128>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <i128>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i128>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<i128>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<i128> {
type Err = ParseIntError;
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<i128>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<i128>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for NonZero<i128> {
type Output = Self;
#[inline]
fn neg(self) -> Self { unsafe { Self::new_unchecked(self.get().neg()) } }
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for &NonZero<i128> {
type Output = <NonZero<i128> as Neg>::Output;
#[inline]
fn neg(self) -> <NonZero<i128> as Neg>::Output { Neg::neg(*self) }
}nonzero_integer! {
2810 Self = NonZeroI128,
2811 Primitive = signed i128,
2812 UnsignedPrimitive = u128,
2813 rot = 16,
2814 rot_op = "0x13f40000000000000000000000004f76",
2815 rot_result = "0x4f7613f4",
2816 swap_op = "0x12345678901234567890123456789012",
2817 swapped = "0x12907856341290785634129078563412",
2818 reversed = "0x48091e6a2c48091e6a2c48091e6a2c48",
2819}
2820
2821#[cfg(target_pointer_width = "16")]
2822nonzero_integer! {
2823 Self = NonZeroIsize,
2824 Primitive = signed isize,
2825 UnsignedPrimitive = usize,
2826 rot = 4,
2827 rot_op = "-0x5ffd",
2828 rot_result = "0x3a",
2829 swap_op = "0x1234",
2830 swapped = "0x3412",
2831 reversed = "0x2c48",
2832}
2833
2834#[cfg(target_pointer_width = "32")]
2835nonzero_integer! {
2836 Self = NonZeroIsize,
2837 Primitive = signed isize,
2838 UnsignedPrimitive = usize,
2839 rot = 8,
2840 rot_op = "0x10000b3",
2841 rot_result = "0xb301",
2842 swap_op = "0x12345678",
2843 swapped = "0x78563412",
2844 reversed = "0x1e6a2c48",
2845}
2846
2847#[cfg(target_pointer_width = "64")]
2848#[doc = "An [`isize`] that is known not to equal zero."]
#[doc = "For example, `Option<NonZeroIsize>` is the same size as `isize`:"]
#[doc =
"assert_eq!(size_of::<Option<core::num::NonZeroIsize>>(), size_of::<isize>());"]
#[doc =
"`NonZeroIsize` is guaranteed to have the same layout and bit validity as `isize`"]
#[doc =
"`Option<NonZeroIsize>` is guaranteed to be ABI-compatible with `isize`,"]
#[doc = "`NonZeroIsize` and `Option<NonZeroIsize>`"]
#[doc = "use std::num::NonZeroIsize;"]
#[doc =
"assert_eq!(size_of::<NonZeroIsize>(), size_of::<Option<NonZeroIsize>>());"]
#[doc =
"assert_eq!(align_of::<NonZeroIsize>(), align_of::<Option<NonZeroIsize>>());"]
#[doc = "`NonZeroIsize`"]
#[doc = "use std::num::NonZeroIsize;"]
#[doc =
"const TEN: NonZeroIsize = NonZeroIsize::new(10).expect(\"ten is non-zero\");"]
#[stable(feature = "signed_nonzero", since = "1.34.0")]
pub type NonZeroIsize = NonZero<isize>;
impl NonZero<isize> {
#[doc = "This value is equal to [`isize::BITS`]."]
#[doc = "assert_eq!(NonZero::<isize>::BITS, isize::BITS);"]
#[stable(feature = "nonzero_bits", since = "1.67.0")]
pub const BITS: u32 = <isize>::BITS;
#[doc = "let n = NonZero::<isize>::new(-1isize)?;"]
#[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 {
unsafe { intrinsics::ctlz_nonzero(self.get() as usize) }
}
#[doc = "let n = NonZero::<isize>::new(0b0101000)?;"]
#[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 {
unsafe { intrinsics::cttz_nonzero(self.get() as usize) }
}
#[doc = "let a = NonZero::<isize>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<isize>::new(0b_01000000)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_highest_one(self) -> Self {
unsafe {
let bit =
(((1 as usize) <<
(<usize>::BITS - 1)).unchecked_shr(self.leading_zeros()));
NonZero::new_unchecked(bit as isize)
}
}
#[doc = "let a = NonZero::<isize>::new(0b_01100100)?;"]
#[doc = "let b = NonZero::<isize>::new(0b_00000100)?;"]
#[stable(feature = "isolate_most_least_significant_one", since =
"1.97.0")]
#[rustc_const_stable(feature = "isolate_most_least_significant_one", since
= "1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn isolate_lowest_one(self) -> Self {
let n = self.get();
let n = n & n.wrapping_neg();
unsafe { NonZero::new_unchecked(n) }
}
#[doc = ""]
#[doc = "assert_eq!(NonZero::<isize>::new(0b1)?.highest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<isize>::new(0b1_0000)?.highest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<isize>::new(0b1_1111)?.highest_one(), 4);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn highest_one(self) -> u32 {
Self::BITS - 1 - self.leading_zeros()
}
#[doc = "assert_eq!(NonZero::<isize>::new(0b1)?.lowest_one(), 0);"]
#[doc = "assert_eq!(NonZero::<isize>::new(0b1_0000)?.lowest_one(), 4);"]
#[doc = "assert_eq!(NonZero::<isize>::new(0b1_1111)?.lowest_one(), 0);"]
#[stable(feature = "int_lowest_highest_one", since = "1.97.0")]
#[rustc_const_stable(feature = "int_lowest_highest_one", since =
"1.97.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn lowest_one(self) -> u32 { self.trailing_zeros() }
#[doc = "let a = NonZero::<isize>::new(0b100_0000)?;"]
#[doc = "let b = NonZero::<isize>::new(0b100_0011)?;"]
#[stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[rustc_const_stable(feature = "non_zero_count_ones", since = "1.86.0")]
#[doc(alias = "popcount")]
#[doc(alias = "popcnt")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn count_ones(self) -> NonZero<u32> {
unsafe { NonZero::new_unchecked(self.get().count_ones()) }
}
#[doc = "let n = NonZero::new(0xaa00000000006e1isize)?;"]
#[doc = "let m = NonZero::new(0x6e10aa)?;"]
#[doc = "assert_eq!(n.rotate_left(12), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_left(self, n: u32) -> Self {
let result = self.get().rotate_left(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x6e10aaisize)?;"]
#[doc = "let m = NonZero::new(0xaa00000000006e1)?;"]
#[doc = "assert_eq!(n.rotate_right(12), m);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn rotate_right(self, n: u32) -> Self {
let result = self.get().rotate_right(n);
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234567890123456isize)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x5634129078563412)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn swap_bytes(self) -> Self {
let result = self.get().swap_bytes();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1234567890123456isize)?;"]
#[doc = "assert_eq!(m, NonZero::new(0x6a2c48091e6a2c48)?);"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn reverse_bits(self) -> Self {
let result = self.get().reverse_bits();
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroIsize;"]
#[doc = "let n = NonZero::new(0x1Aisize)?;"]
#[doc = " assert_eq!(NonZeroIsize::from_be(n), n)"]
#[doc = " assert_eq!(NonZeroIsize::from_be(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_be(x: Self) -> Self {
let result = isize::from_be(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "use std::num::NonZeroIsize;"]
#[doc = "let n = NonZero::new(0x1Aisize)?;"]
#[doc = " assert_eq!(NonZeroIsize::from_le(n), n)"]
#[doc = " assert_eq!(NonZeroIsize::from_le(n), n.swap_bytes())"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use]
#[inline(always)]
pub const fn from_le(x: Self) -> Self {
let result = isize::from_le(x.get());
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Aisize)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_be(self) -> Self {
let result = self.get().to_be();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(0x1Aisize)?;"]
#[unstable(feature = "nonzero_bitwise", issue = "128281")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn to_le(self) -> Self {
let result = self.get().to_le();
unsafe { Self::new_unchecked(result) }
}
#[doc = "equal to [`isize::MIN`]."]
#[doc = "assert_eq!(NonZero::<isize>::MIN.get(), isize::MIN);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MIN: Self = Self::new(<isize>::MIN).unwrap();
#[doc = "equal to [`isize::MAX`]."]
#[doc = "assert_eq!(NonZero::<isize>::MAX.get(), isize::MAX);"]
#[stable(feature = "nonzero_min_max", since = "1.70.0")]
pub const MAX: Self = Self::new(<isize>::MAX).unwrap();
#[doc = "See [`isize::abs`]"]
#[doc = "let pos = NonZero::new(1isize)?;"]
#[doc = "let neg = NonZero::new(-1isize)?;"]
#[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 abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().abs()) }
}
#[doc = "`self == NonZero::<isize>::MIN`."]
#[doc = "let pos = NonZero::new(1isize)?;"]
#[doc = "let neg = NonZero::new(-1isize)?;"]
#[doc = "let min = NonZero::new(isize::MIN)?;"]
#[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 checked_abs(self) -> Option<Self> {
if let Some(nz) = self.get().checked_abs() {
Some(unsafe { Self::new_unchecked(nz) })
} else { None }
}
#[doc = "[`isize::overflowing_abs`]."]
#[doc = "let pos = NonZero::new(1isize)?;"]
#[doc = "let neg = NonZero::new(-1isize)?;"]
#[doc = "let min = NonZero::new(isize::MIN)?;"]
#[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 overflowing_abs(self) -> (Self, bool) {
let (nz, flag) = self.get().overflowing_abs();
(unsafe { Self::new_unchecked(nz) }, flag)
}
#[doc = "[`isize::saturating_abs`]."]
#[doc = "let pos = NonZero::new(1isize)?;"]
#[doc = "let neg = NonZero::new(-1isize)?;"]
#[doc = "let min = NonZero::new(isize::MIN)?;"]
#[doc = "let min_plus = NonZero::new(isize::MIN + 1)?;"]
#[doc = "let max = NonZero::new(isize::MAX)?;"]
#[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 saturating_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_abs()) }
}
#[doc = "[`isize::wrapping_abs`]."]
#[doc = "let pos = NonZero::new(1isize)?;"]
#[doc = "let neg = NonZero::new(-1isize)?;"]
#[doc = "let min = NonZero::new(isize::MIN)?;"]
#[doc = "# let max = NonZero::new(isize::MAX)?;"]
#[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 wrapping_abs(self) -> Self {
unsafe { Self::new_unchecked(self.get().wrapping_abs()) }
}
#[doc = "let u_pos = NonZero::new(1usize)?;"]
#[doc = "let i_pos = NonZero::new(1isize)?;"]
#[doc = "let i_neg = NonZero::new(-1isize)?;"]
#[doc = "let i_min = NonZero::new(isize::MIN)?;"]
#[doc = "let u_max = NonZero::new(usize::MAX / 2 + 1)?;"]
#[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) -> NonZero<usize> {
unsafe { NonZero::new_unchecked(self.get().unsigned_abs()) }
}
#[doc = "let pos_five = NonZero::new(5isize)?;"]
#[doc = "let neg_five = NonZero::new(-5isize)?;"]
#[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() }
#[doc = "let pos_five = NonZero::new(5isize)?;"]
#[doc = "let neg_five = NonZero::new(-5isize)?;"]
#[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() }
#[doc = "returning `None` if `self == NonZero::<isize>::MIN`."]
#[doc = "let pos_five = NonZero::new(5isize)?;"]
#[doc = "let neg_five = NonZero::new(-5isize)?;"]
#[doc = "let min = NonZero::new(isize::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn checked_neg(self) -> Option<Self> {
if let Some(result) = self.get().checked_neg() {
return Some(unsafe { Self::new_unchecked(result) });
}
None
}
#[doc = "See [`isize::overflowing_neg`]"]
#[doc = "let pos_five = NonZero::new(5isize)?;"]
#[doc = "let neg_five = NonZero::new(-5isize)?;"]
#[doc = "let min = NonZero::new(isize::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn overflowing_neg(self) -> (Self, bool) {
let (result, overflow) = self.get().overflowing_neg();
((unsafe { Self::new_unchecked(result) }), overflow)
}
#[doc = "returning [`NonZero::<isize>::MAX`]"]
#[doc = "if `self == NonZero::<isize>::MIN`"]
#[doc = "let pos_five = NonZero::new(5isize)?;"]
#[doc = "let neg_five = NonZero::new(-5isize)?;"]
#[doc = "let min = NonZero::new(isize::MIN)?;"]
#[doc = "let min_plus_one = NonZero::new(isize::MIN + 1)?;"]
#[doc = "let max = NonZero::new(isize::MAX)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn saturating_neg(self) -> Self {
if let Some(result) = self.checked_neg() { return result; }
Self::MAX
}
#[doc = "See [`isize::wrapping_neg`]"]
#[doc = "let pos_five = NonZero::new(5isize)?;"]
#[doc = "let neg_five = NonZero::new(-5isize)?;"]
#[doc = "let min = NonZero::new(isize::MIN)?;"]
#[inline]
#[stable(feature = "nonzero_negation_ops", since = "1.71.0")]
#[rustc_const_stable(feature = "nonzero_negation_ops", since = "1.71.0")]
pub const fn wrapping_neg(self) -> Self {
let result = self.get().wrapping_neg();
unsafe { Self::new_unchecked(result) }
}
#[doc = "let n = NonZero::new(-1isize).unwrap();"]
#[doc = "assert_eq!(n.cast_unsigned(), NonZero::<usize>::MAX);"]
#[stable(feature = "integer_sign_cast", since = "1.87.0")]
#[rustc_const_stable(feature = "integer_sign_cast", since = "1.87.0")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline(always)]
pub const fn cast_unsigned(self) -> NonZero<usize> {
unsafe { NonZero::new_unchecked(self.get().cast_unsigned()) }
}
#[doc = "let limit = NonZero::<usize>::new(100).unwrap();"]
#[doc = " NonZero::<isize>::new(120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<isize>::new(100).unwrap(),"]
#[doc =
" NonZero::<isize>::new(-120).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<isize>::new(-100).unwrap(),"]
#[doc = " NonZero::<isize>::new(80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<isize>::new(80).unwrap(),"]
#[doc = " NonZero::<isize>::new(-80).unwrap().clamp_magnitude(limit),"]
#[doc = " NonZero::<isize>::new(-80).unwrap(),"]
#[inline]
#[must_use =
"method returns a new number and does not mutate the original value"]
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
#[unstable(feature = "clamp_magnitude", issue = "148519")]
pub const fn clamp_magnitude(self, limit: NonZero<usize>) -> Self {
unsafe {
Self::new_unchecked(self.get().clamp_magnitude(limit.get()))
}
}
#[doc = "let two = NonZero::new(2isize)?;"]
#[doc = "let four = NonZero::new(4isize)?;"]
#[doc = "let max = NonZero::new(isize::MAX)?;"]
#[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 checked_mul(self, other: Self) -> Option<Self> {
if let Some(result) = self.get().checked_mul(other.get()) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc = "Return [`NonZero::<isize>::MAX`] on overflow."]
#[doc = "let two = NonZero::new(2isize)?;"]
#[doc = "let four = NonZero::new(4isize)?;"]
#[doc = "let max = NonZero::new(isize::MAX)?;"]
#[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 saturating_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_mul(other.get())) }
}
#[doc = "`self * rhs > isize::MAX`, or `self * rhs < isize::MIN`."]
#[doc = "let two = NonZero::new(2isize)?;"]
#[doc = "let four = NonZero::new(4isize)?;"]
#[unstable(feature = "nonzero_ops", issue = "84186")]
#[must_use =
"this returns the result of the operation, \
without modifying the original"]
#[inline]
pub const unsafe fn unchecked_mul(self, other: Self) -> Self {
unsafe { Self::new_unchecked(self.get().unchecked_mul(other.get())) }
}
#[doc = "let three = NonZero::new(3isize)?;"]
#[doc = "let twenty_seven = NonZero::new(27isize)?;"]
#[doc = "let half_max = NonZero::new(isize::MAX / 2)?;"]
#[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 checked_pow(self, other: u32) -> Option<Self> {
if let Some(result) = self.get().checked_pow(other) {
Some(unsafe { Self::new_unchecked(result) })
} else { None }
}
#[doc =
"Return [`NonZero::<isize>::MIN`] or [`NonZero::<isize>::MAX`] on overflow."]
#[doc = "let three = NonZero::new(3isize)?;"]
#[doc = "let twenty_seven = NonZero::new(27isize)?;"]
#[doc = "let max = NonZero::new(isize::MAX)?;"]
#[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 saturating_pow(self, other: u32) -> Self {
unsafe { Self::new_unchecked(self.get().saturating_pow(other)) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<isize>::from_ascii_bytes(b\"+10\"), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<isize>::from_ascii_bytes(b\"1 \").is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes<T>(src: T) -> Result<Self, ParseIntError>
where T: [const] AsRef<[u8]> + [const] crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), 10)
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<isize>::from_ascii_bytes_radix(b\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc =
"assert!(NonZero::<isize>::from_ascii_bytes_radix(b\"1 \", 10).is_err());"]
#[unstable(feature = "int_from_ascii", issue = "134821")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[inline]
pub const fn from_ascii_bytes_radix<T>(src: T, radix: u32)
-> Result<Self, ParseIntError> where T: [const] AsRef<[u8]> + [const]
crate::marker::Destruct {
Self::from_ascii_bytes_radix_impl(src.as_ref(), radix)
}
#[inline]
const fn from_ascii_bytes_radix_impl(src: &[u8], radix: u32)
-> Result<Self, ParseIntError> {
let n =
match <isize>::from_ascii_bytes_radix_impl(src, radix) {
Ok(n) => n,
Err(err) => return Err(err),
};
if let Some(n) = Self::new(n) {
Ok(n)
} else { Err(ParseIntError { kind: IntErrorKind::Zero }) }
}
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<isize>::from_str_radix(\"A\", 16), Ok(NonZero::new(10)?));"]
#[doc = "assert!(NonZero::<isize>::from_str_radix(\"1 \", 10).is_err());"]
#[stable(feature = "nonzero_from_str_radix", since = "1.98.0")]
#[rustc_const_stable(feature = "nonzero_from_str_radix", since =
"1.98.0")]
#[inline]
pub const fn from_str_radix(src: &str, radix: u32)
-> Result<Self, ParseIntError> {
Self::from_ascii_bytes_radix_impl(src.as_bytes(), radix)
}
}
#[stable(feature = "nonzero_parse", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
const impl FromStr for NonZero<isize> {
type Err = ParseIntError;
#[doc = " `+` or `-` "]
#[doc =
"assert_eq!(NonZero::<isize>::from_str(\"+10\"), Ok(NonZero::new(10).unwrap()));"]
#[doc = "assert!(NonZero::<isize>::from_str(\"1 \").is_err());"]
#[inline]
fn from_str(src: &str) -> Result<Self, Self::Err> {
Self::from_str_radix(src, 10)
}
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for NonZero<isize> {
type Output = Self;
#[inline]
fn neg(self) -> Self { unsafe { Self::new_unchecked(self.get().neg()) } }
}
#[stable(feature = "signed_nonzero_neg", since = "1.71.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "143802")]
const impl Neg for &NonZero<isize> {
type Output = <NonZero<isize> as Neg>::Output;
#[inline]
fn neg(self) -> <NonZero<isize> as Neg>::Output { Neg::neg(*self) }
}nonzero_integer! {
2849 Self = NonZeroIsize,
2850 Primitive = signed isize,
2851 UnsignedPrimitive = usize,
2852 rot = 12,
2853 rot_op = "0xaa00000000006e1",
2854 rot_result = "0x6e10aa",
2855 swap_op = "0x1234567890123456",
2856 swapped = "0x5634129078563412",
2857 reversed = "0x6a2c48091e6a2c48",
2858}