base_traits/traits/
zero.rs

1// src/traits/zero.rs : `Zero`
2
3/// Trait defining class method `zero() : T` that creates an instance of
4/// the implementing type that is conceptually (or actually) zero.
5///
6/// # Additional Implementations on Foreign Types
7///
8/// ## Built-in Types
9///
10/// If the feature `"implement-Zero-for-built_ins"`
11/// is defined (as it is by `"default"`), then this is also implemented
12/// for the following type(s):
13/// - [`i8`];
14/// - [`i16`];
15/// - [`i32`];
16/// - [`i64`];
17/// - [`i128`];
18/// - [`u8`];
19/// - [`u16`];
20/// - [`u32`];
21/// - [`u64`];
22/// - [`u128`];
23/// - [`isize`];
24/// - [`usize`];
25/// - [`f32`];
26/// - [`f64`];
27/// - [`char`];
28pub trait Zero {
29    fn zero() -> Self;
30}
31
32
33#[cfg(feature = "implement-Zero-for-built_ins")]
34mod impl_for_built_ins {
35    #![allow(non_snake_case)]
36
37    macro_rules! implement_IsZero_ {
38        ($type:tt, $zero_value:expr) => {
39            impl super::Zero for $type {
40                #[inline]
41                fn zero() -> Self {
42                    $zero_value
43                }
44            }
45        };
46    }
47
48    implement_IsZero_!(i8, 0);
49    implement_IsZero_!(i16, 0);
50    implement_IsZero_!(i32, 0);
51    implement_IsZero_!(i64, 0);
52    implement_IsZero_!(i128, 0);
53
54    implement_IsZero_!(u8, 0);
55    implement_IsZero_!(u16, 0);
56    implement_IsZero_!(u32, 0);
57    implement_IsZero_!(u64, 0);
58    implement_IsZero_!(u128, 0);
59
60    implement_IsZero_!(isize, 0);
61    implement_IsZero_!(usize, 0);
62
63    implement_IsZero_!(f32, 0.0);
64    implement_IsZero_!(f64, 0.0);
65
66    implement_IsZero_!(char, '\0');
67}
68
69
70#[cfg(test)]
71mod tests {
72    #![allow(non_snake_case)]
73
74    use super::Zero;
75
76
77    mod TEST_CUSTOM_TYPE {
78        #![allow(non_snake_case)]
79
80        use super::*;
81
82
83        #[derive(Debug)]
84        struct CustomType {
85            pub value : i32,
86        }
87
88        impl Zero for CustomType {
89            fn zero() -> Self {
90                Self {
91                    value : -1,
92                }
93            }
94        }
95
96
97        #[test]
98        fn TEST_Zero() {
99            let ct = CustomType::zero();
100
101            assert_eq!(-1, ct.value);
102        }
103    }
104
105
106    #[cfg(feature = "implement-Zero-for-built_ins")]
107    mod TEST_BUILTIN_TYPES {
108        #![allow(non_snake_case)]
109        use super::*;
110
111
112        #[test]
113        fn TEST_INTEGERS() {
114            assert_eq!(0, i8::zero());
115            assert_eq!(0, i16::zero());
116            assert_eq!(0, i32::zero());
117            assert_eq!(0, i64::zero());
118            assert_eq!(0, i128::zero());
119
120            assert_eq!(0, u8::zero());
121            assert_eq!(0, u16::zero());
122            assert_eq!(0, u32::zero());
123            assert_eq!(0, u64::zero());
124            assert_eq!(0, u128::zero());
125
126            assert_eq!(0, isize::zero());
127            assert_eq!(0, usize::zero());
128
129            assert_eq!(0.0f32, f32::zero());
130            assert_eq!(0.0f64, f64::zero());
131
132            assert_eq!('\0', char::zero());
133        }
134    }
135}
136