1use crate::{
2 decoder::{DecodeStatus, Decoder},
3 encoder::Encoder,
4 DecodeError,
5};
6
7#[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 #[inline]
25 pub const fn inner(&self) -> &I {
26 &self.iter
27 }
28
29 #[inline]
31 pub fn inner_mut(&mut self) -> &mut I {
32 &mut self.iter
33 }
34
35 #[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#[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 #[inline]
78 pub const fn inner(&self) -> &I {
79 &self.iter
80 }
81
82 #[inline]
84 pub fn inner_mut(&mut self) -> &mut I {
85 &mut self.iter
86 }
87
88 #[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}