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