mirror of
https://github.com/tokio-rs/bytes.git
synced 2026-08-08 00:00:26 +02:00
48 lines
1.0 KiB
Rust
48 lines
1.0 KiB
Rust
use bytes::*;
|
|
use std::io;
|
|
|
|
#[test]
|
|
pub fn test_filling_buf_from_reader() {
|
|
let mut reader = chunks(vec![b"foo", b"bar", b"baz"]);
|
|
let mut buf = ByteBuf::mut_with_capacity(1024);
|
|
|
|
assert_eq!(9, buf.write(&mut reader).unwrap());
|
|
assert_eq!(b"foobarbaz".to_bytes(), buf.flip().to_bytes());
|
|
}
|
|
|
|
fn chunks(chunks: Vec<&'static [u8]>) -> Chunked {
|
|
Chunked { chunks: chunks }
|
|
}
|
|
|
|
struct Chunked {
|
|
chunks: Vec<&'static [u8]>,
|
|
}
|
|
|
|
impl io::Read for Chunked {
|
|
fn read(&mut self, dst: &mut [u8]) -> io::Result<usize> {
|
|
use std::{cmp, ptr};
|
|
|
|
if self.chunks.is_empty() {
|
|
return Ok(0);
|
|
}
|
|
|
|
let src = self.chunks[0];
|
|
let len = cmp::min(src.len(), dst.len());
|
|
|
|
unsafe {
|
|
ptr::copy_nonoverlapping(
|
|
src[..len].as_ptr(),
|
|
dst[..len].as_mut_ptr(),
|
|
len);
|
|
}
|
|
|
|
if len < src.len() {
|
|
self.chunks[0] = &src[len..];
|
|
} else {
|
|
self.chunks.remove(0);
|
|
}
|
|
|
|
Ok(len)
|
|
}
|
|
}
|