Skip to content
Snippets Groups Projects
lib.rs 3.07 KiB
Newer Older
  • Learn to ignore specific revisions
  • //! Provides abstractions for working with bytes.
    
    Carl Lerche's avatar
    Carl Lerche committed
    //!
    //! The `bytes` crate provides an efficient byte buffer structure
    //! ([`Bytes`](struct.Bytes.html)) and traits for working with buffer
    
    Carl Lerche's avatar
    Carl Lerche committed
    //! implementations ([`Buf`], [`BufMut`]).
    //!
    //! [`Buf`]: trait.Buf.html
    //! [`BufMut`]: trait.BufMut.html
    
    Carl Lerche's avatar
    Carl Lerche committed
    //!
    //! # `Bytes`
    //!
    //! `Bytes` is an efficient container for storing and operating on continguous
    //! 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.
    //!
    
    //! A `Bytes` handle can be created directly from an existing byte store (such as `&[u8]`
    //! or `Vec<u8>`), but usually a `BytesMut` is used first and written to. For
    
    Carl Lerche's avatar
    Carl Lerche committed
    //! example:
    //!
    //! ```rust
    
    //! use bytes::{BytesMut, BufMut};
    
    Carl Lerche's avatar
    Carl Lerche committed
    //!
    //! let mut buf = BytesMut::with_capacity(1024);
    //! buf.put(&b"hello world"[..]);
    
    Carl Lerche's avatar
    Carl Lerche committed
    //!
    
    Carl Lerche's avatar
    Carl Lerche committed
    //! assert_eq!(a, b"hello world\x04\xD2"[..]);
    //!
    //! buf.put(&b"goodbye world"[..]);
    //!
    
    Carl Lerche's avatar
    Carl Lerche committed
    //! assert_eq!(b, b"goodbye world"[..]);
    //!
    //! assert_eq!(buf.capacity(), 998);
    //! ```
    //!
    //! In the above example, only a single buffer of 1024 is allocated. The handles
    //! `a` and `b` will share the underlying buffer and maintain indices tracking
    //! the view into the buffer represented by the handle.
    //!
    //! See the [struct docs] for more details.
    //!
    //! [struct docs]: struct.Bytes.html
    
    Carl Lerche's avatar
    Carl Lerche committed
    //!
    //! # `Buf`, `BufMut`
    //!
    //! These two traits provide read and write access to buffers. The underlying
    //! storage may or may not be in contiguous memory. For example, `Bytes` is a
    
    Carl Lerche's avatar
    Carl Lerche committed
    //! buffer that guarantees contiguous memory, but a [rope] stores the bytes in
    //! disjoint chunks. `Buf` and `BufMut` maintain cursors tracking the current
    
    Carl Lerche's avatar
    Carl Lerche committed
    //! position in the underlying byte storage. When bytes are read or written, the
    //! cursor is advanced.
    //!
    
    Carl Lerche's avatar
    Carl Lerche committed
    //! [rope]: https://en.wikipedia.org/wiki/Rope_(data_structure)
    //!
    
    Carl Lerche's avatar
    Carl Lerche committed
    //! ## Relation with `Read` and `Write`
    //!
    //! At first glance, it may seem that `Buf` and `BufMut` overlap in
    
    Jack O'Connor's avatar
    Jack O'Connor committed
    //! functionality with `std::io::Read` and `std::io::Write`. However, they
    
    Carl Lerche's avatar
    Carl Lerche committed
    //! serve different purposes. A buffer is the value that is provided as an
    //! argument to `Read::read` and `Write::write`. `Read` and `Write` may then
    //! perform a syscall, which has the potential of failing. Operations on `Buf`
    //! and `BufMut` are infallible.
    
    #![deny(warnings, missing_docs, missing_debug_implementations)]
    
    Carl Lerche's avatar
    Carl Lerche committed
    #![doc(html_root_url = "https://docs.rs/bytes/0.5.0")]
    
    extern crate byteorder;
    
    extern crate iovec;
    
    pub use buf::{
        Buf,
        BufMut,
        IntoBuf,
    
    };
    #[deprecated(since = "0.4.1", note = "moved to `buf` module")]
    #[doc(hidden)]
    pub use buf::{
    
        Reader,
        Writer,
    
    Carl Lerche's avatar
    Carl Lerche committed
        Take,
    
    pub use bytes::{Bytes, BytesMut};
    
    // Optional Serde support
    #[cfg(feature = "serde")]
    #[doc(hidden)]
    pub mod serde;