-
Notifications
You must be signed in to change notification settings - Fork 288
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move "extra" methods to extension traits
- Loading branch information
1 parent
2ac7233
commit fbd17c1
Showing
8 changed files
with
157 additions
and
151 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
//! Extra utilities for `Buf` and `BufMut` types. | ||
|
||
use super::{Buf, BufMut}; | ||
|
||
mod chain; | ||
#[cfg(feature = "std")] | ||
mod reader; | ||
mod take; | ||
#[cfg(feature = "std")] | ||
mod writer; | ||
|
||
use self::take::Take; | ||
use self::chain::Chain; | ||
|
||
#[cfg(feature = "std")] | ||
use self::{reader::Reader, writer::Writer}; | ||
|
||
/// Extra methods for implementations of `Buf`. | ||
pub trait BufExt: Buf { | ||
/// Creates an adaptor which will read at most `limit` bytes from `self`. | ||
/// | ||
/// This function returns a new instance of `Buf` which will read at most | ||
/// `limit` bytes. | ||
/// | ||
/// # Examples | ||
/// | ||
/// ``` | ||
/// use bytes::{Buf, BufMut}; | ||
/// | ||
/// let mut buf = b"hello world"[..].take(5); | ||
/// let mut dst = vec![]; | ||
/// | ||
/// dst.put(&mut buf); | ||
/// assert_eq!(dst, b"hello"); | ||
/// | ||
/// let mut buf = buf.into_inner(); | ||
/// dst.clear(); | ||
/// dst.put(&mut buf); | ||
/// assert_eq!(dst, b" world"); | ||
/// ``` | ||
fn take(self, limit: usize) -> Take<Self> | ||
where Self: Sized | ||
{ | ||
take::new(self, limit) | ||
} | ||
|
||
/// Creates an adaptor which will chain this buffer with another. | ||
/// | ||
/// The returned `Buf` instance will first consume all bytes from `self`. | ||
/// Afterwards the output is equivalent to the output of next. | ||
/// | ||
/// # Examples | ||
/// | ||
/// ``` | ||
/// use bytes::Buf; | ||
/// | ||
/// let mut chain = b"hello "[..].chain(&b"world"[..]); | ||
/// | ||
/// let full = chain.to_bytes(); | ||
/// assert_eq!(full.bytes(), b"hello world"); | ||
/// ``` | ||
fn chain<U: Buf>(self, next: U) -> Chain<Self, U> | ||
where Self: Sized | ||
{ | ||
Chain::new(self, next) | ||
} | ||
|
||
/// Creates a "by reference" adaptor for this instance of `Buf`. | ||
/// | ||
/// The returned adaptor also implements `Buf` and will simply borrow `self`. | ||
/// | ||
/// # Examples | ||
/// | ||
/// ``` | ||
/// use bytes::{Buf, BufMut}; | ||
/// | ||
/// let mut buf = &b"hello world"[..]; | ||
/// let mut dst = vec![]; | ||
/// | ||
/// { | ||
/// let mut reference = buf.by_ref(); | ||
/// dst.put(&mut reference.take(5)); | ||
/// assert_eq!(dst, &b"hello"[..]); | ||
/// } // drop our &mut reference so we can use `buf` again | ||
/// | ||
/// dst.clear(); | ||
/// dst.put(&mut buf); | ||
/// assert_eq!(dst, &b" world"[..]); | ||
/// ``` | ||
fn by_ref(&mut self) -> &mut Self where Self: Sized { | ||
self | ||
} | ||
|
||
/// Creates an adaptor which implements the `Read` trait for `self`. | ||
/// | ||
/// This function returns a new value which implements `Read` by adapting | ||
/// the `Read` trait functions to the `Buf` trait functions. Given that | ||
/// `Buf` operations are infallible, none of the `Read` functions will | ||
/// return with `Err`. | ||
/// | ||
/// # Examples | ||
/// | ||
/// ``` | ||
/// use bytes::{Buf, Bytes}; | ||
/// use std::io::Read; | ||
/// | ||
/// let buf = Bytes::from("hello world"); | ||
/// | ||
/// let mut reader = buf.reader(); | ||
/// let mut dst = [0; 1024]; | ||
/// | ||
/// let num = reader.read(&mut dst).unwrap(); | ||
/// | ||
/// assert_eq!(11, num); | ||
/// assert_eq!(&dst[..11], &b"hello world"[..]); | ||
/// ``` | ||
#[cfg(feature = "std")] | ||
fn reader(self) -> Reader<Self> where Self: Sized { | ||
reader::new(self) | ||
} | ||
} | ||
|
||
impl<B: Buf + ?Sized> BufExt for B {} | ||
|
||
/// Extra methods for implementations of `BufMut`. | ||
pub trait BufMutExt: BufMut { | ||
/// Creates an adaptor which implements the `Write` trait for `self`. | ||
/// | ||
/// This function returns a new value which implements `Write` by adapting | ||
/// the `Write` trait functions to the `BufMut` trait functions. Given that | ||
/// `BufMut` operations are infallible, none of the `Write` functions will | ||
/// return with `Err`. | ||
/// | ||
/// # Examples | ||
/// | ||
/// ``` | ||
/// use bytes::BufMut; | ||
/// use std::io::Write; | ||
/// | ||
/// let mut buf = vec![].writer(); | ||
/// | ||
/// let num = buf.write(&b"hello world"[..]).unwrap(); | ||
/// assert_eq!(11, num); | ||
/// | ||
/// let buf = buf.into_inner(); | ||
/// | ||
/// assert_eq!(*buf, b"hello world"[..]); | ||
/// ``` | ||
#[cfg(feature = "std")] | ||
fn writer(self) -> Writer<Self> where Self: Sized { | ||
writer::new(self) | ||
} | ||
} | ||
|
||
impl<B: BufMut + ?Sized> BufMutExt for B {} |
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters