rs_streams/
memorystream.rs

1use 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///////////////////////////////////////////////////////////////////////////////
106#[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}