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}