]>
Commit | Line | Data |
---|---|---|
532ac7d7 XL |
1 | use crate::marker::PhantomData; |
2 | use crate::slice; | |
3 | ||
60c5eb7d | 4 | use libc::{c_void, iovec}; |
9fa01778 | 5 | |
ba9703b0 | 6 | #[derive(Copy, Clone)] |
9fa01778 | 7 | #[repr(transparent)] |
48663c56 | 8 | pub struct IoSlice<'a> { |
9fa01778 XL |
9 | vec: iovec, |
10 | _p: PhantomData<&'a [u8]>, | |
11 | } | |
12 | ||
48663c56 | 13 | impl<'a> IoSlice<'a> { |
9fa01778 | 14 | #[inline] |
48663c56 XL |
15 | pub fn new(buf: &'a [u8]) -> IoSlice<'a> { |
16 | IoSlice { | |
60c5eb7d | 17 | vec: iovec { iov_base: buf.as_ptr() as *mut u8 as *mut c_void, iov_len: buf.len() }, |
9fa01778 XL |
18 | _p: PhantomData, |
19 | } | |
20 | } | |
21 | ||
416331ca XL |
22 | #[inline] |
23 | pub fn advance(&mut self, n: usize) { | |
24 | if self.vec.iov_len < n { | |
25 | panic!("advancing IoSlice beyond its length"); | |
26 | } | |
27 | ||
28 | unsafe { | |
29 | self.vec.iov_len -= n; | |
30 | self.vec.iov_base = self.vec.iov_base.add(n); | |
31 | } | |
32 | } | |
33 | ||
9fa01778 XL |
34 | #[inline] |
35 | pub fn as_slice(&self) -> &[u8] { | |
60c5eb7d | 36 | unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) } |
9fa01778 XL |
37 | } |
38 | } | |
39 | ||
416331ca | 40 | #[repr(transparent)] |
48663c56 | 41 | pub struct IoSliceMut<'a> { |
9fa01778 XL |
42 | vec: iovec, |
43 | _p: PhantomData<&'a mut [u8]>, | |
44 | } | |
45 | ||
48663c56 | 46 | impl<'a> IoSliceMut<'a> { |
9fa01778 | 47 | #[inline] |
48663c56 XL |
48 | pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> { |
49 | IoSliceMut { | |
60c5eb7d | 50 | vec: iovec { iov_base: buf.as_mut_ptr() as *mut c_void, iov_len: buf.len() }, |
9fa01778 XL |
51 | _p: PhantomData, |
52 | } | |
53 | } | |
54 | ||
416331ca XL |
55 | #[inline] |
56 | pub fn advance(&mut self, n: usize) { | |
57 | if self.vec.iov_len < n { | |
58 | panic!("advancing IoSliceMut beyond its length"); | |
59 | } | |
60 | ||
61 | unsafe { | |
62 | self.vec.iov_len -= n; | |
63 | self.vec.iov_base = self.vec.iov_base.add(n); | |
64 | } | |
65 | } | |
66 | ||
9fa01778 XL |
67 | #[inline] |
68 | pub fn as_slice(&self) -> &[u8] { | |
60c5eb7d | 69 | unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) } |
9fa01778 XL |
70 | } |
71 | ||
72 | #[inline] | |
73 | pub fn as_mut_slice(&mut self) -> &mut [u8] { | |
60c5eb7d | 74 | unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) } |
9fa01778 XL |
75 | } |
76 | } |