1use crate::ic::{stable_grow, stable_read, stable_size, stable_write};
3use crate::StableMemoryError;
4use std::io;
5
6pub struct StableWriter {
11 offset: usize,
13 capacity: u32,
15}
16
17impl Default for StableWriter {
18 fn default() -> Self {
19 let capacity = stable_size();
20
21 Self {
22 offset: 0,
23 capacity,
24 }
25 }
26}
27
28impl StableWriter {
29 pub fn new(offset: usize) -> Self {
31 StableWriter {
32 offset,
33 capacity: stable_size(),
34 }
35 }
36
37 pub fn offset(&self) -> usize {
39 self.offset
40 }
41
42 pub fn grow(&mut self, added_pages: u32) -> Result<(), StableMemoryError> {
44 let old_page_count = stable_grow(added_pages)?;
45 self.capacity = old_page_count + added_pages;
46 Ok(())
47 }
48
49 pub fn write(&mut self, buf: &[u8]) -> Result<usize, StableMemoryError> {
54 if self.offset + buf.len() > ((self.capacity as usize) << 16) {
55 self.grow((buf.len() >> 16) as u32 + 1)?;
56 }
57
58 stable_write(self.offset as u32, buf);
59 self.offset += buf.len();
60 Ok(buf.len())
61 }
62}
63
64impl io::Write for StableWriter {
65 fn write(&mut self, buf: &[u8]) -> Result<usize, io::Error> {
66 self.write(buf)
67 .map_err(|_| io::Error::new(io::ErrorKind::Other, "Out Of Memory"))
68 }
69
70 fn flush(&mut self) -> Result<(), io::Error> {
71 Ok(())
73 }
74}
75
76pub struct StableReader {
80 offset: usize,
82}
83
84impl Default for StableReader {
85 fn default() -> Self {
86 Self { offset: 0 }
87 }
88}
89
90impl StableReader {
91 pub fn new(offset: usize) -> Self {
93 StableReader { offset }
94 }
95
96 pub fn read(&mut self, buf: &mut [u8]) -> Result<usize, StableMemoryError> {
98 stable_read(self.offset as u32, buf);
99 self.offset += buf.len();
100 Ok(buf.len())
101 }
102}
103
104impl io::Read for StableReader {
105 fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {
106 self.read(buf)
107 .map_err(|_| io::Error::new(io::ErrorKind::Other, "Unexpected error."))
108 }
109}