1 use crate::marker
::PhantomData
;
4 use libc
::{c_void, iovec}
;
8 pub struct IoSlice
<'a
> {
10 _p
: PhantomData
<&'a
[u8]>,
13 impl<'a
> IoSlice
<'a
> {
15 pub fn new(buf
: &'a
[u8]) -> IoSlice
<'a
> {
17 vec
: iovec { iov_base: buf.as_ptr() as *mut u8 as *mut c_void, iov_len: buf.len() }
,
23 pub fn advance(&mut self, n
: usize) {
24 if self.vec
.iov_len
< n
{
25 panic
!("advancing IoSlice beyond its length");
29 self.vec
.iov_len
-= n
;
30 self.vec
.iov_base
= self.vec
.iov_base
.add(n
);
35 pub fn as_slice(&self) -> &[u8] {
36 unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
40 pub struct IoSliceMut
<'a
> {
42 _p
: PhantomData
<&'a
mut [u8]>,
45 impl<'a
> IoSliceMut
<'a
> {
47 pub fn new(buf
: &'a
mut [u8]) -> IoSliceMut
<'a
> {
49 vec
: iovec { iov_base: buf.as_mut_ptr() as *mut c_void, iov_len: buf.len() }
,
55 pub fn advance(&mut self, n
: usize) {
56 if self.vec
.iov_len
< n
{
57 panic
!("advancing IoSliceMut beyond its length");
61 self.vec
.iov_len
-= n
;
62 self.vec
.iov_base
= self.vec
.iov_base
.add(n
);
67 pub fn as_slice(&self) -> &[u8] {
68 unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
72 pub fn as_mut_slice(&mut self) -> &mut [u8] {
73 unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }