1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#[repr(u8)]
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd, enumn::N)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[allow(non_camel_case_types)]
pub enum SpecId {
FRONTIER = 0, FRONTIER_THAWING = 1, HOMESTEAD = 2, DAO_FORK = 3, TANGERINE = 4, SPURIOUS_DRAGON = 5, BYZANTIUM = 6, CONSTANTINOPLE = 7, PETERSBURG = 8, ISTANBUL = 9, MUIR_GLACIER = 10, BERLIN = 11, LONDON = 12, ARROW_GLACIER = 13, GRAY_GLACIER = 14, MERGE = 15, MERGE_EOF = 16, LATEST = 17,
}
impl SpecId {
pub fn try_from_u8(spec_id: u8) -> Option<Self> {
Self::n(spec_id)
}
}
pub use SpecId::*;
impl From<&str> for SpecId {
fn from(name: &str) -> Self {
match name {
"Frontier" => SpecId::FRONTIER,
"Homestead" => SpecId::HOMESTEAD,
"Tangerine" => SpecId::TANGERINE,
"Spurious" => SpecId::SPURIOUS_DRAGON,
"Byzantium" => SpecId::BYZANTIUM,
"Constantinople" => SpecId::CONSTANTINOPLE,
"Petersburg" => SpecId::PETERSBURG,
"Istanbul" => SpecId::ISTANBUL,
"MuirGlacier" => SpecId::MUIR_GLACIER,
"Berlin" => SpecId::BERLIN,
"London" => SpecId::LONDON,
"Merge" => SpecId::MERGE,
"MergeEOF" => SpecId::MERGE_EOF,
_ => SpecId::LATEST,
}
}
}
impl SpecId {
#[inline]
pub const fn enabled(our: SpecId, other: SpecId) -> bool {
our as u8 >= other as u8
}
}
pub trait Spec: Sized {
#[inline(always)]
fn enabled(spec_id: SpecId) -> bool {
Self::SPEC_ID as u8 >= spec_id as u8
}
const SPEC_ID: SpecId;
}
macro_rules! spec {
($spec_id:tt,$spec_name:tt) => {
pub struct $spec_name;
impl Spec for $spec_name {
const SPEC_ID: SpecId = $spec_id;
}
};
}
spec!(FRONTIER, FrontierSpec);
spec!(HOMESTEAD, HomesteadSpec);
spec!(TANGERINE, TangerineSpec);
spec!(SPURIOUS_DRAGON, SpuriousDragonSpec);
spec!(BYZANTIUM, ByzantiumSpec);
spec!(PETERSBURG, PetersburgSpec);
spec!(ISTANBUL, IstanbulSpec);
spec!(BERLIN, BerlinSpec);
spec!(LONDON, LondonSpec);
spec!(MERGE, MergeSpec);
spec!(LATEST, LatestSpec);