]> git.proxmox.com Git - rustc.git/blame - src/libstd/sys/windows/io.rs
New upstream version 1.41.1+dfsg1
[rustc.git] / src / libstd / sys / windows / io.rs
CommitLineData
532ac7d7
XL
1use crate::marker::PhantomData;
2use crate::slice;
3use crate::sys::c;
9fa01778
XL
4
5#[repr(transparent)]
48663c56 6pub struct IoSlice<'a> {
9fa01778
XL
7 vec: c::WSABUF,
8 _p: PhantomData<&'a [u8]>,
9}
10
48663c56 11impl<'a> IoSlice<'a> {
9fa01778 12 #[inline]
48663c56 13 pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
9fa01778 14 assert!(buf.len() <= c::ULONG::max_value() as usize);
48663c56 15 IoSlice {
9fa01778
XL
16 vec: c::WSABUF {
17 len: buf.len() as c::ULONG,
18 buf: buf.as_ptr() as *mut u8 as *mut c::CHAR,
19 },
20 _p: PhantomData,
21 }
22 }
23
416331ca
XL
24 #[inline]
25 pub fn advance(&mut self, n: usize) {
26 if (self.vec.len as usize) < n {
27 panic!("advancing IoSlice beyond its length");
28 }
29
30 unsafe {
31 self.vec.len -= n as c::ULONG;
32 self.vec.buf = self.vec.buf.add(n);
33 }
34 }
35
9fa01778
XL
36 #[inline]
37 pub fn as_slice(&self) -> &[u8] {
60c5eb7d 38 unsafe { slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize) }
9fa01778
XL
39 }
40}
41
416331ca 42#[repr(transparent)]
48663c56 43pub struct IoSliceMut<'a> {
9fa01778
XL
44 vec: c::WSABUF,
45 _p: PhantomData<&'a mut [u8]>,
46}
47
48663c56 48impl<'a> IoSliceMut<'a> {
9fa01778 49 #[inline]
48663c56 50 pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
9fa01778 51 assert!(buf.len() <= c::ULONG::max_value() as usize);
48663c56 52 IoSliceMut {
60c5eb7d 53 vec: c::WSABUF { len: buf.len() as c::ULONG, buf: buf.as_mut_ptr() as *mut c::CHAR },
9fa01778
XL
54 _p: PhantomData,
55 }
56 }
57
416331ca
XL
58 #[inline]
59 pub fn advance(&mut self, n: usize) {
60 if (self.vec.len as usize) < n {
61 panic!("advancing IoSliceMut beyond its length");
62 }
63
64 unsafe {
65 self.vec.len -= n as c::ULONG;
66 self.vec.buf = self.vec.buf.add(n);
67 }
68 }
69
9fa01778
XL
70 #[inline]
71 pub fn as_slice(&self) -> &[u8] {
60c5eb7d 72 unsafe { slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize) }
9fa01778
XL
73 }
74
75 #[inline]
76 pub fn as_mut_slice(&mut self) -> &mut [u8] {
60c5eb7d 77 unsafe { slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.len as usize) }
9fa01778
XL
78 }
79}