| use crate::Buf; |
| |
| /// Iterator over the bytes contained by the buffer. |
| /// |
| /// # Examples |
| /// |
| /// Basic usage: |
| /// |
| /// ``` |
| /// use bytes::Bytes; |
| /// |
| /// let buf = Bytes::from(&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); |
| /// ``` |
| #[derive(Debug)] |
| pub struct IntoIter<T> { |
| inner: T, |
| } |
| |
| impl<T> IntoIter<T> { |
| /// Creates an iterator over the bytes contained by the buffer. |
| /// |
| /// # Examples |
| /// |
| /// ``` |
| /// 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); |
| /// ``` |
| pub fn new(inner: T) -> IntoIter<T> { |
| IntoIter { inner } |
| } |
| |
| /// Consumes this `IntoIter`, returning the underlying value. |
| /// |
| /// # Examples |
| /// |
| /// ```rust |
| /// use bytes::{Buf, Bytes}; |
| /// |
| /// let buf = Bytes::from(&b"abc"[..]); |
| /// let mut iter = buf.into_iter(); |
| /// |
| /// 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 |
| /// use bytes::{Buf, Bytes}; |
| /// |
| /// let buf = Bytes::from(&b"abc"[..]); |
| /// let mut iter = buf.into_iter(); |
| /// |
| /// 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 |
| /// use bytes::{Buf, BytesMut}; |
| /// |
| /// let buf = BytesMut::from(&b"abc"[..]); |
| /// let mut iter = buf.into_iter(); |
| /// |
| /// assert_eq!(iter.next(), Some(b'a')); |
| /// |
| /// iter.get_mut().advance(1); |
| /// |
| /// assert_eq!(iter.next(), Some(b'c')); |
| /// ``` |
| pub fn get_mut(&mut self) -> &mut T { |
| &mut self.inner |
| } |
| } |
| |
| impl<T: Buf> Iterator for IntoIter<T> { |
| type Item = u8; |
| |
| fn next(&mut self) -> Option<u8> { |
| if !self.inner.has_remaining() { |
| return None; |
| } |
| |
| let b = self.inner.chunk()[0]; |
| self.inner.advance(1); |
| |
| Some(b) |
| } |
| |
| fn size_hint(&self) -> (usize, Option<usize>) { |
| let rem = self.inner.remaining(); |
| (rem, Some(rem)) |
| } |
| } |
| |
| impl<T: Buf> ExactSizeIterator for IntoIter<T> {} |