1 use std::io::IoSlice; 2 use std::ops::Deref; 3 use std::slice; 4 5 pub struct IoBufs<'a, 'b>(&'b mut [IoSlice<'a>]); 6 7 impl<'a, 'b> IoBufs<'a, 'b> { new(slices: &'b mut [IoSlice<'a>]) -> Self8 pub fn new(slices: &'b mut [IoSlice<'a>]) -> Self { 9 IoBufs(slices) 10 } 11 is_empty(&self) -> bool12 pub fn is_empty(&self) -> bool { 13 self.0.is_empty() 14 } 15 advance(mut self, n: usize) -> IoBufs<'a, 'b>16 pub fn advance(mut self, n: usize) -> IoBufs<'a, 'b> { 17 let mut to_remove = 0; 18 let mut remaining_len = n; 19 for slice in self.0.iter() { 20 if remaining_len < slice.len() { 21 break; 22 } else { 23 remaining_len -= slice.len(); 24 to_remove += 1; 25 } 26 } 27 self.0 = self.0.split_at_mut(to_remove).1; 28 if let Some(slice) = self.0.first_mut() { 29 let tail = &slice[remaining_len..]; 30 // Safety: recasts slice to the original lifetime 31 let tail = unsafe { slice::from_raw_parts(tail.as_ptr(), tail.len()) }; 32 *slice = IoSlice::new(tail); 33 } else if remaining_len != 0 { 34 panic!("advance past the end of the slice vector"); 35 } 36 self 37 } 38 } 39 40 impl<'a, 'b> Deref for IoBufs<'a, 'b> { 41 type Target = [IoSlice<'a>]; deref(&self) -> &[IoSlice<'a>]42 fn deref(&self) -> &[IoSlice<'a>] { 43 self.0 44 } 45 } 46