bytes/buf/iter.rs
1use crate::Buf;
2
3/// Iterator over the bytes contained by the buffer.
4///
5/// # Examples
6///
7/// Basic usage:
8///
9/// ```
10/// use bytes::Bytes;
11///
12/// let buf = Bytes::from(&b"abc"[..]);
13/// let mut iter = buf.into_iter();
14///
15/// assert_eq!(iter.next(), Some(b'a'));
16/// assert_eq!(iter.next(), Some(b'b'));
17/// assert_eq!(iter.next(), Some(b'c'));
18/// assert_eq!(iter.next(), None);
19/// ```
20#[derive(Debug)]
21pub struct IntoIter<T> {
22 inner: T,
23}
24
25impl<T> IntoIter<T> {
26 /// Creates an iterator over the bytes contained by the buffer.
27 ///
28 /// # Examples
29 ///
30 /// ```
31 /// use bytes::Bytes;
32 ///
33 /// let buf = Bytes::from_static(b"abc");
34 /// let mut iter = buf.into_iter();
35 ///
36 /// assert_eq!(iter.next(), Some(b'a'));
37 /// assert_eq!(iter.next(), Some(b'b'));
38 /// assert_eq!(iter.next(), Some(b'c'));
39 /// assert_eq!(iter.next(), None);
40 /// ```
41 pub fn new(inner: T) -> IntoIter<T> {
42 IntoIter { inner }
43 }
44
45 /// Consumes this `IntoIter`, returning the underlying value.
46 ///
47 /// # Examples
48 ///
49 /// ```rust
50 /// use bytes::{Buf, Bytes};
51 ///
52 /// let buf = Bytes::from(&b"abc"[..]);
53 /// let mut iter = buf.into_iter();
54 ///
55 /// assert_eq!(iter.next(), Some(b'a'));
56 ///
57 /// let buf = iter.into_inner();
58 /// assert_eq!(2, buf.remaining());
59 /// ```
60 pub fn into_inner(self) -> T {
61 self.inner
62 }
63
64 /// Gets a reference to the underlying `Buf`.
65 ///
66 /// It is inadvisable to directly read from the underlying `Buf`.
67 ///
68 /// # Examples
69 ///
70 /// ```rust
71 /// use bytes::{Buf, Bytes};
72 ///
73 /// let buf = Bytes::from(&b"abc"[..]);
74 /// let mut iter = buf.into_iter();
75 ///
76 /// assert_eq!(iter.next(), Some(b'a'));
77 ///
78 /// assert_eq!(2, iter.get_ref().remaining());
79 /// ```
80 pub fn get_ref(&self) -> &T {
81 &self.inner
82 }
83
84 /// Gets a mutable reference to the underlying `Buf`.
85 ///
86 /// It is inadvisable to directly read from the underlying `Buf`.
87 ///
88 /// # Examples
89 ///
90 /// ```rust
91 /// use bytes::{Buf, BytesMut};
92 ///
93 /// let buf = BytesMut::from(&b"abc"[..]);
94 /// let mut iter = buf.into_iter();
95 ///
96 /// assert_eq!(iter.next(), Some(b'a'));
97 ///
98 /// iter.get_mut().advance(1);
99 ///
100 /// assert_eq!(iter.next(), Some(b'c'));
101 /// ```
102 pub fn get_mut(&mut self) -> &mut T {
103 &mut self.inner
104 }
105}
106
107impl<T: Buf> Iterator for IntoIter<T> {
108 type Item = u8;
109
110 fn next(&mut self) -> Option<u8> {
111 if !self.inner.has_remaining() {
112 return None;
113 }
114
115 let b = self.inner.chunk()[0];
116 self.inner.advance(1);
117
118 Some(b)
119 }
120
121 fn size_hint(&self) -> (usize, Option<usize>) {
122 let rem = self.inner.remaining();
123 (rem, Some(rem))
124 }
125}
126
127impl<T: Buf> ExactSizeIterator for IntoIter<T> {}