1 use crate::std::marker::PhantomData;
2 use crate::std::slice;
3
4 use super::abi::sockets::iovec;
5 use dlibc;
6 use dlibc::c_void;
7
8 #[derive(Copy, Clone)]
9 #[repr(transparent)]
10 pub struct IoSlice<'a> {
11 vec: iovec,
12 _p: PhantomData<&'a [u8]>,
13 }
14
15 impl<'a> IoSlice<'a> {
16 #[inline]
new(buf: &'a [u8]) -> IoSlice<'a>17 pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
18 IoSlice {
19 vec: iovec {
20 iov_base: buf.as_ptr() as *mut u8 as *mut c_void,
21 iov_len: buf.len(),
22 },
23 _p: PhantomData,
24 }
25 }
26
27 #[inline]
advance(&mut self, n: usize)28 pub fn advance(&mut self, n: usize) {
29 if self.vec.iov_len < n {
30 panic!("advancing IoSlice beyond its length");
31 }
32
33 unsafe {
34 self.vec.iov_len -= n;
35 self.vec.iov_base = self.vec.iov_base.add(n);
36 }
37 }
38
39 #[inline]
as_slice(&self) -> &[u8]40 pub fn as_slice(&self) -> &[u8] {
41 unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
42 }
43 }
44
45 #[repr(transparent)]
46 pub struct IoSliceMut<'a> {
47 vec: iovec,
48 _p: PhantomData<&'a mut [u8]>,
49 }
50
51 impl<'a> IoSliceMut<'a> {
52 #[inline]
new(buf: &'a mut [u8]) -> IoSliceMut<'a>53 pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
54 IoSliceMut {
55 vec: iovec {
56 iov_base: buf.as_mut_ptr() as *mut c_void,
57 iov_len: buf.len(),
58 },
59 _p: PhantomData,
60 }
61 }
62
63 #[inline]
advance(&mut self, n: usize)64 pub fn advance(&mut self, n: usize) {
65 if self.vec.iov_len < n {
66 panic!("advancing IoSliceMut beyond its length");
67 }
68
69 unsafe {
70 self.vec.iov_len -= n;
71 self.vec.iov_base = self.vec.iov_base.add(n);
72 }
73 }
74
75 #[inline]
as_slice(&self) -> &[u8]76 pub fn as_slice(&self) -> &[u8] {
77 unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
78 }
79
80 #[inline]
as_mut_slice(&mut self) -> &mut [u8]81 pub fn as_mut_slice(&mut self) -> &mut [u8] {
82 unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }
83 }
84 }
85
is_terminal<T>(_: &T) -> bool86 pub fn is_terminal<T>(_: &T) -> bool {
87 false
88 }
89