1use crate::vec::*;
2
3pub trait Stream : Drop {
4 fn tell(&self) -> usize;
6
7 fn size(&self) -> usize;
9}
10
11pub trait StreamReader : Stream {
12 fn read(&mut self, buff: &mut [u8]) -> Result<usize, ()>;
13 fn isEOF(&self) -> bool;
14}
15
16pub trait StreamWriter : Stream {
17 fn write(&mut self, buff: &[u8]) -> Result<usize, ()>;
18}
19
20pub trait StreamSeek : Stream {
21 fn seek(&mut self, cursor: usize) -> Result<usize, ()>;
22}
23
24pub struct MemoryStreamWriter {
25 data : Vec<u8>,
26 cursor : usize,
27}
28
29impl MemoryStreamWriter {
30 pub fn new() -> Self {
31 Self { data: Vec::new(), cursor: 0 }
32 }
33
34 pub fn data(&self) -> &Vec<u8> { &self.data }
35 pub fn dataMut(&mut self) -> &mut Vec<u8> { &mut self.data }
36}
37
38impl Drop for MemoryStreamWriter {
39 fn drop(&mut self) {}
40}
41
42impl Stream for MemoryStreamWriter {
43 fn tell(&self) -> usize { self.cursor }
44 fn size(&self) -> usize { self.data.len() }
45}
46
47impl StreamWriter for MemoryStreamWriter {
48 fn write(&mut self, buff: &[u8]) -> Result<usize, ()> {
49 let available = self.data.len() - self.cursor;
50 let remaining = if buff.len() < available { 0 } else { buff.len() - available };
51 let first = usize::min(available, buff.len());
52
53 for i in 0..first {
54 self.data[self.cursor + i] = buff[i];
55 }
56 for i in 0..remaining {
57 self.data.pushBack(buff[first + i]);
58 }
59 self.cursor += buff.len();
60 Ok(buff.len())
61 }
62}
63
64impl StreamSeek for MemoryStreamWriter {
65 fn seek(&mut self, cursor: usize) -> Result<usize, ()> {
66 if self.data.len() < cursor {
67 self.cursor = self.data.len();
68 } else {
69 self.cursor = cursor;
70 }
71 Ok(self.cursor)
72 }
73}
74
75pub struct MemoryStreamReader {
78 data : Vec<u8>,
79 cursor : usize,
80}
81
82impl MemoryStreamReader {
83 pub fn from(src: &[u8]) -> Self {
84 let mut v = Vec::new();
85 v.append(src);
86 Self { data : v, cursor: 0 }
87 }
88}
89
90impl Stream for MemoryStreamReader {
91 fn tell(&self) -> usize { self.cursor }
92 fn size(&self) -> usize { self.data.len() }
93}
94
95impl Drop for MemoryStreamReader {
96 fn drop(&mut self) {}
97}
98
99impl StreamReader for MemoryStreamReader {
100 fn isEOF(&self) -> bool { self.cursor == self.data.len() }
101 fn read(&mut self, buff: &mut [u8]) -> Result<usize, ()> {
102 let readLen =
103 if buff.len() > self.data.len() - self.cursor {
104 self.data.len() - self.cursor
105 } else {
106 buff.len()
107 };
108 for c in 0..readLen {
109 buff[c] = self.data[self.cursor + c];
110 }
111 self.cursor += readLen;
112 Ok(readLen)
113 }
114}
115
116impl StreamSeek for MemoryStreamReader {
117 fn seek(&mut self, cursor: usize) -> Result<usize, ()> {
118 if self.data.len() < cursor {
119 self.cursor = self.data.len();
120 } else {
121 self.cursor = cursor;
122 }
123 Ok(self.cursor)
124 }
125}
126
127
128#[cfg(test)]
130mod tests {
131 use super::*;
132 #[test]
133 fn testMemoryWriteStream() {
134 let mut msw = MemoryStreamWriter::new();
135 let string = "hello world".as_bytes();
136 assert!(msw.write(string) == Result::Ok(11));
137 assert!(msw.tell() == 11);
138 assert!(msw.size() == 11);
139 let data = msw.data().asArray();
140 assert!(data.len() == 11);
141 for i in 0..string.len() {
142 assert!(data[i] == string[i]);
143 }
144 assert!(msw.seek(5) == Result::Ok(5));
145 assert!(msw.write("1234".as_bytes()) == Result::Ok(4));
146 assert!(msw.tell() == 9);
147 let string = "hello1234ld".as_bytes();
148 let data = msw.data().asArray();
149 assert!(data.len() == 11);
150 for i in 0..string.len() {
151 assert!(data[i] == string[i]);
152 }
153 assert!(msw.seek(14) == Result::Ok(11));
154 }
155
156 #[test]
157 fn testMemoryReadStream() {
158 let mut msr = MemoryStreamReader::from("hello world".as_bytes());
159 assert!(msr.tell() == 0);
160 assert!(msr.size() == 11);
161 let string = "hello world".as_bytes();
162 let mut buff = [0u8; 11];
163 assert!(msr.read(&mut buff) == Result::Ok(11));
164 for i in 0..string.len() {
165 assert!(buff[i] == string[i]);
166 }
167 assert!(msr.seek(5) == Result::Ok(5));
168
169 let mut buff = [0u8; 4];
170 assert!(msr.read(&mut buff) == Result::Ok(4));
171 assert!(msr.tell() == 9);
172 let string = " wor".as_bytes();
173 for i in 0..string.len() {
174 assert!(buff[i] == string[i]);
175 }
176 assert!(msr.seek(14) == Result::Ok(11));
177
178 assert!("0.1234".parse::<f32>().unwrap() == 0.1234_f32);
179 }
180}