]> git.proxmox.com Git - cargo.git/blob - vendor/iovec/src/sys/windows.rs
New upstream version 0.35.0
[cargo.git] / vendor / iovec / src / sys / windows.rs
1 use winapi::shared::minwindef::DWORD;
2 use winapi::shared::ws2def::WSABUF;
3 use std::{mem, slice, u32};
4
5 pub struct IoVec {
6 inner: [u8],
7 }
8
9 pub const MAX_LENGTH: usize = u32::MAX as usize;
10
11 impl IoVec {
12 pub fn as_ref(&self) -> &[u8] {
13 unsafe {
14 let vec = self.wsabuf();
15 slice::from_raw_parts(vec.buf as *const u8, vec.len as usize)
16 }
17 }
18
19 pub fn as_mut(&mut self) -> &mut [u8] {
20 unsafe {
21 let vec = self.wsabuf();
22 slice::from_raw_parts_mut(vec.buf as *mut u8, vec.len as usize)
23 }
24 }
25
26 unsafe fn wsabuf(&self) -> WSABUF {
27 mem::transmute(&self.inner)
28 }
29 }
30
31 impl<'a> From<&'a [u8]> for &'a IoVec {
32 fn from(src: &'a [u8]) -> Self {
33 assert!(src.len() > 0);
34 assert!(src.len() <= MAX_LENGTH);
35
36 unsafe {
37 mem::transmute(WSABUF {
38 buf: src.as_ptr() as *mut _,
39 len: src.len() as DWORD,
40 })
41 }
42 }
43 }
44
45 impl<'a> From<&'a mut [u8]> for &'a mut IoVec {
46 fn from(src: &'a mut [u8]) -> Self {
47 assert!(src.len() > 0);
48 assert!(src.len() <= MAX_LENGTH);
49
50 unsafe {
51 mem::transmute(WSABUF {
52 buf: src.as_ptr() as *mut _,
53 len: src.len() as DWORD,
54 })
55 }
56 }
57 }