Files
bytes/src/buf/iter.rs
T

128 lines
2.9 KiB
Rust
Raw Normal View History

2019-07-26 05:01:22 +09:00
use crate::Buf;
2017-03-01 09:28:07 -08:00
/// Iterator over the bytes contained by the buffer.
///
/// # Examples
///
/// Basic usage:
///
/// ```
2020-05-24 06:30:50 +09:00
/// use bytes::Bytes;
2017-03-01 09:28:07 -08:00
///
2019-08-27 22:09:43 +02:00
/// let buf = Bytes::from(&b"abc"[..]);
/// let mut iter = buf.into_iter();
2017-03-01 09:28:07 -08:00
///
/// assert_eq!(iter.next(), Some(b'a'));
/// assert_eq!(iter.next(), Some(b'b'));
/// assert_eq!(iter.next(), Some(b'c'));
/// assert_eq!(iter.next(), None);
/// ```
2017-03-07 10:20:58 -08:00
#[derive(Debug)]
pub struct IntoIter<T> {
2017-03-01 09:28:07 -08:00
inner: T,
}
impl<T> IntoIter<T> {
/// Creates an iterator over the bytes contained by the buffer.
///
/// # Examples
///
/// ```
2020-05-24 06:30:50 +09:00
/// use bytes::Bytes;
///
/// let buf = Bytes::from_static(b"abc");
/// let mut iter = buf.into_iter();
///
/// assert_eq!(iter.next(), Some(b'a'));
/// assert_eq!(iter.next(), Some(b'b'));
/// assert_eq!(iter.next(), Some(b'c'));
/// assert_eq!(iter.next(), None);
/// ```
2022-11-25 22:48:20 +01:00
pub fn new(inner: T) -> IntoIter<T> {
2019-08-27 23:19:44 +02:00
IntoIter { inner }
}
2020-05-24 06:30:50 +09:00
/// Consumes this `IntoIter`, returning the underlying value.
2017-03-01 09:28:07 -08:00
///
/// # Examples
///
/// ```rust
2019-08-27 22:09:43 +02:00
/// use bytes::{Buf, Bytes};
2017-03-01 09:28:07 -08:00
///
2019-08-27 22:09:43 +02:00
/// let buf = Bytes::from(&b"abc"[..]);
/// let mut iter = buf.into_iter();
2017-03-01 09:28:07 -08:00
///
/// assert_eq!(iter.next(), Some(b'a'));
///
/// let buf = iter.into_inner();
/// assert_eq!(2, buf.remaining());
/// ```
pub fn into_inner(self) -> T {
self.inner
}
/// Gets a reference to the underlying `Buf`.
///
/// It is inadvisable to directly read from the underlying `Buf`.
///
/// # Examples
///
/// ```rust
2019-08-27 22:09:43 +02:00
/// use bytes::{Buf, Bytes};
2017-03-01 09:28:07 -08:00
///
2019-08-27 22:09:43 +02:00
/// let buf = Bytes::from(&b"abc"[..]);
/// let mut iter = buf.into_iter();
2017-03-01 09:28:07 -08:00
///
/// assert_eq!(iter.next(), Some(b'a'));
///
/// assert_eq!(2, iter.get_ref().remaining());
/// ```
pub fn get_ref(&self) -> &T {
&self.inner
}
/// Gets a mutable reference to the underlying `Buf`.
///
/// It is inadvisable to directly read from the underlying `Buf`.
///
/// # Examples
///
/// ```rust
2019-08-27 22:09:43 +02:00
/// use bytes::{Buf, BytesMut};
2017-03-01 09:28:07 -08:00
///
/// let buf = BytesMut::from(&b"abc"[..]);
/// let mut iter = buf.into_iter();
2017-03-01 09:28:07 -08:00
///
/// assert_eq!(iter.next(), Some(b'a'));
///
/// iter.get_mut().advance(1);
2017-03-01 09:28:07 -08:00
///
/// assert_eq!(iter.next(), Some(b'c'));
2017-03-01 09:28:07 -08:00
/// ```
pub fn get_mut(&mut self) -> &mut T {
&mut self.inner
}
}
impl<T: Buf> Iterator for IntoIter<T> {
2017-03-01 09:28:07 -08:00
type Item = u8;
fn next(&mut self) -> Option<u8> {
if !self.inner.has_remaining() {
return None;
}
let b = self.inner.chunk()[0];
2017-03-01 09:28:07 -08:00
self.inner.advance(1);
2017-03-01 09:28:07 -08:00
Some(b)
}
fn size_hint(&self) -> (usize, Option<usize>) {
let rem = self.inner.remaining();
(rem, Some(rem))
}
}
2020-05-22 13:17:30 +09:00
impl<T: Buf> ExactSizeIterator for IntoIter<T> {}