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