mirror of
https://github.com/tokio-rs/bytes.git
synced 2026-08-26 00:00:20 +02:00
Improve Buf/MutBuf impl for Cursor
This commit is contained in:
+27
-21
@@ -321,23 +321,46 @@ impl fmt::Debug for Box<Buf+Send+'static> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Buf for io::Cursor<Vec<u8>> {
|
impl<T: AsRef<[u8]>> Buf for io::Cursor<T> {
|
||||||
fn remaining(&self) -> usize {
|
fn remaining(&self) -> usize {
|
||||||
self.get_ref().len() - self.position() as usize
|
self.get_ref().as_ref().len() - self.position() as usize
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bytes(&self) -> &[u8] {
|
fn bytes(&self) -> &[u8] {
|
||||||
let pos = self.position() as usize;
|
let pos = self.position() as usize;
|
||||||
&(&self.get_ref())[pos..]
|
&(self.get_ref().as_ref())[pos..]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn advance(&mut self, cnt: usize) {
|
fn advance(&mut self, cnt: usize) {
|
||||||
let pos = self.position() as usize;
|
let pos = self.position() as usize;
|
||||||
let pos = cmp::min(self.get_ref().len(), pos + cnt);
|
let pos = cmp::min(self.get_ref().as_ref().len(), pos + cnt);
|
||||||
self.set_position(pos as u64);
|
self.set_position(pos as u64);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: AsMut<[u8]> + AsRef<[u8]>> MutBuf for io::Cursor<T> {
|
||||||
|
|
||||||
|
fn remaining(&self) -> usize {
|
||||||
|
self.get_ref().as_ref().len() - self.position() as usize
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Advance the internal cursor of the MutBuf
|
||||||
|
unsafe fn advance(&mut self, cnt: usize) {
|
||||||
|
let pos = self.position() as usize;
|
||||||
|
let pos = cmp::min(self.get_mut().as_mut().len(), pos + cnt);
|
||||||
|
self.set_position(pos as u64);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a mutable slice starting at the current MutBuf position and of
|
||||||
|
/// length between 0 and `MutBuf::remaining()`.
|
||||||
|
///
|
||||||
|
/// The returned byte slice may represent uninitialized memory.
|
||||||
|
unsafe fn mut_bytes<'a>(&'a mut self) -> &'a mut [u8] {
|
||||||
|
let pos = self.position() as usize;
|
||||||
|
&mut (self.get_mut().as_mut())[pos..]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl MutBuf for Vec<u8> {
|
impl MutBuf for Vec<u8> {
|
||||||
fn remaining(&self) -> usize {
|
fn remaining(&self) -> usize {
|
||||||
usize::MAX - self.len()
|
usize::MAX - self.len()
|
||||||
@@ -371,23 +394,6 @@ impl MutBuf for Vec<u8> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Buf for io::Cursor<&'a [u8]> {
|
|
||||||
fn remaining(&self) -> usize {
|
|
||||||
self.get_ref().len() - self.position() as usize
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bytes(&self) -> &[u8] {
|
|
||||||
let pos = self.position() as usize;
|
|
||||||
&(&self.get_ref())[pos..]
|
|
||||||
}
|
|
||||||
|
|
||||||
fn advance(&mut self, cnt: usize) {
|
|
||||||
let pos = self.position() as usize;
|
|
||||||
let pos = cmp::min(self.get_ref().len(), pos + cnt);
|
|
||||||
self.set_position(pos as u64);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* ===== Read impls =====
|
* ===== Read impls =====
|
||||||
|
|||||||
+4
-1
@@ -1,9 +1,10 @@
|
|||||||
use bytes::{Buf, MutBuf};
|
|
||||||
use std::usize;
|
use std::usize;
|
||||||
use std::io::{Cursor};
|
use std::io::{Cursor};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn test_fresh_cursor_vec() {
|
pub fn test_fresh_cursor_vec() {
|
||||||
|
use bytes::Buf;
|
||||||
|
|
||||||
let mut buf = Cursor::new(b"hello".to_vec());
|
let mut buf = Cursor::new(b"hello".to_vec());
|
||||||
|
|
||||||
assert_eq!(buf.remaining(), 5);
|
assert_eq!(buf.remaining(), 5);
|
||||||
@@ -27,6 +28,8 @@ pub fn test_fresh_cursor_vec() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn test_vec_as_mut_buf() {
|
pub fn test_vec_as_mut_buf() {
|
||||||
|
use bytes::MutBuf;
|
||||||
|
|
||||||
let mut buf = Vec::with_capacity(64);
|
let mut buf = Vec::with_capacity(64);
|
||||||
|
|
||||||
assert_eq!(buf.remaining(), usize::MAX);
|
assert_eq!(buf.remaining(), usize::MAX);
|
||||||
|
|||||||
Reference in New Issue
Block a user