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