]> git.lizzy.rs Git - rust.git/blob - library/std/src/sys/unix/io.rs
Rollup merge of #90704 - ijackson:exitstatus-comments, r=joshtriplett
[rust.git] / library / std / src / sys / unix / io.rs
1 use crate::marker::PhantomData;
2 use crate::slice;
3
4 use libc::{c_void, iovec};
5
6 #[derive(Copy, Clone)]
7 #[repr(transparent)]
8 pub struct IoSlice<'a> {
9     vec: iovec,
10     _p: PhantomData<&'a [u8]>,
11 }
12
13 impl<'a> IoSlice<'a> {
14     #[inline]
15     pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
16         IoSlice {
17             vec: iovec { iov_base: buf.as_ptr() as *mut u8 as *mut c_void, iov_len: buf.len() },
18             _p: PhantomData,
19         }
20     }
21
22     #[inline]
23     pub fn advance(&mut self, n: usize) {
24         if self.vec.iov_len < n {
25             panic!("advancing IoSlice beyond its length");
26         }
27
28         unsafe {
29             self.vec.iov_len -= n;
30             self.vec.iov_base = self.vec.iov_base.add(n);
31         }
32     }
33
34     #[inline]
35     pub fn as_slice(&self) -> &[u8] {
36         unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
37     }
38 }
39
40 #[repr(transparent)]
41 pub struct IoSliceMut<'a> {
42     vec: iovec,
43     _p: PhantomData<&'a mut [u8]>,
44 }
45
46 impl<'a> IoSliceMut<'a> {
47     #[inline]
48     pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
49         IoSliceMut {
50             vec: iovec { iov_base: buf.as_mut_ptr() as *mut c_void, iov_len: buf.len() },
51             _p: PhantomData,
52         }
53     }
54
55     #[inline]
56     pub fn advance(&mut self, n: usize) {
57         if self.vec.iov_len < n {
58             panic!("advancing IoSliceMut beyond its length");
59         }
60
61         unsafe {
62             self.vec.iov_len -= n;
63             self.vec.iov_base = self.vec.iov_base.add(n);
64         }
65     }
66
67     #[inline]
68     pub fn as_slice(&self) -> &[u8] {
69         unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
70     }
71
72     #[inline]
73     pub fn as_mut_slice(&mut self) -> &mut [u8] {
74         unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }
75     }
76 }