[−][src]Struct bytes::Bytes
A reference counted contiguous slice of memory.
Bytes is an efficient container for storing and operating on contiguous
slices of memory. It is intended for use primarily in networking code, but
could have applications elsewhere as well.
Bytes values facilitate zero-copy network programming by allowing multiple
Bytes objects to point to the same underlying memory. This is managed by
using a reference count to track when the memory is no longer needed and can
be freed.
use bytes::Bytes; let mut mem = Bytes::from(&b"Hello world"[..]); let a = mem.slice(0, 5); assert_eq!(&a[..], b"Hello"); let b = mem.split_to(6); assert_eq!(&mem[..], b"world"); assert_eq!(&b[..], b"Hello ");
Memory layout
The Bytes struct itself is fairly small, limited to a pointer to the
memory and 4 usize fields used to track information about which segment of
the underlying memory the Bytes handle has access to.
The memory layout looks like this:
+-------+
| Bytes |
+-------+
/ \_____
| \
v v
+-----+------------------------------------+
| Arc | | Data | |
+-----+------------------------------------+
Bytes keeps both a pointer to the shared Arc containing the full memory
slice and a pointer to the start of the region visible by the handle.
Bytes also tracks the length of its view into the memory.
Sharing
The memory itself is reference counted, and multiple Bytes objects may
point to the same region. Each Bytes handle point to different sections within
the memory region, and Bytes handle may or may not have overlapping views
into the memory.
Arc ptrs +---------+
________________________ / | Bytes 2 |
/ +---------+
/ +-----------+ | |
|_________/ | Bytes 1 | | |
| +-----------+ | |
| | | ___/ data | tail
| data | tail |/ |
v v v v
+-----+---------------------------------+-----+
| Arc | | | | |
+-----+---------------------------------+-----+
Mutating
While Bytes handles may potentially represent overlapping views of the
underlying memory slice and may not be mutated, BytesMut handles are
guaranteed to be the only handle able to view that slice of memory. As such,
BytesMut handles are able to mutate the underlying memory. Note that
holding a unique view to a region of memory does not mean that there are no
other Bytes and BytesMut handles with disjoint views of the underlying
memory.
Inline bytes
As an optimization, when the slice referenced by a Bytes or BytesMut
handle is small enough 1, with_capacity will avoid the allocation by
inlining the slice directly in the handle. In this case, a clone is no
longer "shallow" and the data will be copied. Converting from a Vec will
never use inlining.
Small enough: 31 bytes on 64 bit systems, 15 on 32 bit systems. ↩
Implementations
impl Bytes[src]
pub fn with_capacity(capacity: usize) -> Bytes[src]
Creates a new Bytes with the specified capacity.
The returned Bytes will be able to hold at least capacity bytes
without reallocating. If capacity is under 4 * size_of::<usize>() - 1,
then BytesMut will not allocate.
It is important to note that this function does not specify the length
of the returned Bytes, but only the capacity.
Examples
use bytes::Bytes; let mut bytes = Bytes::with_capacity(64); // `bytes` contains no data, even though there is capacity assert_eq!(bytes.len(), 0); bytes.extend_from_slice(&b"hello world"[..]); assert_eq!(&bytes[..], b"hello world");
pub fn new() -> Bytes[src]
Creates a new empty Bytes.
This will not allocate and the returned Bytes handle will be empty.
Examples
use bytes::Bytes; let b = Bytes::new(); assert_eq!(&b[..], b"");
pub fn from_static(bytes: &'static [u8]) -> Bytes[src]
Creates a new Bytes from a static slice.
The returned Bytes will point directly to the static slice. There is
no allocating or copying.
Examples
use bytes::Bytes; let b = Bytes::from_static(b"hello"); assert_eq!(&b[..], b"hello");
pub fn len(&self) -> usize[src]
Returns the number of bytes contained in this Bytes.
Examples
use bytes::Bytes; let b = Bytes::from(&b"hello"[..]); assert_eq!(b.len(), 5);
pub fn is_empty(&self) -> bool[src]
Returns true if the Bytes has a length of 0.
Examples
use bytes::Bytes; let b = Bytes::new(); assert!(b.is_empty());
pub fn slice(&self, begin: usize, end: usize) -> Bytes[src]
Returns a slice of self for the index range [begin..end).
This will increment the reference count for the underlying memory and
return a new Bytes handle set to the slice.
This operation is O(1).
Examples
use bytes::Bytes; let a = Bytes::from(&b"hello world"[..]); let b = a.slice(2, 5); assert_eq!(&b[..], b"llo");
Panics
Requires that begin <= end and end <= self.len(), otherwise slicing
will panic.
pub fn slice_from(&self, begin: usize) -> Bytes[src]
Returns a slice of self for the index range [begin..self.len()).
This will increment the reference count for the underlying memory and
return a new Bytes handle set to the slice.
This operation is O(1) and is equivalent to self.slice(begin, self.len()).
Examples
use bytes::Bytes; let a = Bytes::from(&b"hello world"[..]); let b = a.slice_from(6); assert_eq!(&b[..], b"world");
Panics
Requires that begin <= self.len(), otherwise slicing will panic.
pub fn slice_to(&self, end: usize) -> Bytes[src]
Returns a slice of self for the index range [0..end).
This will increment the reference count for the underlying memory and
return a new Bytes handle set to the slice.
This operation is O(1) and is equivalent to self.slice(0, end).
Examples
use bytes::Bytes; let a = Bytes::from(&b"hello world"[..]); let b = a.slice_to(5); assert_eq!(&b[..], b"hello");
Panics
Requires that end <= self.len(), otherwise slicing will panic.
pub fn slice_ref(&self, subset: &[u8]) -> Bytes[src]
Returns a slice of self that is equivalent to the given subset.
When processing a Bytes buffer with other tools, one often gets a
&[u8] which is in fact a slice of the Bytes, i.e. a subset of it.
This function turns that &[u8] into another Bytes, as if one had
called self.slice() with the offsets that correspond to subset.
This operation is O(1).
Examples
use bytes::Bytes; let bytes = Bytes::from(&b"012345678"[..]); let as_slice = bytes.as_ref(); let subset = &as_slice[2..6]; let subslice = bytes.slice_ref(&subset); assert_eq!(&subslice[..], b"2345");
Panics
Requires that the given sub slice is in fact contained within the
Bytes buffer; otherwise this function will panic.
pub fn split_off(&mut self, at: usize) -> Bytes[src]
Splits the bytes into two at the given index.
Afterwards self contains elements [0, at), and the returned Bytes
contains elements [at, len).
This is an O(1) operation that just increases the reference count and
sets a few indices.
Examples
use bytes::Bytes; let mut a = Bytes::from(&b"hello world"[..]); let b = a.split_off(5); assert_eq!(&a[..], b"hello"); assert_eq!(&b[..], b" world");
Panics
Panics if at > len.
pub fn split_to(&mut self, at: usize) -> Bytes[src]
Splits the bytes into two at the given index.
Afterwards self contains elements [at, len), and the returned
Bytes contains elements [0, at).
This is an O(1) operation that just increases the reference count and
sets a few indices.
Examples
use bytes::Bytes; let mut a = Bytes::from(&b"hello world"[..]); let b = a.split_to(5); assert_eq!(&a[..], b" world"); assert_eq!(&b[..], b"hello");
Panics
Panics if at > len.
pub fn truncate(&mut self, len: usize)[src]
Shortens the buffer, keeping the first len bytes and dropping the
rest.
If len is greater than the buffer's current length, this has no
effect.
The split_off method can emulate truncate, but this causes the
excess bytes to be returned instead of dropped.
Examples
use bytes::Bytes; let mut buf = Bytes::from(&b"hello world"[..]); buf.truncate(5); assert_eq!(buf, b"hello"[..]);
pub fn advance(&mut self, cnt: usize)[src]
Shortens the buffer, dropping the first cnt bytes and keeping the
rest.
This is the same function as Buf::advance, and in the next breaking
release of bytes, this implementation will be removed in favor of
having Bytes implement Buf.
Panics
This function panics if cnt is greater than self.len()
pub fn clear(&mut self)[src]
Clears the buffer, removing all data.
Examples
use bytes::Bytes; let mut buf = Bytes::from(&b"hello world"[..]); buf.clear(); assert!(buf.is_empty());
pub fn try_mut(self) -> Result<BytesMut, Bytes>[src]
Attempts to convert into a BytesMut handle.
This will only succeed if there are no other outstanding references to
the underlying chunk of memory. Bytes handles that contain inlined
bytes will always be convertable to BytesMut.
Examples
use bytes::Bytes; let a = Bytes::from(&b"Mary had a little lamb, little lamb, little lamb..."[..]); // Create a shallow clone let b = a.clone(); // This will fail because `b` shares a reference with `a` let a = a.try_mut().unwrap_err(); drop(b); // This will succeed let mut a = a.try_mut().unwrap(); a[0] = b'b'; assert_eq!(&a[..4], b"bary");
pub fn extend_from_slice(&mut self, extend: &[u8])[src]
Appends given bytes to this object.
If this Bytes object has not enough capacity, it is resized first.
If it is shared (refcount > 1), it is copied first.
This operation can be less effective than the similar operation on
BytesMut, especially on small additions.
Examples
use bytes::Bytes; let mut buf = Bytes::from("aabb"); buf.extend_from_slice(b"ccdd"); buf.extend_from_slice(b"eeff"); assert_eq!(b"aabbccddeeff", &buf[..]);
Trait Implementations
impl AsRef<[u8]> for Bytes[src]
impl Borrow<[u8]> for Bytes[src]
impl Clone for Bytes[src]
impl Debug for Bytes[src]
impl Default for Bytes[src]
impl Deref for Bytes[src]
impl Eq for Bytes[src]
impl<'a> Extend<&'a u8> for Bytes[src]
fn extend<T>(&mut self, iter: T) where
T: IntoIterator<Item = &'a u8>, [src]
T: IntoIterator<Item = &'a u8>,
fn extend_one(&mut self, item: A)[src]
fn extend_reserve(&mut self, additional: usize)[src]
impl Extend<u8> for Bytes[src]
fn extend<T>(&mut self, iter: T) where
T: IntoIterator<Item = u8>, [src]
T: IntoIterator<Item = u8>,
fn extend_one(&mut self, item: A)[src]
fn extend_reserve(&mut self, additional: usize)[src]
impl<'a> From<&'a [u8]> for Bytes[src]
impl<'a> From<&'a str> for Bytes[src]
impl From<Bytes> for BytesMut[src]
impl From<BytesMut> for Bytes[src]
impl From<String> for Bytes[src]
impl From<Vec<u8>> for Bytes[src]
impl FromBuf for Bytes[src]
impl<'a> FromIterator<&'a u8> for Bytes[src]
fn from_iter<T: IntoIterator<Item = &'a u8>>(into_iter: T) -> Self[src]
impl FromIterator<u8> for Bytes[src]
fn from_iter<T: IntoIterator<Item = u8>>(into_iter: T) -> Self[src]
impl Hash for Bytes[src]
fn hash<H>(&self, state: &mut H) where
H: Hasher, [src]
H: Hasher,
fn hash_slice<H>(data: &[Self], state: &mut H) where
H: Hasher, 1.3.0[src]
H: Hasher,
impl IntoBuf for Bytes[src]
type Buf = Cursor<Self>
The Buf type that self is being converted into
fn into_buf(self) -> Self::Buf[src]
impl<'a> IntoBuf for &'a Bytes[src]
type Buf = Cursor<Self>
The Buf type that self is being converted into
fn into_buf(self) -> Self::Buf[src]
impl IntoIterator for Bytes[src]
type Item = u8
The type of the elements being iterated over.
type IntoIter = Iter<Cursor<Bytes>>
Which kind of iterator are we turning this into?
fn into_iter(self) -> Self::IntoIter[src]
impl<'a> IntoIterator for &'a Bytes[src]
type Item = u8
The type of the elements being iterated over.
type IntoIter = Iter<Cursor<&'a Bytes>>
Which kind of iterator are we turning this into?
fn into_iter(self) -> Self::IntoIter[src]
impl Ord for Bytes[src]
fn cmp(&self, other: &Bytes) -> Ordering[src]
#[must_use]fn max(self, other: Self) -> Self1.21.0[src]
#[must_use]fn min(self, other: Self) -> Self1.21.0[src]
#[must_use]fn clamp(self, min: Self, max: Self) -> Self[src]
impl<'a, T: ?Sized> PartialEq<&'a T> for Bytes where
Bytes: PartialEq<T>, [src]
Bytes: PartialEq<T>,
impl PartialEq<[u8]> for Bytes[src]
impl PartialEq<Bytes> for Bytes[src]
impl PartialEq<Bytes> for [u8][src]
impl PartialEq<Bytes> for str[src]
impl PartialEq<Bytes> for Vec<u8>[src]
impl PartialEq<Bytes> for String[src]
impl<'a> PartialEq<Bytes> for &'a [u8][src]
impl<'a> PartialEq<Bytes> for &'a str[src]
impl PartialEq<Bytes> for BytesMut[src]
impl PartialEq<BytesMut> for Bytes[src]
impl PartialEq<String> for Bytes[src]
impl PartialEq<Vec<u8>> for Bytes[src]
impl PartialEq<str> for Bytes[src]
impl<'a, T: ?Sized> PartialOrd<&'a T> for Bytes where
Bytes: PartialOrd<T>, [src]
Bytes: PartialOrd<T>,
fn partial_cmp(&self, other: &&'a T) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl PartialOrd<[u8]> for Bytes[src]
fn partial_cmp(&self, other: &[u8]) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl PartialOrd<Bytes> for Bytes[src]
fn partial_cmp(&self, other: &Bytes) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl PartialOrd<Bytes> for [u8][src]
fn partial_cmp(&self, other: &Bytes) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl PartialOrd<Bytes> for str[src]
fn partial_cmp(&self, other: &Bytes) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl PartialOrd<Bytes> for Vec<u8>[src]
fn partial_cmp(&self, other: &Bytes) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl PartialOrd<Bytes> for String[src]
fn partial_cmp(&self, other: &Bytes) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl<'a> PartialOrd<Bytes> for &'a [u8][src]
fn partial_cmp(&self, other: &Bytes) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl<'a> PartialOrd<Bytes> for &'a str[src]
fn partial_cmp(&self, other: &Bytes) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl PartialOrd<String> for Bytes[src]
fn partial_cmp(&self, other: &String) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl PartialOrd<Vec<u8>> for Bytes[src]
fn partial_cmp(&self, other: &Vec<u8>) -> Option<Ordering>[src]
#[must_use]fn lt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn le(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn gt(&self, other: &Rhs) -> bool1.0.0[src]
#[must_use]fn ge(&self, other: &Rhs) -> bool1.0.0[src]
impl PartialOrd<str> for Bytes[src]
Auto Trait Implementations
impl RefUnwindSafe for Bytes
impl Send for Bytes
impl Sync for Bytes
impl Unpin for Bytes
impl UnwindSafe for Bytes
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<I> IntoIterator for I where
I: Iterator, [src]
I: Iterator,
type Item = <I as Iterator>::Item
The type of the elements being iterated over.
type IntoIter = I
Which kind of iterator are we turning this into?
fn into_iter(self) -> I[src]
impl<T> ToOwned for T where
T: Clone, [src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T[src]
fn clone_into(&self, target: &mut T)[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,