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
use super::memory_block::MemoryBlock;

#[derive(Debug)]
pub struct MemoryBlockWrite {
    block: MemoryBlock,
    offset: u32,
}

impl MemoryBlockWrite {
    pub fn new(block: MemoryBlock) -> MemoryBlockWrite {
        MemoryBlockWrite {
            block,
            offset: 0,
        }
    }

    pub fn get_block(self) -> MemoryBlock {
        self.block
    }

    pub fn write(&mut self, data: &[u8]) {
        self.block.write(self.offset, data);
        self.offset += data.len() as u32;
    }

    pub fn write_u8(&mut self, value: impl Into<u8>) {
        let value = value.into();
        self.write(&[value]);
    }

    pub fn write_u64(&mut self, value: u64) {
        let bytes: [u8; 8] = value.to_be_bytes();
        self.write(&bytes);
    }

    pub fn write_i64(&mut self, value: i64) {
        let bytes: [u8; 8] = value.to_be_bytes();
        self.write(&bytes);
    }

    pub fn write_u32(&mut self, value: u32) {
        let bytes: [u8; 4] = value.to_be_bytes();
        self.write(&bytes);
    }

    pub fn write_i32(&mut self, value: i32) {
        let bytes: [u8; 4] = value.to_be_bytes();
        self.write(&bytes);
    }

    pub fn write_u16(&mut self, value: u16) {
        let bytes: [u8; 2] = value.to_be_bytes();
        self.write(&bytes);
    }

    pub fn write_f64(&mut self, value: f64) {
        let bytes: [u8; 8] = value.to_be_bytes();
        self.write(&bytes);
    }
}