1use crate::fmt;
4use crate::ops::{
5 Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Div, DivAssign,
6 Mul, MulAssign, Neg, Not, Rem, RemAssign, Sub, SubAssign,
7};
8
9#[stable(feature = "saturating_int_impl", since = "1.74.0")]
39#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default, Hash)]
40#[repr(transparent)]
41#[rustc_diagnostic_item = "Saturating"]
42pub struct Saturating<T>(#[stable(feature = "saturating_int_impl", since = "1.74.0")] pub T);
43
44#[stable(feature = "saturating_int_impl", since = "1.74.0")]
45impl<T: fmt::Debug> fmt::Debug for Saturating<T> {
46 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
47 self.0.fmt(f)
48 }
49}
50
51#[stable(feature = "saturating_int_impl", since = "1.74.0")]
52impl<T: fmt::Display> fmt::Display for Saturating<T> {
53 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
54 self.0.fmt(f)
55 }
56}
57
58#[stable(feature = "saturating_int_impl", since = "1.74.0")]
59impl<T: fmt::Binary> fmt::Binary for Saturating<T> {
60 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
61 self.0.fmt(f)
62 }
63}
64
65#[stable(feature = "saturating_int_impl", since = "1.74.0")]
66impl<T: fmt::Octal> fmt::Octal for Saturating<T> {
67 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
68 self.0.fmt(f)
69 }
70}
71
72#[stable(feature = "saturating_int_impl", since = "1.74.0")]
73impl<T: fmt::LowerHex> fmt::LowerHex for Saturating<T> {
74 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
75 self.0.fmt(f)
76 }
77}
78
79#[stable(feature = "saturating_int_impl", since = "1.74.0")]
80impl<T: fmt::UpperHex> fmt::UpperHex for Saturating<T> {
81 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
82 self.0.fmt(f)
83 }
84}
85
86macro_rules! saturating_impl {
218 ($($t:ty)*) => ($(
219 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
220 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
221 const impl Add for Saturating<$t> {
222 type Output = Saturating<$t>;
223
224 #[inline]
225 fn add(self, other: Saturating<$t>) -> Saturating<$t> {
226 Saturating(self.0.saturating_add(other.0))
227 }
228 }
229 forward_ref_binop! { impl Add, add for Saturating<$t>, Saturating<$t>,
230 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
231 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
232
233 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
234 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
235 const impl AddAssign for Saturating<$t> {
236 #[inline]
237 fn add_assign(&mut self, other: Saturating<$t>) {
238 *self = *self + other;
239 }
240 }
241 forward_ref_op_assign! { impl AddAssign, add_assign for Saturating<$t>, Saturating<$t>,
242 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
243 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
244
245 #[stable(feature = "saturating_int_assign_impl", since = "1.74.0")]
246 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
247 const impl AddAssign<$t> for Saturating<$t> {
248 #[inline]
249 fn add_assign(&mut self, other: $t) {
250 *self = *self + Saturating(other);
251 }
252 }
253 forward_ref_op_assign! { impl AddAssign, add_assign for Saturating<$t>, $t,
254 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
255 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
256
257 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
258 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
259 const impl Sub for Saturating<$t> {
260 type Output = Saturating<$t>;
261
262 #[inline]
263 fn sub(self, other: Saturating<$t>) -> Saturating<$t> {
264 Saturating(self.0.saturating_sub(other.0))
265 }
266 }
267 forward_ref_binop! { impl Sub, sub for Saturating<$t>, Saturating<$t>,
268 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
269 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
270
271 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
272 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
273 const impl SubAssign for Saturating<$t> {
274 #[inline]
275 fn sub_assign(&mut self, other: Saturating<$t>) {
276 *self = *self - other;
277 }
278 }
279 forward_ref_op_assign! { impl SubAssign, sub_assign for Saturating<$t>, Saturating<$t>,
280 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
281 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
282
283 #[stable(feature = "saturating_int_assign_impl", since = "1.74.0")]
284 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
285 const impl SubAssign<$t> for Saturating<$t> {
286 #[inline]
287 fn sub_assign(&mut self, other: $t) {
288 *self = *self - Saturating(other);
289 }
290 }
291 forward_ref_op_assign! { impl SubAssign, sub_assign for Saturating<$t>, $t,
292 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
293 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
294
295 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
296 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
297 const impl Mul for Saturating<$t> {
298 type Output = Saturating<$t>;
299
300 #[inline]
301 fn mul(self, other: Saturating<$t>) -> Saturating<$t> {
302 Saturating(self.0.saturating_mul(other.0))
303 }
304 }
305 forward_ref_binop! { impl Mul, mul for Saturating<$t>, Saturating<$t>,
306 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
307 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
308
309 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
310 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
311 const impl MulAssign for Saturating<$t> {
312 #[inline]
313 fn mul_assign(&mut self, other: Saturating<$t>) {
314 *self = *self * other;
315 }
316 }
317 forward_ref_op_assign! { impl MulAssign, mul_assign for Saturating<$t>, Saturating<$t>,
318 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
319 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
320
321 #[stable(feature = "saturating_int_assign_impl", since = "1.74.0")]
322 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
323 const impl MulAssign<$t> for Saturating<$t> {
324 #[inline]
325 fn mul_assign(&mut self, other: $t) {
326 *self = *self * Saturating(other);
327 }
328 }
329 forward_ref_op_assign! { impl MulAssign, mul_assign for Saturating<$t>, $t,
330 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
331 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
332
333 #[doc = concat!("assert_eq!(Saturating(2", stringify!($t), "), Saturating(5", stringify!($t), ") / Saturating(2));")]
339 #[doc = concat!("assert_eq!(Saturating(", stringify!($t), "::MAX), Saturating(", stringify!($t), "::MAX) / Saturating(1));")]
340 #[doc = concat!("assert_eq!(Saturating(", stringify!($t), "::MIN), Saturating(", stringify!($t), "::MIN) / Saturating(1));")]
341 #[doc = concat!("let _ = Saturating(0", stringify!($t), ") / Saturating(0);")]
347 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
349 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
350 const impl Div for Saturating<$t> {
351 type Output = Saturating<$t>;
352
353 #[inline]
354 fn div(self, other: Saturating<$t>) -> Saturating<$t> {
355 Saturating(self.0.saturating_div(other.0))
356 }
357 }
358 forward_ref_binop! { impl Div, div for Saturating<$t>, Saturating<$t>,
359 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
360 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
361
362 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
363 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
364 const impl DivAssign for Saturating<$t> {
365 #[inline]
366 fn div_assign(&mut self, other: Saturating<$t>) {
367 *self = *self / other;
368 }
369 }
370 forward_ref_op_assign! { impl DivAssign, div_assign for Saturating<$t>, Saturating<$t>,
371 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
372 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
373
374 #[stable(feature = "saturating_int_assign_impl", since = "1.74.0")]
375 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
376 const impl DivAssign<$t> for Saturating<$t> {
377 #[inline]
378 fn div_assign(&mut self, other: $t) {
379 *self = *self / Saturating(other);
380 }
381 }
382 forward_ref_op_assign! { impl DivAssign, div_assign for Saturating<$t>, $t,
383 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
384 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
385
386 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
387 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
388 const impl Rem for Saturating<$t> {
389 type Output = Saturating<$t>;
390
391 #[inline]
392 fn rem(self, other: Saturating<$t>) -> Saturating<$t> {
393 Saturating(self.0.rem(other.0))
394 }
395 }
396 forward_ref_binop! { impl Rem, rem for Saturating<$t>, Saturating<$t>,
397 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
398 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
399
400 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
401 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
402 const impl RemAssign for Saturating<$t> {
403 #[inline]
404 fn rem_assign(&mut self, other: Saturating<$t>) {
405 *self = *self % other;
406 }
407 }
408 forward_ref_op_assign! { impl RemAssign, rem_assign for Saturating<$t>, Saturating<$t>,
409 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
410 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
411
412 #[stable(feature = "saturating_int_assign_impl", since = "1.74.0")]
413 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
414 const impl RemAssign<$t> for Saturating<$t> {
415 #[inline]
416 fn rem_assign(&mut self, other: $t) {
417 *self = *self % Saturating(other);
418 }
419 }
420 forward_ref_op_assign! { impl RemAssign, rem_assign for Saturating<$t>, $t,
421 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
422 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
423
424 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
425 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
426 const impl Not for Saturating<$t> {
427 type Output = Saturating<$t>;
428
429 #[inline]
430 fn not(self) -> Saturating<$t> {
431 Saturating(!self.0)
432 }
433 }
434 forward_ref_unop! { impl Not, not for Saturating<$t>,
435 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
436 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
437
438 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
439 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
440 const impl BitXor for Saturating<$t> {
441 type Output = Saturating<$t>;
442
443 #[inline]
444 fn bitxor(self, other: Saturating<$t>) -> Saturating<$t> {
445 Saturating(self.0 ^ other.0)
446 }
447 }
448 forward_ref_binop! { impl BitXor, bitxor for Saturating<$t>, Saturating<$t>,
449 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
450 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
451
452 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
453 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
454 const impl BitXorAssign for Saturating<$t> {
455 #[inline]
456 fn bitxor_assign(&mut self, other: Saturating<$t>) {
457 *self = *self ^ other;
458 }
459 }
460 forward_ref_op_assign! { impl BitXorAssign, bitxor_assign for Saturating<$t>, Saturating<$t>,
461 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
462 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
463
464 #[stable(feature = "saturating_int_assign_impl", since = "1.74.0")]
465 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
466 const impl BitXorAssign<$t> for Saturating<$t> {
467 #[inline]
468 fn bitxor_assign(&mut self, other: $t) {
469 *self = *self ^ Saturating(other);
470 }
471 }
472 forward_ref_op_assign! { impl BitXorAssign, bitxor_assign for Saturating<$t>, $t,
473 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
474 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
475
476 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
477 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
478 const impl BitOr for Saturating<$t> {
479 type Output = Saturating<$t>;
480
481 #[inline]
482 fn bitor(self, other: Saturating<$t>) -> Saturating<$t> {
483 Saturating(self.0 | other.0)
484 }
485 }
486 forward_ref_binop! { impl BitOr, bitor for Saturating<$t>, Saturating<$t>,
487 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
488 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
489
490 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
491 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
492 const impl BitOrAssign for Saturating<$t> {
493 #[inline]
494 fn bitor_assign(&mut self, other: Saturating<$t>) {
495 *self = *self | other;
496 }
497 }
498 forward_ref_op_assign! { impl BitOrAssign, bitor_assign for Saturating<$t>, Saturating<$t>,
499 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
500 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
501
502 #[stable(feature = "saturating_int_assign_impl", since = "1.74.0")]
503 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
504 const impl BitOrAssign<$t> for Saturating<$t> {
505 #[inline]
506 fn bitor_assign(&mut self, other: $t) {
507 *self = *self | Saturating(other);
508 }
509 }
510 forward_ref_op_assign! { impl BitOrAssign, bitor_assign for Saturating<$t>, $t,
511 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
512 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
513
514 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
515 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
516 const impl BitAnd for Saturating<$t> {
517 type Output = Saturating<$t>;
518
519 #[inline]
520 fn bitand(self, other: Saturating<$t>) -> Saturating<$t> {
521 Saturating(self.0 & other.0)
522 }
523 }
524 forward_ref_binop! { impl BitAnd, bitand for Saturating<$t>, Saturating<$t>,
525 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
526 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
527
528 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
529 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
530 const impl BitAndAssign for Saturating<$t> {
531 #[inline]
532 fn bitand_assign(&mut self, other: Saturating<$t>) {
533 *self = *self & other;
534 }
535 }
536 forward_ref_op_assign! { impl BitAndAssign, bitand_assign for Saturating<$t>, Saturating<$t>,
537 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
538 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
539
540 #[stable(feature = "saturating_int_assign_impl", since = "1.74.0")]
541 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
542 const impl BitAndAssign<$t> for Saturating<$t> {
543 #[inline]
544 fn bitand_assign(&mut self, other: $t) {
545 *self = *self & Saturating(other);
546 }
547 }
548 forward_ref_op_assign! { impl BitAndAssign, bitand_assign for Saturating<$t>, $t,
549 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
550 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
551
552 )*)
553}
554
555saturating_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
556
557macro_rules! saturating_int_impl {
558 ($($t:ty)*) => ($(
559 impl Saturating<$t> {
560 #[doc = concat!("assert_eq!(<Saturating<", stringify!($t), ">>::MIN, Saturating(", stringify!($t), "::MIN));")]
568 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
570 pub const MIN: Self = Self(<$t>::MIN);
571
572 #[doc = concat!("assert_eq!(<Saturating<", stringify!($t), ">>::MAX, Saturating(", stringify!($t), "::MAX));")]
580 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
582 pub const MAX: Self = Self(<$t>::MAX);
583
584 #[doc = concat!("assert_eq!(<Saturating<", stringify!($t), ">>::BITS, ", stringify!($t), "::BITS);")]
592 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
594 pub const BITS: u32 = <$t>::BITS;
595
596 #[doc = concat!("let n = Saturating(0b01001100", stringify!($t), ");")]
604 #[inline]
608 #[doc(alias = "popcount")]
609 #[doc(alias = "popcnt")]
610 #[must_use = "this returns the result of the operation, \
611 without modifying the original"]
612 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
613 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
614 pub const fn count_ones(self) -> u32 {
615 self.0.count_ones()
616 }
617
618 #[doc = concat!("assert_eq!(Saturating(!0", stringify!($t), ").count_zeros(), 0);")]
626 #[inline]
628 #[must_use = "this returns the result of the operation, \
629 without modifying the original"]
630 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
631 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
632 pub const fn count_zeros(self) -> u32 {
633 self.0.count_zeros()
634 }
635
636 #[doc = concat!("let n = Saturating(0b0101000", stringify!($t), ");")]
644 #[inline]
648 #[must_use = "this returns the result of the operation, \
649 without modifying the original"]
650 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
651 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
652 pub const fn trailing_zeros(self) -> u32 {
653 self.0.trailing_zeros()
654 }
655
656 #[inline]
674 #[must_use = "this returns the result of the operation, \
675 without modifying the original"]
676 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
677 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
678 pub const fn rotate_left(self, n: u32) -> Self {
679 Saturating(self.0.rotate_left(n))
680 }
681
682 #[inline]
700 #[must_use = "this returns the result of the operation, \
701 without modifying the original"]
702 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
703 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
704 pub const fn rotate_right(self, n: u32) -> Self {
705 Saturating(self.0.rotate_right(n))
706 }
707
708 #[inline]
724 #[must_use = "this returns the result of the operation, \
725 without modifying the original"]
726 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
727 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
728 pub const fn swap_bytes(self) -> Self {
729 Saturating(self.0.swap_bytes())
730 }
731
732 #[inline]
751 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
752 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
753 #[must_use = "this returns the result of the operation, \
754 without modifying the original"]
755 pub const fn reverse_bits(self) -> Self {
756 Saturating(self.0.reverse_bits())
757 }
758
759 #[doc = concat!("let n = Saturating(0x1A", stringify!($t), ");")]
770 #[doc = concat!(" assert_eq!(<Saturating<", stringify!($t), ">>::from_be(n), n)")]
773 #[doc = concat!(" assert_eq!(<Saturating<", stringify!($t), ">>::from_be(n), n.swap_bytes())")]
775 #[inline]
778 #[must_use]
779 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
780 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
781 pub const fn from_be(x: Self) -> Self {
782 Saturating(<$t>::from_be(x.0))
783 }
784
785 #[doc = concat!("let n = Saturating(0x1A", stringify!($t), ");")]
796 #[doc = concat!(" assert_eq!(<Saturating<", stringify!($t), ">>::from_le(n), n)")]
799 #[doc = concat!(" assert_eq!(<Saturating<", stringify!($t), ">>::from_le(n), n.swap_bytes())")]
801 #[inline]
804 #[must_use]
805 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
806 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
807 pub const fn from_le(x: Self) -> Self {
808 Saturating(<$t>::from_le(x.0))
809 }
810
811 #[doc = concat!("let n = Saturating(0x1A", stringify!($t), ");")]
822 #[inline]
830 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
831 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
832 #[must_use = "this returns the result of the operation, \
833 without modifying the original"]
834 pub const fn to_be(self) -> Self {
835 Saturating(self.0.to_be())
836 }
837
838 #[doc = concat!("let n = Saturating(0x1A", stringify!($t), ");")]
849 #[inline]
857 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
858 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
859 #[must_use = "this returns the result of the operation, \
860 without modifying the original"]
861 pub const fn to_le(self) -> Self {
862 Saturating(self.0.to_le())
863 }
864
865 #[doc = concat!("assert_eq!(Saturating(3", stringify!($t), ").pow(4), Saturating(81));")]
873 #[inline]
884 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
885 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
886 #[must_use = "this returns the result of the operation, \
887 without modifying the original"]
888 pub const fn pow(self, exp: u32) -> Self {
889 Saturating(self.0.saturating_pow(exp))
890 }
891 }
892 )*)
893}
894
895saturating_int_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
896
897macro_rules! saturating_int_impl_signed {
898 ($($t:ty)*) => ($(
899 impl Saturating<$t> {
900 #[doc = concat!("let n = Saturating(", stringify!($t), "::MAX >> 2);")]
908 #[inline]
912 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
913 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
914 #[must_use = "this returns the result of the operation, \
915 without modifying the original"]
916 pub const fn leading_zeros(self) -> u32 {
917 self.0.leading_zeros()
918 }
919
920 #[doc = concat!("assert_eq!(Saturating(100", stringify!($t), ").abs(), Saturating(100));")]
929 #[doc = concat!("assert_eq!(Saturating(-100", stringify!($t), ").abs(), Saturating(100));")]
930 #[doc = concat!("assert_eq!(Saturating(", stringify!($t), "::MIN).abs(), Saturating((", stringify!($t), "::MIN + 1).abs()));")]
931 #[doc = concat!("assert_eq!(Saturating(", stringify!($t), "::MIN).abs(), Saturating(", stringify!($t), "::MIN.saturating_abs()));")]
932 #[doc = concat!("assert_eq!(Saturating(", stringify!($t), "::MIN).abs(), Saturating(", stringify!($t), "::MAX));")]
933 #[inline]
935 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
936 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
937 #[must_use = "this returns the result of the operation, \
938 without modifying the original"]
939 pub const fn abs(self) -> Saturating<$t> {
940 Saturating(self.0.saturating_abs())
941 }
942
943 #[doc = concat!("assert_eq!(Saturating(10", stringify!($t), ").signum(), Saturating(1));")]
955 #[doc = concat!("assert_eq!(Saturating(0", stringify!($t), ").signum(), Saturating(0));")]
956 #[doc = concat!("assert_eq!(Saturating(-10", stringify!($t), ").signum(), Saturating(-1));")]
957 #[inline]
959 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
960 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
961 #[must_use = "this returns the result of the operation, \
962 without modifying the original"]
963 pub const fn signum(self) -> Saturating<$t> {
964 Saturating(self.0.signum())
965 }
966
967 #[doc = concat!("assert!(Saturating(10", stringify!($t), ").is_positive());")]
976 #[doc = concat!("assert!(!Saturating(-10", stringify!($t), ").is_positive());")]
977 #[must_use]
979 #[inline]
980 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
981 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
982 pub const fn is_positive(self) -> bool {
983 self.0.is_positive()
984 }
985
986 #[doc = concat!("assert!(Saturating(-10", stringify!($t), ").is_negative());")]
995 #[doc = concat!("assert!(!Saturating(10", stringify!($t), ").is_negative());")]
996 #[must_use]
998 #[inline]
999 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
1000 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
1001 pub const fn is_negative(self) -> bool {
1002 self.0.is_negative()
1003 }
1004 }
1005
1006 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
1007 #[rustc_const_unstable(feature = "const_ops", issue = "143802")]
1008 const impl Neg for Saturating<$t> {
1009 type Output = Self;
1010 #[inline]
1011 fn neg(self) -> Self {
1012 Saturating(self.0.saturating_neg())
1013 }
1014 }
1015 forward_ref_unop! { impl Neg, neg for Saturating<$t>,
1016 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
1017 #[rustc_const_unstable(feature = "const_ops", issue = "143802")] }
1018 )*)
1019}
1020
1021saturating_int_impl_signed! { isize i8 i16 i32 i64 i128 }
1022
1023macro_rules! saturating_int_impl_unsigned {
1024 ($($t:ty)*) => ($(
1025 impl Saturating<$t> {
1026 #[doc = concat!("let n = Saturating(", stringify!($t), "::MAX >> 2);")]
1034 #[inline]
1038 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
1039 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
1040 #[must_use = "this returns the result of the operation, \
1041 without modifying the original"]
1042 pub const fn leading_zeros(self) -> u32 {
1043 self.0.leading_zeros()
1044 }
1045
1046 #[doc = concat!("assert!(Saturating(16", stringify!($t), ").is_power_of_two());")]
1054 #[doc = concat!("assert!(!Saturating(10", stringify!($t), ").is_power_of_two());")]
1055 #[must_use]
1057 #[inline]
1058 #[rustc_const_stable(feature = "saturating_int_impl", since = "1.74.0")]
1059 #[stable(feature = "saturating_int_impl", since = "1.74.0")]
1060 pub const fn is_power_of_two(self) -> bool {
1061 self.0.is_power_of_two()
1062 }
1063
1064 }
1065 )*)
1066}
1067
1068saturating_int_impl_unsigned! { usize u8 u16 u32 u64 u128 }
1069
1070