1 use crate::marker::PhantomData;
7 pub struct IoSlice<'a> {
9 _p: PhantomData<&'a [u8]>,
12 impl<'a> IoSlice<'a> {
14 pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
15 assert!(buf.len() <= c::ULONG::MAX as usize);
18 len: buf.len() as c::ULONG,
19 buf: buf.as_ptr() as *mut u8 as *mut c::CHAR,
26 pub fn advance(&mut self, n: usize) {
27 if (self.vec.len as usize) < n {
28 panic!("advancing IoSlice beyond its length");
32 self.vec.len -= n as c::ULONG;
33 self.vec.buf = self.vec.buf.add(n);
38 pub fn as_slice(&self) -> &[u8] {
39 unsafe { slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize) }
44 pub struct IoSliceMut<'a> {
46 _p: PhantomData<&'a mut [u8]>,
49 impl<'a> IoSliceMut<'a> {
51 pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
52 assert!(buf.len() <= c::ULONG::MAX as usize);
54 vec: c::WSABUF { len: buf.len() as c::ULONG, buf: buf.as_mut_ptr() as *mut c::CHAR },
60 pub fn advance(&mut self, n: usize) {
61 if (self.vec.len as usize) < n {
62 panic!("advancing IoSliceMut beyond its length");
66 self.vec.len -= n as c::ULONG;
67 self.vec.buf = self.vec.buf.add(n);
72 pub fn as_slice(&self) -> &[u8] {
73 unsafe { slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize) }
77 pub fn as_mut_slice(&mut self) -> &mut [u8] {
78 unsafe { slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.len as usize) }