easy_cast/
impl_num.rs

1// Licensed under the Apache License, Version 2.0 (the "License");
2// you may not use this file except in compliance with the License.
3// You may obtain a copy of the License in the LICENSE-APACHE file or at:
4//     https://www.apache.org/licenses/LICENSE-2.0
5
6//! `core::num` impls for Conv.
7
8use super::*;
9use core::num::{NonZero, Saturating, Wrapping};
10
11impl<F, T: Conv<F>> Conv<Saturating<F>> for Saturating<T> {
12    #[inline]
13    fn try_conv(n: Saturating<F>) -> Result<Saturating<T>> {
14        n.0.try_cast().map(Saturating)
15    }
16
17    #[inline]
18    fn conv(n: Saturating<F>) -> Saturating<T> {
19        Saturating(n.0.cast())
20    }
21}
22
23impl<F, T: Conv<F>> Conv<Wrapping<F>> for Wrapping<T> {
24    #[inline]
25    fn try_conv(n: Wrapping<F>) -> Result<Wrapping<T>> {
26        n.0.try_cast().map(Wrapping)
27    }
28
29    #[inline]
30    fn conv(n: Wrapping<F>) -> Wrapping<T> {
31        Wrapping(n.0.cast())
32    }
33}
34
35macro_rules! impl_via_trivial {
36    ($x:ty) => {
37        impl Conv<NonZero<$x>> for NonZero<$x> {
38            #[inline]
39            fn conv(x: NonZero<$x>) -> Self {
40                x
41            }
42            #[inline]
43            fn try_conv(x: NonZero<$x>) -> Result<Self> {
44                Ok(x)
45            }
46        }
47    };
48    ($x:ty $(, $xx:tt)* $(,)?) => {
49        impl_via_trivial!($x);
50        impl_via_trivial!($($xx),*);
51    };
52}
53
54#[rustfmt::skip]
55impl_via_trivial!(
56    u8, u16, u32, u64, u128, usize,
57    i8, i16, i32, i64, i128, isize,
58);
59
60macro_rules! impl_nonzero {
61    ($x:ty: $y:ty) => {
62        impl Conv<NonZero<$x>> for NonZero<$y> {
63            #[inline]
64            fn try_conv(n: NonZero<$x>) -> Result<NonZero<$y>> {
65                let m: $y = n.get().try_cast()?;
66                Ok(if cfg!(any(debug_assertions, feature = "assert_nonzero")) {
67                    NonZero::new(m).expect("should be non-zero")
68                } else {
69                    // SAFETY: since cast() does not change the numeric value, m cannot be zero
70                    unsafe { NonZero::new_unchecked(m) }
71                })
72            }
73
74            #[inline]
75            fn conv(n: NonZero<$x>) -> NonZero<$y> {
76                let m: $y = n.get().cast();
77                if cfg!(any(debug_assertions, feature = "assert_nonzero")) {
78                    NonZero::new(m).expect("should be non-zero")
79                } else {
80                    // SAFETY: since cast() does not change the numeric value, m cannot be zero
81                    unsafe { NonZero::new_unchecked(m) }
82                }
83            }
84        }
85    };
86    ($x:ty: $y:ty, $($yy:ty),+) => {
87        impl_nonzero!($x: $y);
88        impl_nonzero!($x: $($yy),+);
89    };
90}
91
92// From impl_basic:
93impl_nonzero!(i8: i16, i32, i64, i128);
94impl_nonzero!(i16: i32, i64, i128);
95impl_nonzero!(i32: i64, i128);
96impl_nonzero!(i64: i128);
97impl_nonzero!(u8: i16, i32, i64, i128);
98impl_nonzero!(u8: u16, u32, u64, u128);
99impl_nonzero!(u16: i32, i64, i128, u32, u64, u128);
100impl_nonzero!(u32: i64, i128, u64, u128);
101impl_nonzero!(u64: i128, u128);
102
103// From impl_int:
104impl_nonzero!(i8: u8, u16, u32, u64, u128);
105impl_nonzero!(i16: u16, u32, u64, u128);
106impl_nonzero!(i32: u32, u64, u128);
107impl_nonzero!(i64: u64, u128);
108impl_nonzero!(i128: u128);
109
110impl_nonzero!(u8: i8);
111impl_nonzero!(u16: i8, i16, u8);
112impl_nonzero!(u32: i8, i16, i32, u8, u16);
113impl_nonzero!(u64: i8, i16, i32, i64, u8, u16, u32);
114impl_nonzero!(u128: i8, i16, i32, i64, i128);
115impl_nonzero!(u128: u8, u16, u32, u64);
116
117impl_nonzero!(i16: i8, u8);
118impl_nonzero!(i32: i8, i16, u8, u16);
119impl_nonzero!(i64: i8, i16, i32, u8, u16, u32);
120impl_nonzero!(i128: i8, i16, i32, i64, u8, u16, u32, u64);
121
122impl_nonzero!(i8: isize, usize);
123impl_nonzero!(i16: isize, usize);
124impl_nonzero!(i32: isize, usize);
125impl_nonzero!(i64: isize, usize);
126impl_nonzero!(i128: isize, usize);
127impl_nonzero!(u8: isize, usize);
128impl_nonzero!(u16: isize, usize);
129impl_nonzero!(u32: isize, usize);
130impl_nonzero!(u64: isize, usize);
131impl_nonzero!(u128: isize, usize);
132impl_nonzero!(isize: i8, i16, i32, i64, i128);
133impl_nonzero!(usize: i8, i16, i32, i64, i128, isize);
134impl_nonzero!(isize: u8, u16, u32, u64, u128, usize);
135impl_nonzero!(usize: u8, u16, u32, u64, u128);