base_traits/traits/
zero.rs1pub 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