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