xref: /drstd/src/std/sys/solid/io.rs (revision 9670759b785600bf6315e4173e46a602f16add7a)
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