1use error::eof;
2
3use std::io;
4use std::cmp;
5use std::ffi::CString;
6
7fn length_error() -> io::Error {
8 io::Error::new(io::ErrorKind::Other, "Length error")
9}
10
11#[derive(Clone, Debug)]
13pub struct StreamBuf {
14 buf: Vec<u8>,
15 max: usize,
16 cur: usize,
17 beg: usize,
18}
19
20impl StreamBuf {
21 pub fn new() -> StreamBuf {
33 Self::with_max_len(usize::max_value())
34 }
35
36 pub fn with_max_len(max: usize) -> StreamBuf {
46 StreamBuf {
47 buf: Vec::new(),
48 max: max,
49 cur: 0,
50 beg: 0,
51 }
52 }
53
54 pub fn capacity(&self) -> usize {
65 self.buf.capacity()
66 }
67
68 pub fn clear(&mut self) {
80 self.buf.clear();
81 self.cur = 0;
82 self.beg = 0;
83 }
84
85 pub fn consume(&mut self, len: usize) {
98 if len >= self.len() {
99 self.clear()
100 } else {
101 self.beg += len;
102 }
103 }
104
105 pub fn commit(&mut self, len: usize) {
119 self.cur = cmp::min(self.cur + len, self.buf.len());
120 }
121
122 pub fn is_empty(&self) -> bool {
133 self.buf.is_empty()
134 }
135
136 pub fn len(&self) -> usize {
147 self.cur - self.beg
148 }
149
150 pub fn max_len(&self) -> usize {
161 self.max
162 }
163
164 pub fn prepare(&mut self, len: usize) -> io::Result<&mut [u8]> {
177 if self.cur + len <= self.max {
178 self.buf.reserve(self.cur + len);
179 unsafe { self.buf.set_len(self.cur + len) };
180 Ok(&mut self.buf[self.cur..])
181 } else if self.beg >= len {
182 self.buf.drain(..self.beg);
183 self.cur -= self.beg;
184 unsafe { self.buf.set_len(len) };
185 Ok(&mut self.buf[self.cur..])
186 } else if self.len() < self.max {
187 self.buf.drain(..self.beg);
188 self.buf.reserve(self.max);
189 self.cur -= self.beg;
190 unsafe { self.buf.set_len(self.max) };
191 Ok(&mut self.buf[self.cur..])
192 } else {
193 Err(length_error())
194 }
195 }
196
197 pub fn prepare_exact(&mut self, len: usize) -> io::Result<&mut [u8]> {
210 if self.cur + len <= self.max {
211 self.buf.reserve(self.cur + len);
212 unsafe { self.buf.set_len(self.cur + len) };
213 Ok(&mut self.buf[self.cur..])
214 } else if self.beg >= len {
215 self.buf.drain(..self.beg);
216 self.cur -= self.beg;
217 unsafe { self.buf.set_len(len) };
218 Ok(&mut self.buf[self.cur..])
219 } else {
220 Err(length_error())
221 }
222 }
223
224 pub fn as_slice(&self) -> &[u8] {
226 &self.buf[self.beg..self.cur]
227 }
228
229 pub fn as_mut_slice(&mut self) -> &mut [u8] {
231 &mut self.buf[self.beg..self.cur]
232 }
233}
234
235impl Default for StreamBuf {
236 fn default() -> Self {
237 StreamBuf::new()
238 }
239}
240
241impl AsRef<StreamBuf> for StreamBuf {
242 fn as_ref(&self) -> &StreamBuf {
243 self
244 }
245}
246
247impl AsMut<StreamBuf> for StreamBuf {
248 fn as_mut(&mut self) -> &mut StreamBuf {
249 self
250 }
251}
252
253impl AsRef<[u8]> for StreamBuf {
254 fn as_ref(&self) -> &[u8] {
255 self.as_slice()
256 }
257}
258
259impl AsMut<[u8]> for StreamBuf {
260 fn as_mut(&mut self) -> &mut [u8] {
261 self.as_mut_slice()
262 }
263}
264
265impl From<Vec<u8>> for StreamBuf {
266 fn from(buf: Vec<u8>) -> Self {
267 let len = buf.len();
268 StreamBuf {
269 buf: buf,
270 max: usize::max_value(),
271 cur: len,
272 beg: 0,
273 }
274 }
275}
276
277impl From<CString> for StreamBuf {
278 fn from(buf: CString) -> Self {
279 StreamBuf::from(Vec::from(buf))
280 }
281}
282
283impl<'a> From<&'a [u8]> for StreamBuf {
284 fn from(buf: &'a [u8]) -> Self {
285 StreamBuf::from(Vec::from(buf))
286 }
287}
288
289impl<'a> From<&'a str> for StreamBuf {
290 fn from(buf: &'a str) -> Self {
291 StreamBuf::from(Vec::from(buf))
292 }
293}
294
295impl io::Read for StreamBuf {
296 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
297 let len = cmp::min(self.len(), buf.len());
298 if len > 0 {
299 buf[..len].clone_from_slice(&self.buf[self.beg..self.beg + len]);
300 self.consume(len);
301 Ok(len)
302 } else {
303 Err(eof())
304 }
305 }
306}
307
308impl io::Write for StreamBuf {
309 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
310 let len = buf.len();
311 try!(self.prepare_exact(len)).clone_from_slice(&buf[..len]);
312 self.commit(len);
313 Ok(len)
314 }
315
316 fn flush(&mut self) -> io::Result<()> {
317 Ok(())
318 }
319}
320
321#[test]
322fn test_streambuf() {
323 let sbuf = StreamBuf::with_max_len(100);
324 assert_eq!(sbuf.len(), 0);
325 assert_eq!(sbuf.max_len(), 100);
326}
327
328#[test]
329fn test_streambuf_prepare() {
330 let mut sbuf = StreamBuf::with_max_len(100);
331 assert_eq!(sbuf.prepare(100).unwrap().len(), 100);
332 sbuf.commit(70);
333 assert_eq!(sbuf.len(), 70);
334 assert_eq!(sbuf.prepare(70).unwrap().len(), 30);
335 sbuf.commit(70);
336 assert_eq!(sbuf.len(), 100);
337}
338
339#[test]
340fn test_streambuf_prepare_exact() {
341 let mut sbuf = StreamBuf::with_max_len(100);
342 assert_eq!(sbuf.prepare_exact(70).unwrap().len(), 70);
343 sbuf.commit(70);
344 assert_eq!(sbuf.len(), 70);
345 assert!(sbuf.prepare_exact(70).is_err());
346 sbuf.commit(70);
347 assert_eq!(sbuf.len(), 70);
348}
349
350#[test]
351fn test_streambuf_as_slice() {
352 let mut sbuf = StreamBuf::new();
353 sbuf.prepare(1000).unwrap();
354 sbuf.commit(100);
355 assert_eq!(sbuf.as_slice().len(), 100);
356 sbuf.commit(10);
357 assert_eq!(sbuf.as_mut_slice().len(), 110);
358}
359
360#[test]
361fn test_streambuf_consume() {
362 let mut sbuf = StreamBuf::with_max_len(100);
363 assert_eq!(sbuf.prepare(1).unwrap().len(), 1);
364 assert_eq!(sbuf.prepare(100).unwrap().len(), 100);
365 assert_eq!(sbuf.len(), 0);
366 sbuf.commit(1);
367 assert_eq!(sbuf.len(), 1);
368 assert!(sbuf.prepare_exact(100).is_err());
369 sbuf.consume(1);
370 assert_eq!(sbuf.len(), 0);
371 assert!(sbuf.prepare_exact(100).is_ok());
372}
373
374#[test]
375fn test_streambuf_from_vec() {
376 let mut sbuf = StreamBuf::from(vec![1,2,3,4,5,6,7,8,9,10]);
377 assert_eq!(sbuf.len(), 10);
378 sbuf.consume(9);
379 assert_eq!(sbuf.as_slice()[0], 10);
380}
381
382#[test]
383fn test_streambuf_read() {
384 use std::io::Read;
385
386 let mut sbuf = StreamBuf::from(vec![1,2,3,4,5,6,7,8,9]);
387 let mut buf = [0; 5];
388 assert_eq!(sbuf.read(&mut buf).unwrap(), 5);
389 assert_eq!(buf, [1,2,3,4,5]);
390 assert_eq!(sbuf.read(&mut buf).unwrap(), 4);
391 assert_eq!(buf, [6,7,8,9,5]);
392 assert!(sbuf.read(&mut buf).is_err());
393}
394
395#[test]
396fn test_streambuf_write() {
397 use std::io::Write;
398
399 let mut sbuf = StreamBuf::with_max_len(9);
400 assert_eq!(sbuf.write(&[1,2,3,4,5]).unwrap(), 5);
401 assert_eq!(sbuf.as_slice(), &[1,2,3,4,5]);
402 assert_eq!(sbuf.write(&[6,7,8,9]).unwrap(), 4);
403 assert_eq!(sbuf.as_slice(), &[1,2,3,4,5,6,7,8,9]);
404 assert!(sbuf.write(&[1]).is_err());
405}