range_traits/
bounded.rs

1pub trait MaybeBounded: Sized {
2	fn min() -> Option<Self>;
3	fn max() -> Option<Self>;
4}
5
6pub trait Bounded {
7	fn min() -> Self;
8	fn max() -> Self;
9}
10
11impl<T: Bounded> MaybeBounded for T {
12	fn min() -> Option<Self> {
13		Some(Self::min())
14	}
15
16	fn max() -> Option<Self> {
17		Some(Self::max())
18	}
19}
20
21impl Bounded for char {
22	fn min() -> Self {
23		'\0'
24	}
25
26	fn max() -> Self {
27		char::MAX
28	}
29}
30
31macro_rules! impl_int {
32	($($ty:ident),*) => {
33		$(
34			impl Bounded for $ty {
35				fn min() -> Self {
36					$ty::MIN
37				}
38
39				fn max() -> Self {
40					$ty::MAX
41				}
42			}
43		)*
44	};
45}
46
47impl_int!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize);
48
49macro_rules! impl_float {
50	($($ty:ident),*) => {
51		$(
52			impl Bounded for $ty {
53				fn min() -> Self {
54					$ty::NEG_INFINITY
55				}
56
57				fn max() -> Self {
58					$ty::INFINITY
59				}
60			}
61		)*
62	};
63}
64
65impl_float!(f32, f64);