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);