1use 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 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 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
92impl_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
103impl_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);