miden_objects/block/
block_number.rs1use core::fmt;
2use core::ops::Add;
3
4use crate::Felt;
5use crate::utils::serde::{
6 ByteReader,
7 ByteWriter,
8 Deserializable,
9 DeserializationError,
10 Serializable,
11};
12
13#[derive(Debug, Default, Eq, PartialEq, Copy, Clone, PartialOrd, Ord, Hash)]
20pub struct BlockNumber(u32);
21
22impl BlockNumber {
23 pub const EPOCH_LENGTH_EXPONENT: u8 = 16;
29
30 pub const GENESIS: Self = Self(0);
32
33 pub fn parent(self) -> Option<BlockNumber> {
35 self.checked_sub(1)
36 }
37
38 pub fn child(self) -> BlockNumber {
40 self + 1
41 }
42
43 pub const fn from_epoch(epoch: u16) -> BlockNumber {
45 BlockNumber((epoch as u32) << BlockNumber::EPOCH_LENGTH_EXPONENT)
46 }
47
48 pub const fn block_epoch(&self) -> u16 {
50 (self.0 >> BlockNumber::EPOCH_LENGTH_EXPONENT) as u16
51 }
52
53 pub fn as_u32(&self) -> u32 {
55 self.0
56 }
57
58 pub fn as_u64(&self) -> u64 {
60 self.0 as u64
61 }
62
63 pub fn as_usize(&self) -> usize {
65 self.0 as usize
66 }
67
68 pub fn checked_sub(&self, rhs: u32) -> Option<Self> {
70 self.0.checked_sub(rhs).map(Self)
71 }
72}
73
74impl Add<u32> for BlockNumber {
75 type Output = Self;
76
77 fn add(self, other: u32) -> Self::Output {
78 BlockNumber(self.0 + other)
79 }
80}
81
82impl Serializable for BlockNumber {
83 fn write_into<W: ByteWriter>(&self, target: &mut W) {
84 target.write_u32(self.0);
85 }
86
87 fn get_size_hint(&self) -> usize {
88 core::mem::size_of::<u32>()
89 }
90}
91
92impl Deserializable for BlockNumber {
93 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
94 source.read::<u32>().map(BlockNumber::from)
95 }
96}
97
98impl From<BlockNumber> for Felt {
99 fn from(value: BlockNumber) -> Self {
100 Felt::from(value.as_u32())
101 }
102}
103
104impl From<u32> for BlockNumber {
105 fn from(value: u32) -> Self {
106 BlockNumber(value)
107 }
108}
109
110impl fmt::Display for BlockNumber {
111 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
112 write!(f, "{}", self.0)
113 }
114}