core/num/
wrapping.rs

1//! Definitions of `Wrapping<T>`.
2
3use crate::fmt;
4use crate::ops::{
5    Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Div, DivAssign,
6    Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign,
7};
8
9/// Provides intentionally-wrapped arithmetic on `T`.
10///
11/// Operations like `+` on `u32` values are intended to never overflow,
12/// and in some debug configurations overflow is detected and results
13/// in a panic. While most arithmetic falls into this category, some
14/// code explicitly expects and relies upon modular arithmetic (e.g.,
15/// hashing).
16///
17/// Wrapping arithmetic can be achieved either through methods like
18/// `wrapping_add`, or through the `Wrapping<T>` type, which says that
19/// all standard arithmetic operations on the underlying value are
20/// intended to have wrapping semantics.
21///
22/// The underlying value can be retrieved through the `.0` index of the
23/// `Wrapping` tuple.
24///
25/// # Examples
26///
27/// ```
28/// use std::num::Wrapping;
29///
30/// let zero = Wrapping(0u32);
31/// let one = Wrapping(1u32);
32///
33/// assert_eq!(u32::MAX, (zero - one).0);
34/// ```
35///
36/// # Layout
37///
38/// `Wrapping<T>` is guaranteed to have the same layout and ABI as `T`.
39#[stable(feature = "rust1", since = "1.0.0")]
40#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default, Hash)]
41#[repr(transparent)]
42#[rustc_diagnostic_item = "Wrapping"]
43pub struct Wrapping<T>(#[stable(feature = "rust1", since = "1.0.0")] pub T);
44
45#[stable(feature = "rust1", since = "1.0.0")]
46impl<T: fmt::Debug> fmt::Debug for Wrapping<T> {
47    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
48        self.0.fmt(f)
49    }
50}
51
52#[stable(feature = "wrapping_display", since = "1.10.0")]
53impl<T: fmt::Display> fmt::Display for Wrapping<T> {
54    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
55        self.0.fmt(f)
56    }
57}
58
59#[stable(feature = "wrapping_fmt", since = "1.11.0")]
60impl<T: fmt::Binary> fmt::Binary for Wrapping<T> {
61    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
62        self.0.fmt(f)
63    }
64}
65
66#[stable(feature = "wrapping_fmt", since = "1.11.0")]
67impl<T: fmt::Octal> fmt::Octal for Wrapping<T> {
68    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
69        self.0.fmt(f)
70    }
71}
72
73#[stable(feature = "wrapping_fmt", since = "1.11.0")]
74impl<T: fmt::LowerHex> fmt::LowerHex for Wrapping<T> {
75    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
76        self.0.fmt(f)
77    }
78}
79
80#[stable(feature = "wrapping_fmt", since = "1.11.0")]
81impl<T: fmt::UpperHex> fmt::UpperHex for Wrapping<T> {
82    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
83        self.0.fmt(f)
84    }
85}
86
87#[allow(unused_macros)]
88macro_rules! sh_impl_signed {
89    ($t:ident, $f:ident) => {
90        #[stable(feature = "rust1", since = "1.0.0")]
91        impl Shl<$f> for Wrapping<$t> {
92            type Output = Wrapping<$t>;
93
94            #[inline]
95            fn shl(self, other: $f) -> Wrapping<$t> {
96                if other < 0 {
97                    Wrapping(self.0.wrapping_shr((-other & self::shift_max::$t as $f) as u32))
98                } else {
99                    Wrapping(self.0.wrapping_shl((other & self::shift_max::$t as $f) as u32))
100                }
101            }
102        }
103        forward_ref_binop! { impl Shl, shl for Wrapping<$t>, $f,
104        #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
105
106        #[stable(feature = "op_assign_traits", since = "1.8.0")]
107        impl ShlAssign<$f> for Wrapping<$t> {
108            #[inline]
109            fn shl_assign(&mut self, other: $f) {
110                *self = *self << other;
111            }
112        }
113        forward_ref_op_assign! { impl ShlAssign, shl_assign for Wrapping<$t>, $f }
114
115        #[stable(feature = "rust1", since = "1.0.0")]
116        impl Shr<$f> for Wrapping<$t> {
117            type Output = Wrapping<$t>;
118
119            #[inline]
120            fn shr(self, other: $f) -> Wrapping<$t> {
121                if other < 0 {
122                    Wrapping(self.0.wrapping_shl((-other & self::shift_max::$t as $f) as u32))
123                } else {
124                    Wrapping(self.0.wrapping_shr((other & self::shift_max::$t as $f) as u32))
125                }
126            }
127        }
128        forward_ref_binop! { impl Shr, shr for Wrapping<$t>, $f,
129        #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
130
131        #[stable(feature = "op_assign_traits", since = "1.8.0")]
132        impl ShrAssign<$f> for Wrapping<$t> {
133            #[inline]
134            fn shr_assign(&mut self, other: $f) {
135                *self = *self >> other;
136            }
137        }
138        forward_ref_op_assign! { impl ShrAssign, shr_assign for Wrapping<$t>, $f }
139    };
140}
141
142macro_rules! sh_impl_unsigned {
143    ($t:ident, $f:ident) => {
144        #[stable(feature = "rust1", since = "1.0.0")]
145        impl Shl<$f> for Wrapping<$t> {
146            type Output = Wrapping<$t>;
147
148            #[inline]
149            fn shl(self, other: $f) -> Wrapping<$t> {
150                Wrapping(self.0.wrapping_shl((other & self::shift_max::$t as $f) as u32))
151            }
152        }
153        forward_ref_binop! { impl Shl, shl for Wrapping<$t>, $f,
154        #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
155
156        #[stable(feature = "op_assign_traits", since = "1.8.0")]
157        impl ShlAssign<$f> for Wrapping<$t> {
158            #[inline]
159            fn shl_assign(&mut self, other: $f) {
160                *self = *self << other;
161            }
162        }
163        forward_ref_op_assign! { impl ShlAssign, shl_assign for Wrapping<$t>, $f }
164
165        #[stable(feature = "rust1", since = "1.0.0")]
166        impl Shr<$f> for Wrapping<$t> {
167            type Output = Wrapping<$t>;
168
169            #[inline]
170            fn shr(self, other: $f) -> Wrapping<$t> {
171                Wrapping(self.0.wrapping_shr((other & self::shift_max::$t as $f) as u32))
172            }
173        }
174        forward_ref_binop! { impl Shr, shr for Wrapping<$t>, $f,
175        #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
176
177        #[stable(feature = "op_assign_traits", since = "1.8.0")]
178        impl ShrAssign<$f> for Wrapping<$t> {
179            #[inline]
180            fn shr_assign(&mut self, other: $f) {
181                *self = *self >> other;
182            }
183        }
184        forward_ref_op_assign! { impl ShrAssign, shr_assign for Wrapping<$t>, $f }
185    };
186}
187
188// FIXME (#23545): uncomment the remaining impls
189macro_rules! sh_impl_all {
190    ($($t:ident)*) => ($(
191        //sh_impl_unsigned! { $t, u8 }
192        //sh_impl_unsigned! { $t, u16 }
193        //sh_impl_unsigned! { $t, u32 }
194        //sh_impl_unsigned! { $t, u64 }
195        //sh_impl_unsigned! { $t, u128 }
196        sh_impl_unsigned! { $t, usize }
197
198        //sh_impl_signed! { $t, i8 }
199        //sh_impl_signed! { $t, i16 }
200        //sh_impl_signed! { $t, i32 }
201        //sh_impl_signed! { $t, i64 }
202        //sh_impl_signed! { $t, i128 }
203        //sh_impl_signed! { $t, isize }
204    )*)
205}
206
207sh_impl_all! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize }
208
209// FIXME(30524): impl Op<T> for Wrapping<T>, impl OpAssign<T> for Wrapping<T>
210macro_rules! wrapping_impl {
211    ($($t:ty)*) => ($(
212        #[stable(feature = "rust1", since = "1.0.0")]
213        impl Add for Wrapping<$t> {
214            type Output = Wrapping<$t>;
215
216            #[inline]
217            fn add(self, other: Wrapping<$t>) -> Wrapping<$t> {
218                Wrapping(self.0.wrapping_add(other.0))
219            }
220        }
221        forward_ref_binop! { impl Add, add for Wrapping<$t>, Wrapping<$t>,
222                #[stable(feature = "wrapping_ref", since = "1.14.0")] }
223
224        #[stable(feature = "op_assign_traits", since = "1.8.0")]
225        impl AddAssign for Wrapping<$t> {
226            #[inline]
227            fn add_assign(&mut self, other: Wrapping<$t>) {
228                *self = *self + other;
229            }
230        }
231        forward_ref_op_assign! { impl AddAssign, add_assign for Wrapping<$t>, Wrapping<$t> }
232
233        #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
234        impl AddAssign<$t> for Wrapping<$t> {
235            #[inline]
236            fn add_assign(&mut self, other: $t) {
237                *self = *self + Wrapping(other);
238            }
239        }
240        forward_ref_op_assign! { impl AddAssign, add_assign for Wrapping<$t>, $t }
241
242        #[stable(feature = "rust1", since = "1.0.0")]
243        impl Sub for Wrapping<$t> {
244            type Output = Wrapping<$t>;
245
246            #[inline]
247            fn sub(self, other: Wrapping<$t>) -> Wrapping<$t> {
248                Wrapping(self.0.wrapping_sub(other.0))
249            }
250        }
251        forward_ref_binop! { impl Sub, sub for Wrapping<$t>, Wrapping<$t>,
252                #[stable(feature = "wrapping_ref", since = "1.14.0")] }
253
254        #[stable(feature = "op_assign_traits", since = "1.8.0")]
255        impl SubAssign for Wrapping<$t> {
256            #[inline]
257            fn sub_assign(&mut self, other: Wrapping<$t>) {
258                *self = *self - other;
259            }
260        }
261        forward_ref_op_assign! { impl SubAssign, sub_assign for Wrapping<$t>, Wrapping<$t> }
262
263        #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
264        impl SubAssign<$t> for Wrapping<$t> {
265            #[inline]
266            fn sub_assign(&mut self, other: $t) {
267                *self = *self - Wrapping(other);
268            }
269        }
270        forward_ref_op_assign! { impl SubAssign, sub_assign for Wrapping<$t>, $t }
271
272        #[stable(feature = "rust1", since = "1.0.0")]
273        impl Mul for Wrapping<$t> {
274            type Output = Wrapping<$t>;
275
276            #[inline]
277            fn mul(self, other: Wrapping<$t>) -> Wrapping<$t> {
278                Wrapping(self.0.wrapping_mul(other.0))
279            }
280        }
281        forward_ref_binop! { impl Mul, mul for Wrapping<$t>, Wrapping<$t>,
282                #[stable(feature = "wrapping_ref", since = "1.14.0")] }
283
284        #[stable(feature = "op_assign_traits", since = "1.8.0")]
285        impl MulAssign for Wrapping<$t> {
286            #[inline]
287            fn mul_assign(&mut self, other: Wrapping<$t>) {
288                *self = *self * other;
289            }
290        }
291        forward_ref_op_assign! { impl MulAssign, mul_assign for Wrapping<$t>, Wrapping<$t> }
292
293        #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
294        impl MulAssign<$t> for Wrapping<$t> {
295            #[inline]
296            fn mul_assign(&mut self, other: $t) {
297                *self = *self * Wrapping(other);
298            }
299        }
300        forward_ref_op_assign! { impl MulAssign, mul_assign for Wrapping<$t>, $t }
301
302        #[stable(feature = "wrapping_div", since = "1.3.0")]
303        impl Div for Wrapping<$t> {
304            type Output = Wrapping<$t>;
305
306            #[inline]
307            fn div(self, other: Wrapping<$t>) -> Wrapping<$t> {
308                Wrapping(self.0.wrapping_div(other.0))
309            }
310        }
311        forward_ref_binop! { impl Div, div for Wrapping<$t>, Wrapping<$t>,
312                #[stable(feature = "wrapping_ref", since = "1.14.0")] }
313
314        #[stable(feature = "op_assign_traits", since = "1.8.0")]
315        impl DivAssign for Wrapping<$t> {
316            #[inline]
317            fn div_assign(&mut self, other: Wrapping<$t>) {
318                *self = *self / other;
319            }
320        }
321        forward_ref_op_assign! { impl DivAssign, div_assign for Wrapping<$t>, Wrapping<$t> }
322
323        #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
324        impl DivAssign<$t> for Wrapping<$t> {
325            #[inline]
326            fn div_assign(&mut self, other: $t) {
327                *self = *self / Wrapping(other);
328            }
329        }
330        forward_ref_op_assign! { impl DivAssign, div_assign for Wrapping<$t>, $t }
331
332        #[stable(feature = "wrapping_impls", since = "1.7.0")]
333        impl Rem for Wrapping<$t> {
334            type Output = Wrapping<$t>;
335
336            #[inline]
337            fn rem(self, other: Wrapping<$t>) -> Wrapping<$t> {
338                Wrapping(self.0.wrapping_rem(other.0))
339            }
340        }
341        forward_ref_binop! { impl Rem, rem for Wrapping<$t>, Wrapping<$t>,
342                #[stable(feature = "wrapping_ref", since = "1.14.0")] }
343
344        #[stable(feature = "op_assign_traits", since = "1.8.0")]
345        impl RemAssign for Wrapping<$t> {
346            #[inline]
347            fn rem_assign(&mut self, other: Wrapping<$t>) {
348                *self = *self % other;
349            }
350        }
351        forward_ref_op_assign! { impl RemAssign, rem_assign for Wrapping<$t>, Wrapping<$t> }
352
353        #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
354        impl RemAssign<$t> for Wrapping<$t> {
355            #[inline]
356            fn rem_assign(&mut self, other: $t) {
357                *self = *self % Wrapping(other);
358            }
359        }
360        forward_ref_op_assign! { impl RemAssign, rem_assign for Wrapping<$t>, $t }
361
362        #[stable(feature = "rust1", since = "1.0.0")]
363        impl Not for Wrapping<$t> {
364            type Output = Wrapping<$t>;
365
366            #[inline]
367            fn not(self) -> Wrapping<$t> {
368                Wrapping(!self.0)
369            }
370        }
371        forward_ref_unop! { impl Not, not for Wrapping<$t>,
372                #[stable(feature = "wrapping_ref", since = "1.14.0")] }
373
374        #[stable(feature = "rust1", since = "1.0.0")]
375        impl BitXor for Wrapping<$t> {
376            type Output = Wrapping<$t>;
377
378            #[inline]
379            fn bitxor(self, other: Wrapping<$t>) -> Wrapping<$t> {
380                Wrapping(self.0 ^ other.0)
381            }
382        }
383        forward_ref_binop! { impl BitXor, bitxor for Wrapping<$t>, Wrapping<$t>,
384                #[stable(feature = "wrapping_ref", since = "1.14.0")] }
385
386        #[stable(feature = "op_assign_traits", since = "1.8.0")]
387        impl BitXorAssign for Wrapping<$t> {
388            #[inline]
389            fn bitxor_assign(&mut self, other: Wrapping<$t>) {
390                *self = *self ^ other;
391            }
392        }
393        forward_ref_op_assign! { impl BitXorAssign, bitxor_assign for Wrapping<$t>, Wrapping<$t> }
394
395        #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
396        impl BitXorAssign<$t> for Wrapping<$t> {
397            #[inline]
398            fn bitxor_assign(&mut self, other: $t) {
399                *self = *self ^ Wrapping(other);
400            }
401        }
402        forward_ref_op_assign! { impl BitXorAssign, bitxor_assign for Wrapping<$t>, $t }
403
404        #[stable(feature = "rust1", since = "1.0.0")]
405        impl BitOr for Wrapping<$t> {
406            type Output = Wrapping<$t>;
407
408            #[inline]
409            fn bitor(self, other: Wrapping<$t>) -> Wrapping<$t> {
410                Wrapping(self.0 | other.0)
411            }
412        }
413        forward_ref_binop! { impl BitOr, bitor for Wrapping<$t>, Wrapping<$t>,
414                #[stable(feature = "wrapping_ref", since = "1.14.0")] }
415
416        #[stable(feature = "op_assign_traits", since = "1.8.0")]
417        impl BitOrAssign for Wrapping<$t> {
418            #[inline]
419            fn bitor_assign(&mut self, other: Wrapping<$t>) {
420                *self = *self | other;
421            }
422        }
423        forward_ref_op_assign! { impl BitOrAssign, bitor_assign for Wrapping<$t>, Wrapping<$t> }
424
425        #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
426        impl BitOrAssign<$t> for Wrapping<$t> {
427            #[inline]
428            fn bitor_assign(&mut self, other: $t) {
429                *self = *self | Wrapping(other);
430            }
431        }
432        forward_ref_op_assign! { impl BitOrAssign, bitor_assign for Wrapping<$t>, $t }
433
434        #[stable(feature = "rust1", since = "1.0.0")]
435        impl BitAnd for Wrapping<$t> {
436            type Output = Wrapping<$t>;
437
438            #[inline]
439            fn bitand(self, other: Wrapping<$t>) -> Wrapping<$t> {
440                Wrapping(self.0 & other.0)
441            }
442        }
443        forward_ref_binop! { impl BitAnd, bitand for Wrapping<$t>, Wrapping<$t>,
444                #[stable(feature = "wrapping_ref", since = "1.14.0")] }
445
446        #[stable(feature = "op_assign_traits", since = "1.8.0")]
447        impl BitAndAssign for Wrapping<$t> {
448            #[inline]
449            fn bitand_assign(&mut self, other: Wrapping<$t>) {
450                *self = *self & other;
451            }
452        }
453        forward_ref_op_assign! { impl BitAndAssign, bitand_assign for Wrapping<$t>, Wrapping<$t> }
454
455        #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
456        impl BitAndAssign<$t> for Wrapping<$t> {
457            #[inline]
458            fn bitand_assign(&mut self, other: $t) {
459                *self = *self & Wrapping(other);
460            }
461        }
462        forward_ref_op_assign! { impl BitAndAssign, bitand_assign for Wrapping<$t>, $t }
463
464        #[stable(feature = "wrapping_neg", since = "1.10.0")]
465        impl Neg for Wrapping<$t> {
466            type Output = Self;
467            #[inline]
468            fn neg(self) -> Self {
469                Wrapping(0) - self
470            }
471        }
472        forward_ref_unop! { impl Neg, neg for Wrapping<$t>,
473                #[stable(feature = "wrapping_ref", since = "1.14.0")] }
474
475    )*)
476}
477
478wrapping_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
479
480macro_rules! wrapping_int_impl {
481    ($($t:ty)*) => ($(
482        impl Wrapping<$t> {
483            /// Returns the smallest value that can be represented by this integer type.
484            ///
485            /// # Examples
486            ///
487            /// Basic usage:
488            ///
489            /// ```
490            /// #![feature(wrapping_int_impl)]
491            /// use std::num::Wrapping;
492            ///
493            #[doc = concat!("assert_eq!(<Wrapping<", stringify!($t), ">>::MIN, Wrapping(", stringify!($t), "::MIN));")]
494            /// ```
495            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
496            pub const MIN: Self = Self(<$t>::MIN);
497
498            /// Returns the largest value that can be represented by this integer type.
499            ///
500            /// # Examples
501            ///
502            /// Basic usage:
503            ///
504            /// ```
505            /// #![feature(wrapping_int_impl)]
506            /// use std::num::Wrapping;
507            ///
508            #[doc = concat!("assert_eq!(<Wrapping<", stringify!($t), ">>::MAX, Wrapping(", stringify!($t), "::MAX));")]
509            /// ```
510            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
511            pub const MAX: Self = Self(<$t>::MAX);
512
513            /// Returns the size of this integer type in bits.
514            ///
515            /// # Examples
516            ///
517            /// Basic usage:
518            ///
519            /// ```
520            /// #![feature(wrapping_int_impl)]
521            /// use std::num::Wrapping;
522            ///
523            #[doc = concat!("assert_eq!(<Wrapping<", stringify!($t), ">>::BITS, ", stringify!($t), "::BITS);")]
524            /// ```
525            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
526            pub const BITS: u32 = <$t>::BITS;
527
528            /// Returns the number of ones in the binary representation of `self`.
529            ///
530            /// # Examples
531            ///
532            /// Basic usage:
533            ///
534            /// ```
535            /// #![feature(wrapping_int_impl)]
536            /// use std::num::Wrapping;
537            ///
538            #[doc = concat!("let n = Wrapping(0b01001100", stringify!($t), ");")]
539            ///
540            /// assert_eq!(n.count_ones(), 3);
541            /// ```
542            #[inline]
543            #[doc(alias = "popcount")]
544            #[doc(alias = "popcnt")]
545            #[must_use = "this returns the result of the operation, \
546                          without modifying the original"]
547            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
548            pub const fn count_ones(self) -> u32 {
549                self.0.count_ones()
550            }
551
552            /// Returns the number of zeros in the binary representation of `self`.
553            ///
554            /// # Examples
555            ///
556            /// Basic usage:
557            ///
558            /// ```
559            /// #![feature(wrapping_int_impl)]
560            /// use std::num::Wrapping;
561            ///
562            #[doc = concat!("assert_eq!(Wrapping(!0", stringify!($t), ").count_zeros(), 0);")]
563            /// ```
564            #[inline]
565            #[must_use = "this returns the result of the operation, \
566                          without modifying the original"]
567            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
568            pub const fn count_zeros(self) -> u32 {
569                self.0.count_zeros()
570            }
571
572            /// Returns the number of trailing zeros in the binary representation of `self`.
573            ///
574            /// # Examples
575            ///
576            /// Basic usage:
577            ///
578            /// ```
579            /// #![feature(wrapping_int_impl)]
580            /// use std::num::Wrapping;
581            ///
582            #[doc = concat!("let n = Wrapping(0b0101000", stringify!($t), ");")]
583            ///
584            /// assert_eq!(n.trailing_zeros(), 3);
585            /// ```
586            #[inline]
587            #[must_use = "this returns the result of the operation, \
588                          without modifying the original"]
589            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
590            pub const fn trailing_zeros(self) -> u32 {
591                self.0.trailing_zeros()
592            }
593
594            /// Shifts the bits to the left by a specified amount, `n`,
595            /// wrapping the truncated bits to the end of the resulting
596            /// integer.
597            ///
598            /// Please note this isn't the same operation as the `<<` shifting
599            /// operator!
600            ///
601            /// # Examples
602            ///
603            /// Basic usage:
604            ///
605            /// ```
606            /// #![feature(wrapping_int_impl)]
607            /// use std::num::Wrapping;
608            ///
609            /// let n: Wrapping<i64> = Wrapping(0x0123456789ABCDEF);
610            /// let m: Wrapping<i64> = Wrapping(-0x76543210FEDCBA99);
611            ///
612            /// assert_eq!(n.rotate_left(32), m);
613            /// ```
614            #[inline]
615            #[must_use = "this returns the result of the operation, \
616                          without modifying the original"]
617            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
618            pub const fn rotate_left(self, n: u32) -> Self {
619                Wrapping(self.0.rotate_left(n))
620            }
621
622            /// Shifts the bits to the right by a specified amount, `n`,
623            /// wrapping the truncated bits to the beginning of the resulting
624            /// integer.
625            ///
626            /// Please note this isn't the same operation as the `>>` shifting
627            /// operator!
628            ///
629            /// # Examples
630            ///
631            /// Basic usage:
632            ///
633            /// ```
634            /// #![feature(wrapping_int_impl)]
635            /// use std::num::Wrapping;
636            ///
637            /// let n: Wrapping<i64> = Wrapping(0x0123456789ABCDEF);
638            /// let m: Wrapping<i64> = Wrapping(-0xFEDCBA987654322);
639            ///
640            /// assert_eq!(n.rotate_right(4), m);
641            /// ```
642            #[inline]
643            #[must_use = "this returns the result of the operation, \
644                          without modifying the original"]
645            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
646            pub const fn rotate_right(self, n: u32) -> Self {
647                Wrapping(self.0.rotate_right(n))
648            }
649
650            /// Reverses the byte order of the integer.
651            ///
652            /// # Examples
653            ///
654            /// Basic usage:
655            ///
656            /// ```
657            /// #![feature(wrapping_int_impl)]
658            /// use std::num::Wrapping;
659            ///
660            /// let n: Wrapping<i16> = Wrapping(0b0000000_01010101);
661            /// assert_eq!(n, Wrapping(85));
662            ///
663            /// let m = n.swap_bytes();
664            ///
665            /// assert_eq!(m, Wrapping(0b01010101_00000000));
666            /// assert_eq!(m, Wrapping(21760));
667            /// ```
668            #[inline]
669            #[must_use = "this returns the result of the operation, \
670                          without modifying the original"]
671            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
672            pub const fn swap_bytes(self) -> Self {
673                Wrapping(self.0.swap_bytes())
674            }
675
676            /// Reverses the bit pattern of the integer.
677            ///
678            /// # Examples
679            ///
680            /// Please note that this example is shared between integer types.
681            /// Which explains why `i16` is used here.
682            ///
683            /// Basic usage:
684            ///
685            /// ```
686            /// use std::num::Wrapping;
687            ///
688            /// let n = Wrapping(0b0000000_01010101i16);
689            /// assert_eq!(n, Wrapping(85));
690            ///
691            /// let m = n.reverse_bits();
692            ///
693            /// assert_eq!(m.0 as u16, 0b10101010_00000000);
694            /// assert_eq!(m, Wrapping(-22016));
695            /// ```
696            #[stable(feature = "reverse_bits", since = "1.37.0")]
697            #[rustc_const_stable(feature = "const_reverse_bits", since = "1.37.0")]
698            #[must_use = "this returns the result of the operation, \
699                          without modifying the original"]
700            #[inline]
701            pub const fn reverse_bits(self) -> Self {
702                Wrapping(self.0.reverse_bits())
703            }
704
705            /// Converts an integer from big endian to the target's endianness.
706            ///
707            /// On big endian this is a no-op. On little endian the bytes are
708            /// swapped.
709            ///
710            /// # Examples
711            ///
712            /// Basic usage:
713            ///
714            /// ```
715            /// #![feature(wrapping_int_impl)]
716            /// use std::num::Wrapping;
717            ///
718            #[doc = concat!("let n = Wrapping(0x1A", stringify!($t), ");")]
719            ///
720            /// if cfg!(target_endian = "big") {
721            #[doc = concat!("    assert_eq!(<Wrapping<", stringify!($t), ">>::from_be(n), n)")]
722            /// } else {
723            #[doc = concat!("    assert_eq!(<Wrapping<", stringify!($t), ">>::from_be(n), n.swap_bytes())")]
724            /// }
725            /// ```
726            #[inline]
727            #[must_use]
728            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
729            pub const fn from_be(x: Self) -> Self {
730                Wrapping(<$t>::from_be(x.0))
731            }
732
733            /// Converts an integer from little endian to the target's endianness.
734            ///
735            /// On little endian this is a no-op. On big endian the bytes are
736            /// swapped.
737            ///
738            /// # Examples
739            ///
740            /// Basic usage:
741            ///
742            /// ```
743            /// #![feature(wrapping_int_impl)]
744            /// use std::num::Wrapping;
745            ///
746            #[doc = concat!("let n = Wrapping(0x1A", stringify!($t), ");")]
747            ///
748            /// if cfg!(target_endian = "little") {
749            #[doc = concat!("    assert_eq!(<Wrapping<", stringify!($t), ">>::from_le(n), n)")]
750            /// } else {
751            #[doc = concat!("    assert_eq!(<Wrapping<", stringify!($t), ">>::from_le(n), n.swap_bytes())")]
752            /// }
753            /// ```
754            #[inline]
755            #[must_use]
756            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
757            pub const fn from_le(x: Self) -> Self {
758                Wrapping(<$t>::from_le(x.0))
759            }
760
761            /// Converts `self` to big endian from the target's endianness.
762            ///
763            /// On big endian this is a no-op. On little endian the bytes are
764            /// swapped.
765            ///
766            /// # Examples
767            ///
768            /// Basic usage:
769            ///
770            /// ```
771            /// #![feature(wrapping_int_impl)]
772            /// use std::num::Wrapping;
773            ///
774            #[doc = concat!("let n = Wrapping(0x1A", stringify!($t), ");")]
775            ///
776            /// if cfg!(target_endian = "big") {
777            ///     assert_eq!(n.to_be(), n)
778            /// } else {
779            ///     assert_eq!(n.to_be(), n.swap_bytes())
780            /// }
781            /// ```
782            #[inline]
783            #[must_use = "this returns the result of the operation, \
784                          without modifying the original"]
785            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
786            pub const fn to_be(self) -> Self {
787                Wrapping(self.0.to_be())
788            }
789
790            /// Converts `self` to little endian from the target's endianness.
791            ///
792            /// On little endian this is a no-op. On big endian the bytes are
793            /// swapped.
794            ///
795            /// # Examples
796            ///
797            /// Basic usage:
798            ///
799            /// ```
800            /// #![feature(wrapping_int_impl)]
801            /// use std::num::Wrapping;
802            ///
803            #[doc = concat!("let n = Wrapping(0x1A", stringify!($t), ");")]
804            ///
805            /// if cfg!(target_endian = "little") {
806            ///     assert_eq!(n.to_le(), n)
807            /// } else {
808            ///     assert_eq!(n.to_le(), n.swap_bytes())
809            /// }
810            /// ```
811            #[inline]
812            #[must_use = "this returns the result of the operation, \
813                          without modifying the original"]
814            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
815            pub const fn to_le(self) -> Self {
816                Wrapping(self.0.to_le())
817            }
818
819            /// Raises self to the power of `exp`, using exponentiation by squaring.
820            ///
821            /// # Examples
822            ///
823            /// Basic usage:
824            ///
825            /// ```
826            /// #![feature(wrapping_int_impl)]
827            /// use std::num::Wrapping;
828            ///
829            #[doc = concat!("assert_eq!(Wrapping(3", stringify!($t), ").pow(4), Wrapping(81));")]
830            /// ```
831            ///
832            /// Results that are too large are wrapped:
833            ///
834            /// ```
835            /// #![feature(wrapping_int_impl)]
836            /// use std::num::Wrapping;
837            ///
838            /// assert_eq!(Wrapping(3i8).pow(5), Wrapping(-13));
839            /// assert_eq!(Wrapping(3i8).pow(6), Wrapping(-39));
840            /// ```
841            #[inline]
842            #[must_use = "this returns the result of the operation, \
843                          without modifying the original"]
844            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
845            pub fn pow(self, exp: u32) -> Self {
846                Wrapping(self.0.wrapping_pow(exp))
847            }
848        }
849    )*)
850}
851
852wrapping_int_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
853
854macro_rules! wrapping_int_impl_signed {
855    ($($t:ty)*) => ($(
856        impl Wrapping<$t> {
857            /// Returns the number of leading zeros in the binary representation of `self`.
858            ///
859            /// # Examples
860            ///
861            /// Basic usage:
862            ///
863            /// ```
864            /// #![feature(wrapping_int_impl)]
865            /// use std::num::Wrapping;
866            ///
867            #[doc = concat!("let n = Wrapping(", stringify!($t), "::MAX) >> 2;")]
868            ///
869            /// assert_eq!(n.leading_zeros(), 3);
870            /// ```
871            #[inline]
872            #[must_use = "this returns the result of the operation, \
873                          without modifying the original"]
874            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
875            pub const fn leading_zeros(self) -> u32 {
876                self.0.leading_zeros()
877            }
878
879            /// Computes the absolute value of `self`, wrapping around at
880            /// the boundary of the type.
881            ///
882            /// The only case where such wrapping can occur is when one takes the absolute value of the negative
883            /// minimal value for the type this is a positive value that is too large to represent in the type. In
884            /// such a case, this function returns `MIN` itself.
885            ///
886            /// # Examples
887            ///
888            /// Basic usage:
889            ///
890            /// ```
891            /// #![feature(wrapping_int_impl)]
892            /// use std::num::Wrapping;
893            ///
894            #[doc = concat!("assert_eq!(Wrapping(100", stringify!($t), ").abs(), Wrapping(100));")]
895            #[doc = concat!("assert_eq!(Wrapping(-100", stringify!($t), ").abs(), Wrapping(100));")]
896            #[doc = concat!("assert_eq!(Wrapping(", stringify!($t), "::MIN).abs(), Wrapping(", stringify!($t), "::MIN));")]
897            /// assert_eq!(Wrapping(-128i8).abs().0 as u8, 128u8);
898            /// ```
899            #[inline]
900            #[must_use = "this returns the result of the operation, \
901                          without modifying the original"]
902            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
903            pub fn abs(self) -> Wrapping<$t> {
904                Wrapping(self.0.wrapping_abs())
905            }
906
907            /// Returns a number representing sign of `self`.
908            ///
909            ///  - `0` if the number is zero
910            ///  - `1` if the number is positive
911            ///  - `-1` if the number is negative
912            ///
913            /// # Examples
914            ///
915            /// Basic usage:
916            ///
917            /// ```
918            /// #![feature(wrapping_int_impl)]
919            /// use std::num::Wrapping;
920            ///
921            #[doc = concat!("assert_eq!(Wrapping(10", stringify!($t), ").signum(), Wrapping(1));")]
922            #[doc = concat!("assert_eq!(Wrapping(0", stringify!($t), ").signum(), Wrapping(0));")]
923            #[doc = concat!("assert_eq!(Wrapping(-10", stringify!($t), ").signum(), Wrapping(-1));")]
924            /// ```
925            #[inline]
926            #[must_use = "this returns the result of the operation, \
927                          without modifying the original"]
928            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
929            pub fn signum(self) -> Wrapping<$t> {
930                Wrapping(self.0.signum())
931            }
932
933            /// Returns `true` if `self` is positive and `false` if the number is zero or
934            /// negative.
935            ///
936            /// # Examples
937            ///
938            /// Basic usage:
939            ///
940            /// ```
941            /// #![feature(wrapping_int_impl)]
942            /// use std::num::Wrapping;
943            ///
944            #[doc = concat!("assert!(Wrapping(10", stringify!($t), ").is_positive());")]
945            #[doc = concat!("assert!(!Wrapping(-10", stringify!($t), ").is_positive());")]
946            /// ```
947            #[must_use]
948            #[inline]
949            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
950            pub const fn is_positive(self) -> bool {
951                self.0.is_positive()
952            }
953
954            /// Returns `true` if `self` is negative and `false` if the number is zero or
955            /// positive.
956            ///
957            /// # Examples
958            ///
959            /// Basic usage:
960            ///
961            /// ```
962            /// #![feature(wrapping_int_impl)]
963            /// use std::num::Wrapping;
964            ///
965            #[doc = concat!("assert!(Wrapping(-10", stringify!($t), ").is_negative());")]
966            #[doc = concat!("assert!(!Wrapping(10", stringify!($t), ").is_negative());")]
967            /// ```
968            #[must_use]
969            #[inline]
970            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
971            pub const fn is_negative(self) -> bool {
972                self.0.is_negative()
973            }
974        }
975    )*)
976}
977
978wrapping_int_impl_signed! { isize i8 i16 i32 i64 i128 }
979
980macro_rules! wrapping_int_impl_unsigned {
981    ($($t:ty)*) => ($(
982        impl Wrapping<$t> {
983            /// Returns the number of leading zeros in the binary representation of `self`.
984            ///
985            /// # Examples
986            ///
987            /// Basic usage:
988            ///
989            /// ```
990            /// #![feature(wrapping_int_impl)]
991            /// use std::num::Wrapping;
992            ///
993            #[doc = concat!("let n = Wrapping(", stringify!($t), "::MAX) >> 2;")]
994            ///
995            /// assert_eq!(n.leading_zeros(), 2);
996            /// ```
997            #[inline]
998            #[must_use = "this returns the result of the operation, \
999                          without modifying the original"]
1000            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
1001            pub const fn leading_zeros(self) -> u32 {
1002                self.0.leading_zeros()
1003            }
1004
1005            /// Returns `true` if and only if `self == 2^k` for some `k`.
1006            ///
1007            /// # Examples
1008            ///
1009            /// Basic usage:
1010            ///
1011            /// ```
1012            /// #![feature(wrapping_int_impl)]
1013            /// use std::num::Wrapping;
1014            ///
1015            #[doc = concat!("assert!(Wrapping(16", stringify!($t), ").is_power_of_two());")]
1016            #[doc = concat!("assert!(!Wrapping(10", stringify!($t), ").is_power_of_two());")]
1017            /// ```
1018            #[must_use]
1019            #[inline]
1020            #[unstable(feature = "wrapping_int_impl", issue = "32463")]
1021            pub fn is_power_of_two(self) -> bool {
1022                self.0.is_power_of_two()
1023            }
1024
1025            /// Returns the smallest power of two greater than or equal to `self`.
1026            ///
1027            /// When return value overflows (i.e., `self > (1 << (N-1))` for type
1028            /// `uN`), overflows to `2^N = 0`.
1029            ///
1030            /// # Examples
1031            ///
1032            /// Basic usage:
1033            ///
1034            /// ```
1035            /// #![feature(wrapping_next_power_of_two)]
1036            /// use std::num::Wrapping;
1037            ///
1038            #[doc = concat!("assert_eq!(Wrapping(2", stringify!($t), ").next_power_of_two(), Wrapping(2));")]
1039            #[doc = concat!("assert_eq!(Wrapping(3", stringify!($t), ").next_power_of_two(), Wrapping(4));")]
1040            #[doc = concat!("assert_eq!(Wrapping(200_u8).next_power_of_two(), Wrapping(0));")]
1041            /// ```
1042            #[inline]
1043            #[must_use = "this returns the result of the operation, \
1044                          without modifying the original"]
1045            #[unstable(feature = "wrapping_next_power_of_two", issue = "32463",
1046                       reason = "needs decision on wrapping behavior")]
1047            pub fn next_power_of_two(self) -> Self {
1048                Wrapping(self.0.wrapping_next_power_of_two())
1049            }
1050        }
1051    )*)
1052}
1053
1054wrapping_int_impl_unsigned! { usize u8 u16 u32 u64 u128 }
1055
1056mod shift_max {
1057    #![allow(non_upper_case_globals)]
1058
1059    #[cfg(target_pointer_width = "16")]
1060    mod platform {
1061        pub(crate) const usize: u32 = super::u16;
1062        pub(crate) const isize: u32 = super::i16;
1063    }
1064
1065    #[cfg(target_pointer_width = "32")]
1066    mod platform {
1067        pub(crate) const usize: u32 = super::u32;
1068        pub(crate) const isize: u32 = super::i32;
1069    }
1070
1071    #[cfg(target_pointer_width = "64")]
1072    mod platform {
1073        pub(crate) const usize: u32 = super::u64;
1074        pub(crate) const isize: u32 = super::i64;
1075    }
1076
1077    pub(super) const i8: u32 = (1 << 3) - 1;
1078    pub(super) const i16: u32 = (1 << 4) - 1;
1079    pub(super) const i32: u32 = (1 << 5) - 1;
1080    pub(super) const i64: u32 = (1 << 6) - 1;
1081    pub(super) const i128: u32 = (1 << 7) - 1;
1082    pub(super) use self::platform::isize;
1083
1084    pub(super) const u8: u32 = i8;
1085    pub(super) const u16: u32 = i16;
1086    pub(super) const u32: u32 = i32;
1087    pub(super) const u64: u32 = i64;
1088    pub(super) const u128: u32 = i128;
1089    pub(super) use self::platform::usize;
1090}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy