1use jam_types::Segment;
2
3pub const PAGE_SIZE: u64 = 4096;
5
6#[derive(Clone)]
13pub struct PageSegment(Segment);
14
15impl PageSegment {
16 pub fn new(segment: Segment) -> Self {
18 Self(segment)
19 }
20
21 pub fn zero(address: u64) -> Self {
23 let mut segment = Segment::new(0_u8);
24 segment.as_mut()[PAGE_SIZE as usize..].copy_from_slice(&address.to_le_bytes()[..]);
25 Self(segment)
26 }
27
28 pub fn null() -> Self {
30 Self(Segment::new(0_u8))
31 }
32
33 pub fn page(&self) -> &[u8] {
35 &self.0.as_ref()[..PAGE_SIZE as usize]
36 }
37
38 pub fn page_mut(&mut self) -> &mut [u8] {
40 &mut self.0.as_mut()[..PAGE_SIZE as usize]
41 }
42
43 pub fn address(&self) -> u64 {
45 page_address(self.0.as_ref())
46 }
47
48 pub fn into_inner(self) -> Segment {
49 self.0
50 }
51}
52
53impl AsRef<[u8]> for PageSegment {
54 fn as_ref(&self) -> &[u8] {
55 self.0.as_ref()
56 }
57}
58
59impl AsMut<[u8]> for PageSegment {
60 fn as_mut(&mut self) -> &mut [u8] {
61 self.0.as_mut()
62 }
63}
64
65impl From<Segment> for PageSegment {
66 fn from(other: Segment) -> Self {
67 Self::new(other)
68 }
69}
70
71impl From<PageSegment> for Segment {
72 fn from(other: PageSegment) -> Self {
73 other.0
74 }
75}
76
77pub fn page_address(segment: &[u8]) -> u64 {
78 let a = &segment[PAGE_SIZE as usize..];
79 u64::from_le_bytes([a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]])
80}