alt_std/
stream.rs

1use crate::vec::*;
2
3pub trait Stream : Drop {
4    /// get the current position
5    fn tell(&self) -> usize;
6
7    /// get the size of the stream
8    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
75///////////////////////////////////////////////////////////////////////////////
76
77pub 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///////////////////////////////////////////////////////////////////////////////
129#[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}