use std::fmt;
use std::fmt::Debug;
use std::marker::PhantomData;
use std::slice;
use winapi::shared::ws2def::WSABUF;
pub type IoBuf = WSABUF;
pub fn create_iobuf(addr: *mut u8, len: usize) -> IoBuf {
WSABUF {
buf: addr as *mut i8,
len: len as u32,
}
}
#[derive(Copy, Clone)]
#[repr(transparent)]
pub struct IoBufMut<'a> {
buf: WSABUF,
phantom: PhantomData<&'a mut [u8]>,
}
impl<'a> IoBufMut<'a> {
pub fn new(buf: &mut [u8]) -> IoBufMut<'a> {
unsafe { Self::from_raw_parts(buf.as_mut_ptr(), buf.len()) }
}
pub unsafe fn from_raw_parts(addr: *mut u8, len: usize) -> IoBufMut<'a> {
IoBufMut {
buf: WSABUF {
buf: addr as *mut i8,
len: len as u32,
},
phantom: PhantomData,
}
}
pub unsafe fn from_iobuf(iobuf: IoBuf) -> IoBufMut<'a> {
IoBufMut {
buf: iobuf,
phantom: PhantomData,
}
}
pub fn advance(&mut self, _count: usize) {
unimplemented!()
}
pub fn truncate(&mut self, _len: usize) {
unimplemented!()
}
#[inline]
pub fn len(&self) -> usize {
self.buf.len as usize
}
#[inline]
pub fn as_ptr(&self) -> *const u8 {
self.buf.buf as *const u8
}
#[inline]
pub fn as_mut_ptr(&self) -> *mut u8 {
self.buf.buf as *mut u8
}
#[inline]
pub fn as_iobufs<'slice>(iovs: &'slice [IoBufMut<'_>]) -> &'slice [IoBuf] {
unsafe { slice::from_raw_parts(iovs.as_ptr() as *const WSABUF, iovs.len()) }
}
}
impl<'a> AsRef<WSABUF> for IoBufMut<'a> {
fn as_ref(&self) -> &WSABUF {
&self.buf
}
}
impl<'a> AsMut<WSABUF> for IoBufMut<'a> {
fn as_mut(&mut self) -> &mut WSABUF {
&mut self.buf
}
}
struct DebugWSABUF(WSABUF);
impl Debug for DebugWSABUF {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("WSABUF")
.field("buf", &self.0.buf)
.field("len", &self.0.len)
.finish()
}
}
impl<'a> Debug for IoBufMut<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("IoBufMut")
.field("buf", &DebugWSABUF(self.buf))
.field("phantom", &self.phantom)
.finish()
}
}