1 use crate::marker::PhantomData;
4 use super::abi::sockets::iovec;
9 pub struct IoSlice<'a> {
11 _p: PhantomData<&'a [u8]>,
14 impl<'a> IoSlice<'a> {
16 pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
18 vec: iovec { iov_base: buf.as_ptr() as *mut u8 as *mut c_void, iov_len: buf.len() },
24 pub fn advance(&mut self, n: usize) {
25 if self.vec.iov_len < n {
26 panic!("advancing IoSlice beyond its length");
30 self.vec.iov_len -= n;
31 self.vec.iov_base = self.vec.iov_base.add(n);
36 pub fn as_slice(&self) -> &[u8] {
37 unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
42 pub struct IoSliceMut<'a> {
44 _p: PhantomData<&'a mut [u8]>,
47 impl<'a> IoSliceMut<'a> {
49 pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
51 vec: iovec { iov_base: buf.as_mut_ptr() as *mut c_void, iov_len: buf.len() },
57 pub fn advance(&mut self, n: usize) {
58 if self.vec.iov_len < n {
59 panic!("advancing IoSliceMut beyond its length");
63 self.vec.iov_len -= n;
64 self.vec.iov_base = self.vec.iov_base.add(n);
69 pub fn as_slice(&self) -> &[u8] {
70 unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
74 pub fn as_mut_slice(&mut self) -> &mut [u8] {
75 unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }
79 pub fn is_terminal<T>(_: &T) -> bool {