1use std::mem::size_of;
6#[cfg(has_i128)]
7use std::{i128, u128};
8use std::{i16, i32, i64, i8, isize, u16, u32, u64, u8, usize};
9
10mod checked;
11pub use self::checked::*;
12
13use std::str::FromStr;
14
15pub trait Int: Sized + Copy + FromStr + CheckedMul {
17 fn from_u64(n: u64) -> Option<Self>;
19}
20
21macro_rules! impl_int {
22 ($dst:ident) => {
23 impl Int for $dst {
24 fn from_u64(n: u64) -> Option<$dst> {
25 let max = $dst::MAX as u64;
26 if size_of::<u64>() < size_of::<$dst>() || n <= max {
27 Some(n as $dst)
28 } else {
29 None
30 }
31 }
32 }
33 };
34}
35
36impl_int!(i8);
37impl_int!(u8);
38
39impl_int!(i16);
40impl_int!(u16);
41
42impl_int!(i32);
43impl_int!(u32);
44
45impl_int!(i64);
46impl_int!(u64);
47
48impl_int!(isize);
49impl_int!(usize);
50
51#[cfg(has_i128)]
52impl_int!(i128);
53#[cfg(has_i128)]
54impl_int!(u128);
55
56#[cfg(test)]
57mod tests;