From dad56c39474377c7d47e261b380d0be3aed104cc Mon Sep 17 00:00:00 2001 From: Thomas de Zeeuw Date: Thu, 25 Jul 2019 22:30:52 +0200 Subject: Add {IoSlice, IoSliceMut}::advance --- src/libstd/sys/cloudabi/io.rs | 14 ++++++++++++++ src/libstd/sys/redox/io.rs | 14 ++++++++++++++ src/libstd/sys/sgx/io.rs | 14 ++++++++++++++ src/libstd/sys/unix/io.rs | 24 ++++++++++++++++++++++++ src/libstd/sys/vxworks/io.rs | 24 ++++++++++++++++++++++++ src/libstd/sys/wasi/io.rs | 24 ++++++++++++++++++++++++ src/libstd/sys/wasm/io.rs | 14 ++++++++++++++ src/libstd/sys/windows/io.rs | 24 ++++++++++++++++++++++++ 8 files changed, 152 insertions(+) (limited to 'src/libstd/sys') diff --git a/src/libstd/sys/cloudabi/io.rs b/src/libstd/sys/cloudabi/io.rs index 4b423a5cbc1..976e122463d 100644 --- a/src/libstd/sys/cloudabi/io.rs +++ b/src/libstd/sys/cloudabi/io.rs @@ -1,3 +1,5 @@ +use crate::mem; + pub struct IoSlice<'a>(&'a [u8]); impl<'a> IoSlice<'a> { @@ -6,6 +8,11 @@ impl<'a> IoSlice<'a> { IoSlice(buf) } + #[inline] + pub fn advance(&mut self, n: usize) { + self.0 = &self.0[n..] + } + #[inline] pub fn as_slice(&self) -> &[u8] { self.0 @@ -20,6 +27,13 @@ impl<'a> IoSliceMut<'a> { IoSliceMut(buf) } + #[inline] + pub fn advance(&mut self, n: usize) { + let slice = mem::replace(&mut self.0, &mut []); + let (_, remaining) = slice.split_at_mut(n); + self.0 = remaining; + } + #[inline] pub fn as_slice(&self) -> &[u8] { self.0 diff --git a/src/libstd/sys/redox/io.rs b/src/libstd/sys/redox/io.rs index 4b423a5cbc1..976e122463d 100644 --- a/src/libstd/sys/redox/io.rs +++ b/src/libstd/sys/redox/io.rs @@ -1,3 +1,5 @@ +use crate::mem; + pub struct IoSlice<'a>(&'a [u8]); impl<'a> IoSlice<'a> { @@ -6,6 +8,11 @@ impl<'a> IoSlice<'a> { IoSlice(buf) } + #[inline] + pub fn advance(&mut self, n: usize) { + self.0 = &self.0[n..] + } + #[inline] pub fn as_slice(&self) -> &[u8] { self.0 @@ -20,6 +27,13 @@ impl<'a> IoSliceMut<'a> { IoSliceMut(buf) } + #[inline] + pub fn advance(&mut self, n: usize) { + let slice = mem::replace(&mut self.0, &mut []); + let (_, remaining) = slice.split_at_mut(n); + self.0 = remaining; + } + #[inline] pub fn as_slice(&self) -> &[u8] { self.0 diff --git a/src/libstd/sys/sgx/io.rs b/src/libstd/sys/sgx/io.rs index 4b423a5cbc1..976e122463d 100644 --- a/src/libstd/sys/sgx/io.rs +++ b/src/libstd/sys/sgx/io.rs @@ -1,3 +1,5 @@ +use crate::mem; + pub struct IoSlice<'a>(&'a [u8]); impl<'a> IoSlice<'a> { @@ -6,6 +8,11 @@ impl<'a> IoSlice<'a> { IoSlice(buf) } + #[inline] + pub fn advance(&mut self, n: usize) { + self.0 = &self.0[n..] + } + #[inline] pub fn as_slice(&self) -> &[u8] { self.0 @@ -20,6 +27,13 @@ impl<'a> IoSliceMut<'a> { IoSliceMut(buf) } + #[inline] + pub fn advance(&mut self, n: usize) { + let slice = mem::replace(&mut self.0, &mut []); + let (_, remaining) = slice.split_at_mut(n); + self.0 = remaining; + } + #[inline] pub fn as_slice(&self) -> &[u8] { self.0 diff --git a/src/libstd/sys/unix/io.rs b/src/libstd/sys/unix/io.rs index bc854e772e1..a3a72919176 100644 --- a/src/libstd/sys/unix/io.rs +++ b/src/libstd/sys/unix/io.rs @@ -21,6 +21,18 @@ impl<'a> IoSlice<'a> { } } + #[inline] + pub fn advance(&mut self, n: usize) { + if self.vec.iov_len < n { + panic!("advancing IoSlice beyond its length"); + } + + unsafe { + self.vec.iov_len -= n; + self.vec.iov_base = self.vec.iov_base.add(n); + } + } + #[inline] pub fn as_slice(&self) -> &[u8] { unsafe { @@ -47,6 +59,18 @@ impl<'a> IoSliceMut<'a> { } } + #[inline] + pub fn advance(&mut self, n: usize) { + if self.vec.iov_len < n { + panic!("advancing IoSliceMut beyond its length"); + } + + unsafe { + self.vec.iov_len -= n; + self.vec.iov_base = self.vec.iov_base.add(n); + } + } + #[inline] pub fn as_slice(&self) -> &[u8] { unsafe { diff --git a/src/libstd/sys/vxworks/io.rs b/src/libstd/sys/vxworks/io.rs index 72954ff20ef..8cd11cbf5df 100644 --- a/src/libstd/sys/vxworks/io.rs +++ b/src/libstd/sys/vxworks/io.rs @@ -21,6 +21,18 @@ impl<'a> IoSlice<'a> { } } + #[inline] + pub fn advance(&mut self, n: usize) { + if self.vec.iov_len < n { + panic!("advancing IoSlice beyond its length"); + } + + unsafe { + self.vec.iov_len -= n; + self.vec.iov_base = self.vec.iov_base.add(n); + } + } + #[inline] pub fn as_slice(&self) -> &[u8] { unsafe { @@ -46,6 +58,18 @@ impl<'a> IoSliceMut<'a> { } } + #[inline] + pub fn advance(&mut self, n: usize) { + if self.vec.iov_len < n { + panic!("advancing IoSliceMut beyond its length"); + } + + unsafe { + self.vec.iov_len -= n; + self.vec.iov_base = self.vec.iov_base.add(n); + } + } + #[inline] pub fn as_slice(&self) -> &[u8] { unsafe { diff --git a/src/libstd/sys/wasi/io.rs b/src/libstd/sys/wasi/io.rs index a5bddad708b..ffecca5d1b6 100644 --- a/src/libstd/sys/wasi/io.rs +++ b/src/libstd/sys/wasi/io.rs @@ -21,6 +21,18 @@ impl<'a> IoSlice<'a> { } } + #[inline] + pub fn advance(&mut self, n: usize) { + if self.vec.buf_len < n { + panic!("advancing IoSlice beyond its length"); + } + + unsafe { + self.vec.buf_len -= n; + self.vec.buf = self.vec.buf.add(n); + } + } + #[inline] pub fn as_slice(&self) -> &[u8] { unsafe { @@ -47,6 +59,18 @@ impl<'a> IoSliceMut<'a> { } } + #[inline] + pub fn advance(&mut self, n: usize) { + if self.vec.buf_len < n { + panic!("advancing IoSlice beyond its length"); + } + + unsafe { + self.vec.buf_len -= n; + self.vec.buf = self.vec.buf.add(n); + } + } + #[inline] pub fn as_slice(&self) -> &[u8] { unsafe { diff --git a/src/libstd/sys/wasm/io.rs b/src/libstd/sys/wasm/io.rs index 4b423a5cbc1..976e122463d 100644 --- a/src/libstd/sys/wasm/io.rs +++ b/src/libstd/sys/wasm/io.rs @@ -1,3 +1,5 @@ +use crate::mem; + pub struct IoSlice<'a>(&'a [u8]); impl<'a> IoSlice<'a> { @@ -6,6 +8,11 @@ impl<'a> IoSlice<'a> { IoSlice(buf) } + #[inline] + pub fn advance(&mut self, n: usize) { + self.0 = &self.0[n..] + } + #[inline] pub fn as_slice(&self) -> &[u8] { self.0 @@ -20,6 +27,13 @@ impl<'a> IoSliceMut<'a> { IoSliceMut(buf) } + #[inline] + pub fn advance(&mut self, n: usize) { + let slice = mem::replace(&mut self.0, &mut []); + let (_, remaining) = slice.split_at_mut(n); + self.0 = remaining; + } + #[inline] pub fn as_slice(&self) -> &[u8] { self.0 diff --git a/src/libstd/sys/windows/io.rs b/src/libstd/sys/windows/io.rs index f0da2323f4f..e44dcbe164d 100644 --- a/src/libstd/sys/windows/io.rs +++ b/src/libstd/sys/windows/io.rs @@ -21,6 +21,18 @@ impl<'a> IoSlice<'a> { } } + #[inline] + pub fn advance(&mut self, n: usize) { + if (self.vec.len as usize) < n { + panic!("advancing IoSlice beyond its length"); + } + + unsafe { + self.vec.len -= n as c::ULONG; + self.vec.buf = self.vec.buf.add(n); + } + } + #[inline] pub fn as_slice(&self) -> &[u8] { unsafe { @@ -48,6 +60,18 @@ impl<'a> IoSliceMut<'a> { } } + #[inline] + pub fn advance(&mut self, n: usize) { + if (self.vec.len as usize) < n { + panic!("advancing IoSliceMut beyond its length"); + } + + unsafe { + self.vec.len -= n as c::ULONG; + self.vec.buf = self.vec.buf.add(n); + } + } + #[inline] pub fn as_slice(&self) -> &[u8] { unsafe { -- cgit 1.4.1-3-g733a5