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