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
use crate::chunk_list::ChunkList; use crate::error::Error; pub struct RefactoryBuffer<'a> { pub(crate) chunks: ChunkList<'a>, } impl<'a> RefactoryBuffer<'a> { pub fn new(content: &'a [u8]) -> RefactoryBuffer<'a> { RefactoryBuffer { chunks: ChunkList::new(content), } } pub fn len(&self) -> usize { self.chunks.iter().fold(0, |a, c| a + c.len()) } pub fn to_bytes(&self) -> Result<Vec<u8>, Error> { let mut v = Vec::new(); for it in self.chunks.iter() { v.append(&mut it.to_bytes()); } Ok(v) } #[inline] fn do_insert( &mut self, index: usize, content: &[u8], left: bool, append: bool, ) -> Result<(), Error> { let (l, r) = self.chunks.split(index)?; if append { if left { l.append_right(content) } else { r.append_left(content) } } else { if left { l.prepend_right(content) } else { r.prepend_left(content) } } } pub fn append_left(&mut self, index: usize, content: &[u8]) -> Result<(), Error> { self.do_insert(index, content, true, true) } pub fn prepend_left(&mut self, index: usize, content: &[u8]) -> Result<(), Error> { self.do_insert(index, content, true, false) } pub fn append_right(&mut self, index: usize, content: &[u8]) -> Result<(), Error> { self.do_insert(index, content, false, true) } pub fn prepend_right(&mut self, index: usize, content: &[u8]) -> Result<(), Error> { self.do_insert(index, content, false, false) } pub fn prepend(&mut self, content: &[u8]) -> Result<(), Error> { self.prepend_left(0, content) } pub fn append(&mut self, content: &[u8]) -> Result<(), Error> { self.append_right(self.len(), content) } pub fn remove(&mut self, start: usize, end: usize) -> Result<(), Error> { self.chunks.remove(start, end) } }