1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
use std::io::{Read, Write, Result}; use std::ptr; use std::fmt; use std::cmp; pub struct Buffer { val: Vec<u8>, rpos: usize, wpos: usize, } impl Buffer { pub fn new() -> Buffer { Buffer { val: Vec::new(), rpos: 0, wpos: 0, } } pub fn get_data(&self) -> &Vec<u8> { &self.val } pub fn len(&self) -> usize { self.val.len() } pub fn set_rpos(&mut self, rpos: usize) { self.rpos = rpos; } pub fn get_rpos(&self) -> usize { self.rpos } pub fn set_wpos(&mut self, wpos: usize) { self.wpos = wpos; } pub fn get_wpos(&self) -> usize { self.wpos } pub fn drain(&mut self, pos: usize) { self.rpos = self.rpos - cmp::min(self.rpos, pos); self.wpos = self.wpos - cmp::min(self.wpos, pos); let pos = cmp::min(self.val.len(), pos); self.val.drain(..pos); } pub fn drain_collect(&mut self, pos: usize) -> Vec<u8> { self.rpos = self.rpos - cmp::min(self.rpos, pos); self.wpos = self.wpos - cmp::min(self.wpos, pos); let pos = cmp::min(self.val.len(), pos); self.val.drain(..pos).collect() } pub fn clear(&mut self) { self.val.clear(); self.rpos = 0; self.wpos = 0; } } impl fmt::Debug for Buffer { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { write!(fmt, "bytes ({:?})", self.val) } } impl Read for Buffer { fn read(&mut self, buf: &mut [u8]) -> Result<usize> { let left = self.val.len() - self.rpos; if left == 0 || buf.len() == 0 { return Ok(0); } let read = if left > buf.len() { buf.len() } else { left }; unsafe { ptr::copy(&self.val[self.rpos], &mut buf[0], read); } self.rpos += read; Ok(read) } } impl Write for Buffer { fn write(&mut self, buf: &[u8]) -> Result<usize> { if self.val.len() < self.wpos + buf.len() { self.val.resize(self.wpos + buf.len(), 0); } if buf.len() == 0 { return Ok(buf.len()); } unsafe { ptr::copy(&buf[0], &mut self.val[self.wpos], buf.len()); } self.wpos += buf.len(); Ok(buf.len()) } fn flush(&mut self) -> Result<()> { Ok(()) } }