mirror of
https://github.com/tokio-rs/bytes.git
synced 2026-08-24 00:00:14 +02:00
Replace iovec with std::io::IoSlice
- Renames `bytes_vec` to `bytes_vectored` and `bytes_vec_mut` to `bytes_vectored_mut`.
This commit is contained in:
+3
-2
@@ -3,7 +3,8 @@ dist: trusty
|
|||||||
language: rust
|
language: rust
|
||||||
services: docker
|
services: docker
|
||||||
sudo: required
|
sudo: required
|
||||||
rust: stable
|
#rust: stable
|
||||||
|
rust: beta # we need 1.36, which is still beta
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
@@ -19,7 +20,7 @@ matrix:
|
|||||||
#
|
#
|
||||||
# This job will also build and deploy the docs to gh-pages.
|
# This job will also build and deploy the docs to gh-pages.
|
||||||
- env: TARGET=x86_64-unknown-linux-gnu
|
- env: TARGET=x86_64-unknown-linux-gnu
|
||||||
rust: 1.28.0
|
#rust: 1.36.0 (not stable yet)
|
||||||
after_success:
|
after_success:
|
||||||
- |
|
- |
|
||||||
pip install 'travis-cargo<0.2' --user &&
|
pip install 'travis-cargo<0.2' --user &&
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ features = ["i128"]
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
byteorder = "1.1.0"
|
byteorder = "1.1.0"
|
||||||
iovec = { git = "https://github.com/carllerche/iovec" }
|
|
||||||
serde = { version = "1.0", optional = true }
|
serde = { version = "1.0", optional = true }
|
||||||
either = { version = "1.5", default-features = false, optional = true }
|
either = { version = "1.5", default-features = false, optional = true }
|
||||||
|
|
||||||
|
|||||||
+11
-12
@@ -1,8 +1,7 @@
|
|||||||
use super::{IntoBuf, Take, Reader, FromBuf, Chain};
|
use super::{IntoBuf, Take, Reader, FromBuf, Chain};
|
||||||
use byteorder::{BigEndian, ByteOrder, LittleEndian};
|
use byteorder::{BigEndian, ByteOrder, LittleEndian};
|
||||||
use iovec::IoVec;
|
|
||||||
|
|
||||||
use std::{cmp, ptr};
|
use std::{cmp, io::IoSlice, ptr};
|
||||||
|
|
||||||
macro_rules! buf_get_impl {
|
macro_rules! buf_get_impl {
|
||||||
($this:ident, $size:expr, $conv:path) => ({
|
($this:ident, $size:expr, $conv:path) => ({
|
||||||
@@ -119,14 +118,14 @@ pub trait Buf {
|
|||||||
/// Fills `dst` with potentially multiple slices starting at `self`'s
|
/// Fills `dst` with potentially multiple slices starting at `self`'s
|
||||||
/// current position.
|
/// current position.
|
||||||
///
|
///
|
||||||
/// If the `Buf` is backed by disjoint slices of bytes, `bytes_vec` enables
|
/// If the `Buf` is backed by disjoint slices of bytes, `bytes_vectored` enables
|
||||||
/// fetching more than one slice at once. `dst` is a slice of `IoVec`
|
/// fetching more than one slice at once. `dst` is a slice of `IoSlice`
|
||||||
/// references, enabling the slice to be directly used with [`writev`]
|
/// references, enabling the slice to be directly used with [`writev`]
|
||||||
/// without any further conversion. The sum of the lengths of all the
|
/// without any further conversion. The sum of the lengths of all the
|
||||||
/// buffers in `dst` will be less than or equal to `Buf::remaining()`.
|
/// buffers in `dst` will be less than or equal to `Buf::remaining()`.
|
||||||
///
|
///
|
||||||
/// The entries in `dst` will be overwritten, but the data **contained** by
|
/// The entries in `dst` will be overwritten, but the data **contained** by
|
||||||
/// the slices **will not** be modified. If `bytes_vec` does not fill every
|
/// the slices **will not** be modified. If `bytes_vectored` does not fill every
|
||||||
/// entry in `dst`, then `dst` is guaranteed to contain all remaining slices
|
/// entry in `dst`, then `dst` is guaranteed to contain all remaining slices
|
||||||
/// in `self.
|
/// in `self.
|
||||||
///
|
///
|
||||||
@@ -136,20 +135,20 @@ pub trait Buf {
|
|||||||
/// # Implementer notes
|
/// # Implementer notes
|
||||||
///
|
///
|
||||||
/// This function should never panic. Once the end of the buffer is reached,
|
/// This function should never panic. Once the end of the buffer is reached,
|
||||||
/// i.e., `Buf::remaining` returns 0, calls to `bytes_vec` must return 0
|
/// i.e., `Buf::remaining` returns 0, calls to `bytes_vectored` must return 0
|
||||||
/// without mutating `dst`.
|
/// without mutating `dst`.
|
||||||
///
|
///
|
||||||
/// Implementations should also take care to properly handle being called
|
/// Implementations should also take care to properly handle being called
|
||||||
/// with `dst` being a zero length slice.
|
/// with `dst` being a zero length slice.
|
||||||
///
|
///
|
||||||
/// [`writev`]: http://man7.org/linux/man-pages/man2/readv.2.html
|
/// [`writev`]: http://man7.org/linux/man-pages/man2/readv.2.html
|
||||||
fn bytes_vec<'a>(&'a self, dst: &mut [IoVec<'a>]) -> usize {
|
fn bytes_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize {
|
||||||
if dst.is_empty() {
|
if dst.is_empty() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.has_remaining() {
|
if self.has_remaining() {
|
||||||
dst[0] = self.bytes().into();
|
dst[0] = IoSlice::new(self.bytes());
|
||||||
1
|
1
|
||||||
} else {
|
} else {
|
||||||
0
|
0
|
||||||
@@ -926,8 +925,8 @@ impl<'a, T: Buf + ?Sized> Buf for &'a mut T {
|
|||||||
(**self).bytes()
|
(**self).bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bytes_vec<'b>(&'b self, dst: &mut [IoVec<'b>]) -> usize {
|
fn bytes_vectored<'b>(&'b self, dst: &mut [IoSlice<'b>]) -> usize {
|
||||||
(**self).bytes_vec(dst)
|
(**self).bytes_vectored(dst)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn advance(&mut self, cnt: usize) {
|
fn advance(&mut self, cnt: usize) {
|
||||||
@@ -944,8 +943,8 @@ impl<T: Buf + ?Sized> Buf for Box<T> {
|
|||||||
(**self).bytes()
|
(**self).bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bytes_vec<'b>(&'b self, dst: &mut [IoVec<'b>]) -> usize {
|
fn bytes_vectored<'b>(&'b self, dst: &mut [IoSlice<'b>]) -> usize {
|
||||||
(**self).bytes_vec(dst)
|
(**self).bytes_vectored(dst)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn advance(&mut self, cnt: usize) {
|
fn advance(&mut self, cnt: usize) {
|
||||||
|
|||||||
+11
-12
@@ -1,8 +1,7 @@
|
|||||||
use super::{IntoBuf, Writer};
|
use super::{IntoBuf, Writer};
|
||||||
use byteorder::{LittleEndian, ByteOrder, BigEndian};
|
use byteorder::{LittleEndian, ByteOrder, BigEndian};
|
||||||
use iovec::IoVecMut;
|
|
||||||
|
|
||||||
use std::{cmp, ptr, usize};
|
use std::{cmp, io::IoSliceMut, ptr, usize};
|
||||||
|
|
||||||
/// A trait for values that provide sequential write access to bytes.
|
/// A trait for values that provide sequential write access to bytes.
|
||||||
///
|
///
|
||||||
@@ -162,15 +161,15 @@ pub trait BufMut {
|
|||||||
/// Fills `dst` with potentially multiple mutable slices starting at `self`'s
|
/// Fills `dst` with potentially multiple mutable slices starting at `self`'s
|
||||||
/// current position.
|
/// current position.
|
||||||
///
|
///
|
||||||
/// If the `BufMut` is backed by disjoint slices of bytes, `bytes_vec_mut`
|
/// If the `BufMut` is backed by disjoint slices of bytes, `bytes_vectored_mut`
|
||||||
/// enables fetching more than one slice at once. `dst` is a slice of
|
/// enables fetching more than one slice at once. `dst` is a slice of
|
||||||
/// mutable `IoVec` references, enabling the slice to be directly used with
|
/// mutable `IoSliceMut` references, enabling the slice to be directly used with
|
||||||
/// [`readv`] without any further conversion. The sum of the lengths of all
|
/// [`readv`] without any further conversion. The sum of the lengths of all
|
||||||
/// the buffers in `dst` will be less than or equal to
|
/// the buffers in `dst` will be less than or equal to
|
||||||
/// `Buf::remaining_mut()`.
|
/// `Buf::remaining_mut()`.
|
||||||
///
|
///
|
||||||
/// The entries in `dst` will be overwritten, but the data **contained** by
|
/// The entries in `dst` will be overwritten, but the data **contained** by
|
||||||
/// the slices **will not** be modified. If `bytes_vec_mut` does not fill every
|
/// the slices **will not** be modified. If `bytes_vectored_mut` does not fill every
|
||||||
/// entry in `dst`, then `dst` is guaranteed to contain all remaining slices
|
/// entry in `dst`, then `dst` is guaranteed to contain all remaining slices
|
||||||
/// in `self.
|
/// in `self.
|
||||||
///
|
///
|
||||||
@@ -180,20 +179,20 @@ pub trait BufMut {
|
|||||||
/// # Implementer notes
|
/// # Implementer notes
|
||||||
///
|
///
|
||||||
/// This function should never panic. Once the end of the buffer is reached,
|
/// This function should never panic. Once the end of the buffer is reached,
|
||||||
/// i.e., `BufMut::remaining_mut` returns 0, calls to `bytes_vec_mut` must
|
/// i.e., `BufMut::remaining_mut` returns 0, calls to `bytes_vectored_mut` must
|
||||||
/// return 0 without mutating `dst`.
|
/// return 0 without mutating `dst`.
|
||||||
///
|
///
|
||||||
/// Implementations should also take care to properly handle being called
|
/// Implementations should also take care to properly handle being called
|
||||||
/// with `dst` being a zero length slice.
|
/// with `dst` being a zero length slice.
|
||||||
///
|
///
|
||||||
/// [`readv`]: http://man7.org/linux/man-pages/man2/readv.2.html
|
/// [`readv`]: http://man7.org/linux/man-pages/man2/readv.2.html
|
||||||
unsafe fn bytes_vec_mut<'a>(&'a mut self, dst: &mut [IoVecMut<'a>]) -> usize {
|
unsafe fn bytes_vectored_mut<'a>(&'a mut self, dst: &mut [IoSliceMut<'a>]) -> usize {
|
||||||
if dst.is_empty() {
|
if dst.is_empty() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.has_remaining_mut() {
|
if self.has_remaining_mut() {
|
||||||
dst[0] = self.bytes_mut().into();
|
dst[0] = IoSliceMut::new(self.bytes_mut());
|
||||||
1
|
1
|
||||||
} else {
|
} else {
|
||||||
0
|
0
|
||||||
@@ -989,8 +988,8 @@ impl<'a, T: BufMut + ?Sized> BufMut for &'a mut T {
|
|||||||
(**self).bytes_mut()
|
(**self).bytes_mut()
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn bytes_vec_mut<'b>(&'b mut self, dst: &mut [IoVecMut<'b>]) -> usize {
|
unsafe fn bytes_vectored_mut<'b>(&'b mut self, dst: &mut [IoSliceMut<'b>]) -> usize {
|
||||||
(**self).bytes_vec_mut(dst)
|
(**self).bytes_vectored_mut(dst)
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn advance_mut(&mut self, cnt: usize) {
|
unsafe fn advance_mut(&mut self, cnt: usize) {
|
||||||
@@ -1007,8 +1006,8 @@ impl<T: BufMut + ?Sized> BufMut for Box<T> {
|
|||||||
(**self).bytes_mut()
|
(**self).bytes_mut()
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn bytes_vec_mut<'b>(&'b mut self, dst: &mut [IoVecMut<'b>]) -> usize {
|
unsafe fn bytes_vectored_mut<'b>(&'b mut self, dst: &mut [IoSliceMut<'b>]) -> usize {
|
||||||
(**self).bytes_vec_mut(dst)
|
(**self).bytes_vectored_mut(dst)
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn advance_mut(&mut self, cnt: usize) {
|
unsafe fn advance_mut(&mut self, cnt: usize) {
|
||||||
|
|||||||
+7
-7
@@ -1,6 +1,6 @@
|
|||||||
use {Buf, BufMut};
|
use {Buf, BufMut};
|
||||||
use buf::IntoIter;
|
use buf::IntoIter;
|
||||||
use iovec::{IoVec, IoVecMut};
|
use std::io::{IoSlice, IoSliceMut};
|
||||||
|
|
||||||
/// A `Chain` sequences two buffers.
|
/// A `Chain` sequences two buffers.
|
||||||
///
|
///
|
||||||
@@ -178,9 +178,9 @@ impl<T, U> Buf for Chain<T, U>
|
|||||||
self.b.advance(cnt);
|
self.b.advance(cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bytes_vec<'a>(&'a self, dst: &mut [IoVec<'a>]) -> usize {
|
fn bytes_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize {
|
||||||
let mut n = self.a.bytes_vec(dst);
|
let mut n = self.a.bytes_vectored(dst);
|
||||||
n += self.b.bytes_vec(&mut dst[n..]);
|
n += self.b.bytes_vectored(&mut dst[n..]);
|
||||||
n
|
n
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -219,9 +219,9 @@ impl<T, U> BufMut for Chain<T, U>
|
|||||||
self.b.advance_mut(cnt);
|
self.b.advance_mut(cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn bytes_vec_mut<'a>(&'a mut self, dst: &mut [IoVecMut<'a>]) -> usize {
|
unsafe fn bytes_vectored_mut<'a>(&'a mut self, dst: &mut [IoSliceMut<'a>]) -> usize {
|
||||||
let mut n = self.a.bytes_vec_mut(dst);
|
let mut n = self.a.bytes_vectored_mut(dst);
|
||||||
n += self.b.bytes_vec_mut(&mut dst[n..]);
|
n += self.b.bytes_vectored_mut(&mut dst[n..]);
|
||||||
n
|
n
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-7
@@ -4,7 +4,7 @@ use {Buf, BufMut};
|
|||||||
|
|
||||||
use self::either::Either;
|
use self::either::Either;
|
||||||
use self::either::Either::*;
|
use self::either::Either::*;
|
||||||
use iovec::{IoVec, IoVecMut};
|
use std::io::{IoSlice, IoSliceMut};
|
||||||
|
|
||||||
impl<L, R> Buf for Either<L, R>
|
impl<L, R> Buf for Either<L, R>
|
||||||
where
|
where
|
||||||
@@ -25,10 +25,10 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bytes_vec<'a>(&'a self, dst: &mut [IoVec<'a>]) -> usize {
|
fn bytes_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize {
|
||||||
match *self {
|
match *self {
|
||||||
Left(ref b) => b.bytes_vec(dst),
|
Left(ref b) => b.bytes_vectored(dst),
|
||||||
Right(ref b) => b.bytes_vec(dst),
|
Right(ref b) => b.bytes_vectored(dst),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,10 +66,10 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn bytes_vec_mut<'a>(&'a mut self, dst: &mut [IoVecMut<'a>]) -> usize {
|
unsafe fn bytes_vectored_mut<'a>(&'a mut self, dst: &mut [IoSliceMut<'a>]) -> usize {
|
||||||
match *self {
|
match *self {
|
||||||
Left(ref mut b) => b.bytes_vec_mut(dst),
|
Left(ref mut b) => b.bytes_vectored_mut(dst),
|
||||||
Right(ref mut b) => b.bytes_vec_mut(dst),
|
Right(ref mut b) => b.bytes_vectored_mut(dst),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,6 @@
|
|||||||
#![doc(html_root_url = "https://docs.rs/bytes/0.5.0")]
|
#![doc(html_root_url = "https://docs.rs/bytes/0.5.0")]
|
||||||
|
|
||||||
extern crate byteorder;
|
extern crate byteorder;
|
||||||
extern crate iovec;
|
|
||||||
|
|
||||||
pub mod buf;
|
pub mod buf;
|
||||||
pub use buf::{
|
pub use buf::{
|
||||||
|
|||||||
+5
-7
@@ -1,9 +1,8 @@
|
|||||||
extern crate bytes;
|
extern crate bytes;
|
||||||
extern crate byteorder;
|
extern crate byteorder;
|
||||||
extern crate iovec;
|
|
||||||
|
|
||||||
use bytes::Buf;
|
use bytes::Buf;
|
||||||
use iovec::IoVec;
|
use std::io::IoSlice;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_fresh_cursor_vec() {
|
fn test_fresh_cursor_vec() {
|
||||||
@@ -48,11 +47,10 @@ fn test_get_u16_buffer_underflow() {
|
|||||||
fn test_bufs_vec() {
|
fn test_bufs_vec() {
|
||||||
let buf = &b"hello world"[..];
|
let buf = &b"hello world"[..];
|
||||||
|
|
||||||
let b1: &[u8] = &mut [0];
|
let b1: &[u8] = &mut [];
|
||||||
let b2: &[u8] = &mut [0];
|
let b2: &[u8] = &mut [];
|
||||||
|
|
||||||
let mut dst: [IoVec; 2] =
|
let mut dst = [IoSlice::new(b1), IoSlice::new(b2)];
|
||||||
[b1.into(), b2.into()];
|
|
||||||
|
|
||||||
assert_eq!(1, buf.bytes_vec(&mut dst[..]));
|
assert_eq!(1, buf.bytes_vectored(&mut dst[..]));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
extern crate bytes;
|
extern crate bytes;
|
||||||
extern crate byteorder;
|
extern crate byteorder;
|
||||||
extern crate iovec;
|
|
||||||
|
|
||||||
use bytes::{BufMut, BytesMut};
|
use bytes::{BufMut, BytesMut};
|
||||||
use iovec::IoVecMut;
|
|
||||||
use std::usize;
|
use std::usize;
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
|
use std::io::IoSliceMut;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_vec_as_mut_buf() {
|
fn test_vec_as_mut_buf() {
|
||||||
@@ -72,13 +71,13 @@ fn test_clone() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_bufs_vec_mut() {
|
fn test_bufs_vec_mut() {
|
||||||
use std::mem;
|
|
||||||
|
|
||||||
let mut buf = BytesMut::from(&b"hello world"[..]);
|
let mut buf = BytesMut::from(&b"hello world"[..]);
|
||||||
|
let b1: &mut [u8] = &mut [];
|
||||||
|
let b2: &mut [u8] = &mut [];
|
||||||
|
let mut dst = [IoSliceMut::new(b1), IoSliceMut::new(b2)];
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut dst: [IoVecMut; 2] = mem::zeroed();
|
assert_eq!(1, buf.bytes_vectored_mut(&mut dst[..]));
|
||||||
assert_eq!(1, buf.bytes_vec_mut(&mut dst[..]));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+55
-40
@@ -1,9 +1,8 @@
|
|||||||
extern crate bytes;
|
extern crate bytes;
|
||||||
extern crate iovec;
|
|
||||||
|
|
||||||
use bytes::{Buf, BufMut, Bytes, BytesMut};
|
use bytes::{Buf, BufMut, Bytes, BytesMut};
|
||||||
use bytes::buf::Chain;
|
use bytes::buf::Chain;
|
||||||
use iovec::IoVec;
|
use std::io::IoSlice;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn collect_two_bufs() {
|
fn collect_two_bufs() {
|
||||||
@@ -54,68 +53,84 @@ fn vectored_read() {
|
|||||||
let mut buf = a.chain(b);
|
let mut buf = a.chain(b);
|
||||||
|
|
||||||
{
|
{
|
||||||
let b1: &[u8] = &mut [0];
|
let b1: &[u8] = &mut [];
|
||||||
let b2: &[u8] = &mut [0];
|
let b2: &[u8] = &mut [];
|
||||||
let b3: &[u8] = &mut [0];
|
let b3: &[u8] = &mut [];
|
||||||
let b4: &[u8] = &mut [0];
|
let b4: &[u8] = &mut [];
|
||||||
let mut iovecs: [IoVec; 4] =
|
let mut iovecs = [
|
||||||
[b1.into(), b2.into(), b3.into(), b4.into()];
|
IoSlice::new(b1),
|
||||||
|
IoSlice::new(b2),
|
||||||
|
IoSlice::new(b3),
|
||||||
|
IoSlice::new(b4),
|
||||||
|
];
|
||||||
|
|
||||||
assert_eq!(2, buf.bytes_vec(&mut iovecs));
|
assert_eq!(2, buf.bytes_vectored(&mut iovecs));
|
||||||
assert_eq!(iovecs[0][..], b"hello"[..]);
|
assert_eq!(iovecs[0][..], b"hello"[..]);
|
||||||
assert_eq!(iovecs[1][..], b"world"[..]);
|
assert_eq!(iovecs[1][..], b"world"[..]);
|
||||||
assert_eq!(iovecs[2][..], b"\0"[..]);
|
assert_eq!(iovecs[2][..], b""[..]);
|
||||||
assert_eq!(iovecs[3][..], b"\0"[..]);
|
assert_eq!(iovecs[3][..], b""[..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf.advance(2);
|
buf.advance(2);
|
||||||
|
|
||||||
{
|
{
|
||||||
let b1: &[u8] = &mut [0];
|
let b1: &[u8] = &mut [];
|
||||||
let b2: &[u8] = &mut [0];
|
let b2: &[u8] = &mut [];
|
||||||
let b3: &[u8] = &mut [0];
|
let b3: &[u8] = &mut [];
|
||||||
let b4: &[u8] = &mut [0];
|
let b4: &[u8] = &mut [];
|
||||||
let mut iovecs: [IoVec; 4] =
|
let mut iovecs = [
|
||||||
[b1.into(), b2.into(), b3.into(), b4.into()];
|
IoSlice::new(b1),
|
||||||
|
IoSlice::new(b2),
|
||||||
|
IoSlice::new(b3),
|
||||||
|
IoSlice::new(b4),
|
||||||
|
];
|
||||||
|
|
||||||
assert_eq!(2, buf.bytes_vec(&mut iovecs));
|
assert_eq!(2, buf.bytes_vectored(&mut iovecs));
|
||||||
assert_eq!(iovecs[0][..], b"llo"[..]);
|
assert_eq!(iovecs[0][..], b"llo"[..]);
|
||||||
assert_eq!(iovecs[1][..], b"world"[..]);
|
assert_eq!(iovecs[1][..], b"world"[..]);
|
||||||
assert_eq!(iovecs[2][..], b"\0"[..]);
|
assert_eq!(iovecs[2][..], b""[..]);
|
||||||
assert_eq!(iovecs[3][..], b"\0"[..]);
|
assert_eq!(iovecs[3][..], b""[..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf.advance(3);
|
buf.advance(3);
|
||||||
|
|
||||||
{
|
{
|
||||||
let b1: &[u8] = &mut [0];
|
let b1: &[u8] = &mut [];
|
||||||
let b2: &[u8] = &mut [0];
|
let b2: &[u8] = &mut [];
|
||||||
let b3: &[u8] = &mut [0];
|
let b3: &[u8] = &mut [];
|
||||||
let b4: &[u8] = &mut [0];
|
let b4: &[u8] = &mut [];
|
||||||
let mut iovecs: [IoVec; 4] =
|
let mut iovecs = [
|
||||||
[b1.into(), b2.into(), b3.into(), b4.into()];
|
IoSlice::new(b1),
|
||||||
|
IoSlice::new(b2),
|
||||||
|
IoSlice::new(b3),
|
||||||
|
IoSlice::new(b4),
|
||||||
|
];
|
||||||
|
|
||||||
assert_eq!(1, buf.bytes_vec(&mut iovecs));
|
assert_eq!(1, buf.bytes_vectored(&mut iovecs));
|
||||||
assert_eq!(iovecs[0][..], b"world"[..]);
|
assert_eq!(iovecs[0][..], b"world"[..]);
|
||||||
assert_eq!(iovecs[1][..], b"\0"[..]);
|
assert_eq!(iovecs[1][..], b""[..]);
|
||||||
assert_eq!(iovecs[2][..], b"\0"[..]);
|
assert_eq!(iovecs[2][..], b""[..]);
|
||||||
assert_eq!(iovecs[3][..], b"\0"[..]);
|
assert_eq!(iovecs[3][..], b""[..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf.advance(3);
|
buf.advance(3);
|
||||||
|
|
||||||
{
|
{
|
||||||
let b1: &[u8] = &mut [0];
|
let b1: &[u8] = &mut [];
|
||||||
let b2: &[u8] = &mut [0];
|
let b2: &[u8] = &mut [];
|
||||||
let b3: &[u8] = &mut [0];
|
let b3: &[u8] = &mut [];
|
||||||
let b4: &[u8] = &mut [0];
|
let b4: &[u8] = &mut [];
|
||||||
let mut iovecs: [IoVec; 4] =
|
let mut iovecs = [
|
||||||
[b1.into(), b2.into(), b3.into(), b4.into()];
|
IoSlice::new(b1),
|
||||||
|
IoSlice::new(b2),
|
||||||
|
IoSlice::new(b3),
|
||||||
|
IoSlice::new(b4),
|
||||||
|
];
|
||||||
|
|
||||||
assert_eq!(1, buf.bytes_vec(&mut iovecs));
|
assert_eq!(1, buf.bytes_vectored(&mut iovecs));
|
||||||
assert_eq!(iovecs[0][..], b"ld"[..]);
|
assert_eq!(iovecs[0][..], b"ld"[..]);
|
||||||
assert_eq!(iovecs[1][..], b"\0"[..]);
|
assert_eq!(iovecs[1][..], b""[..]);
|
||||||
assert_eq!(iovecs[2][..], b"\0"[..]);
|
assert_eq!(iovecs[2][..], b""[..]);
|
||||||
assert_eq!(iovecs[3][..], b"\0"[..]);
|
assert_eq!(iovecs[3][..], b""[..]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user