humanize_rs/num/
mod.rs

1//! This module provides some numeric traits used in parsing.
2//!
3//!
4
5use 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
15/// Represents the integer trait
16pub trait Int: Sized + Copy + FromStr + CheckedMul {
17    /// Returns a value from given u64 num
18    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;