primitives/
zero.rs

1use cfx_types::{U256, U512};
2
3pub trait Zero: PartialEq + Sized {
4    fn zero() -> Self;
5    fn is_zero(&self) -> bool { self == &Self::zero() }
6}
7
8macro_rules! impl_zero_by_lit {
9    (lit: $lit: literal, $ty: ident) => {
10        impl_zero_by_lit!(@inner, $ty, $lit);
11    };
12    (lit: $lit: literal, $ty: ident, $($rest: ident),*) => {
13        impl_zero_by_lit!(@inner, $ty, $lit);
14        impl_zero_by_lit!(lit: $lit, $($rest),*);
15    };
16    (@inner, $name: ident, $lit: literal) => {
17        impl Zero for $name {
18            fn zero() -> Self {
19                $lit
20            }
21
22            fn is_zero(&self) -> bool {
23                *self == $lit
24            }
25        }
26    };
27}
28
29impl_zero_by_lit!(
30    lit: 0,
31    usize,
32    u8,
33    u16,
34    u32,
35    u64,
36    u128,
37    isize,
38    i8,
39    i16,
40    i32,
41    i64,
42    i128
43);
44impl_zero_by_lit!(lit: 0.0, f32, f64);
45
46impl Zero for U256 {
47    fn zero() -> Self { Self::zero() }
48
49    fn is_zero(&self) -> bool { self.is_zero() }
50}
51
52impl Zero for U512 {
53    fn zero() -> Self { Self::zero() }
54
55    fn is_zero(&self) -> bool { self.is_zero() }
56}