Skip to main content

tick_encoding/
iter.rs

1use crate::{
2    decoder::{DecodeStatus, Decoder},
3    encoder::Encoder,
4    DecodeError,
5};
6
7/// The iterator returned by [`crate::encode_iter`].
8#[derive(Debug, Clone, Copy)]
9pub struct EncodeIter<I> {
10    iter: I,
11    encoder: Encoder,
12}
13
14impl<I> EncodeIter<I> {
15    #[inline]
16    pub(crate) fn new(iter: I) -> Self {
17        Self {
18            iter,
19            encoder: Encoder::default(),
20        }
21    }
22
23    /// Get a reference to the inner iterator.
24    #[inline]
25    pub const fn inner(&self) -> &I {
26        &self.iter
27    }
28
29    /// Get a mutable reference to the inner iterator.
30    #[inline]
31    pub fn inner_mut(&mut self) -> &mut I {
32        &mut self.iter
33    }
34
35    /// Take the inner iterator.
36    #[inline]
37    pub fn into_inner(self) -> I {
38        self.iter
39    }
40}
41
42impl<I> Iterator for EncodeIter<I>
43where
44    I: Iterator<Item = u8>,
45{
46    type Item = char;
47
48    #[inline]
49    fn next(&mut self) -> Option<Self::Item> {
50        if let Some(encoded) = self.encoder.next() {
51            return Some(encoded);
52        }
53
54        let byte = self.iter.next()?;
55        let encoded = self.encoder.push(byte);
56        Some(encoded)
57    }
58}
59
60/// The iterator returned by [`crate::decode_iter`].
61#[derive(Debug, Clone, Copy)]
62pub struct DecodeIter<I> {
63    iter: I,
64    decoder: Decoder,
65}
66
67impl<I> DecodeIter<I> {
68    #[inline]
69    pub(crate) fn new(iter: I) -> Self {
70        Self {
71            iter,
72            decoder: Decoder::default(),
73        }
74    }
75
76    /// Get a reference to the inner iterator.
77    #[inline]
78    pub const fn inner(&self) -> &I {
79        &self.iter
80    }
81
82    /// Get a mutable reference to the inner iterator.
83    #[inline]
84    pub fn inner_mut(&mut self) -> &mut I {
85        &mut self.iter
86    }
87
88    /// Take the inner iterator.
89    #[inline]
90    pub fn into_inner(self) -> I {
91        self.iter
92    }
93}
94
95impl<I> Iterator for DecodeIter<I>
96where
97    I: Iterator<Item = u8>,
98{
99    type Item = Result<u8, DecodeError>;
100
101    #[inline]
102    fn next(&mut self) -> Option<Self::Item> {
103        loop {
104            let next_byte = self.iter.next();
105            match self.decoder.push(next_byte) {
106                DecodeStatus::NeedMore => {}
107                DecodeStatus::Emit(result) => {
108                    return result;
109                }
110            }
111        }
112    }
113}