Skip to main content

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.
7
8use crate::{ConvExact, RangeError, impl_via_identity};
9use core::num::NonZero;
10
11macro_rules! impl_identity {
12    ($($x:tt),*) => {
13        $(
14            impl_via_identity!(NonZero<$x>);
15        )*
16    };
17}
18
19impl_identity!(u8, u16, u32, u64, u128, usize);
20impl_identity!(i8, i16, i32, i64, i128, isize);
21
22macro_rules! impl_nonzero {
23    ($x:ty : $y:ty) => {
24        impl ConvExact<NonZero<$x>> for NonZero<$y> {
25            type Error = RangeError;
26
27            #[inline]
28            fn try_conv_exact(n: NonZero<$x>) -> Result<NonZero<$y>, Self::Error> {
29                let m: $y = <$y>::try_conv_exact(n.get())?;
30                // An error here should be impossible, but handling one is basically free:
31                NonZero::new(m).ok_or(RangeError)
32            }
33
34            // We do not implement conv since its main purpose is to allow
35            // bypassing checks, but since this would allow wrapping-to-zero
36            // we cannot omit all checks.
37        }
38    };
39    ($x:ty : $y:ty, $($yy:ty),+) => {
40        impl_nonzero!($x: $y);
41        impl_nonzero!($x: $($yy),+);
42    };
43}
44
45// From impl_basic:
46// NOTE: these impls should be Infallible but this would require unsafe code
47impl_nonzero!(i8: i16, i32, i64, i128, isize);
48impl_nonzero!(i16: i32, i64, i128, isize);
49impl_nonzero!(i32: i64, i128);
50impl_nonzero!(i64: i128);
51impl_nonzero!(u8: i16, i32, i64, i128, isize);
52impl_nonzero!(u8: u16, u32, u64, u128, usize);
53impl_nonzero!(u16: i32, i64, i128, u32, u64, u128, usize);
54impl_nonzero!(u32: i64, i128, u64, u128);
55impl_nonzero!(u64: i128, u128);
56
57// From impl_int:
58impl_nonzero!(i8: u8, u16, u32, u64, u128);
59impl_nonzero!(i16: u16, u32, u64, u128);
60impl_nonzero!(i32: u32, u64, u128);
61impl_nonzero!(i64: u64, u128);
62impl_nonzero!(i128: u128);
63
64impl_nonzero!(u8: i8);
65impl_nonzero!(u16: i8, i16, u8);
66impl_nonzero!(u32: i8, i16, i32, u8, u16);
67impl_nonzero!(u64: i8, i16, i32, i64, u8, u16, u32);
68impl_nonzero!(u128: i8, i16, i32, i64, i128);
69impl_nonzero!(u128: u8, u16, u32, u64);
70
71impl_nonzero!(i16: i8, u8);
72impl_nonzero!(i32: i8, i16, u8, u16);
73impl_nonzero!(i64: i8, i16, i32, u8, u16, u32);
74impl_nonzero!(i128: i8, i16, i32, i64, u8, u16, u32, u64);
75
76impl_nonzero!(i8: usize);
77impl_nonzero!(i16: usize);
78impl_nonzero!(i32: isize, usize);
79impl_nonzero!(i64: isize, usize);
80impl_nonzero!(i128: isize, usize);
81impl_nonzero!(u16: isize);
82impl_nonzero!(u32: isize, usize);
83impl_nonzero!(u64: isize, usize);
84impl_nonzero!(u128: isize, usize);
85impl_nonzero!(isize: i8, i16, i32, i64, i128);
86impl_nonzero!(usize: i8, i16, i32, i64, i128, isize);
87impl_nonzero!(isize: u8, u16, u32, u64, u128, usize);
88impl_nonzero!(usize: u8, u16, u32, u64, u128);