xref: /aosp_15_r20/external/flatbuffers/rust/flexbuffers/src/reader/iter.rs (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker // Copyright 2019 Google LLC
2*890232f2SAndroid Build Coastguard Worker //
3*890232f2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*890232f2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*890232f2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*890232f2SAndroid Build Coastguard Worker //
7*890232f2SAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*890232f2SAndroid Build Coastguard Worker //
9*890232f2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*890232f2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*890232f2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*890232f2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*890232f2SAndroid Build Coastguard Worker // limitations under the License.
14*890232f2SAndroid Build Coastguard Worker 
15*890232f2SAndroid Build Coastguard Worker use crate::{Buffer, Reader, VectorReader};
16*890232f2SAndroid Build Coastguard Worker use std::iter::{DoubleEndedIterator, ExactSizeIterator, FusedIterator, Iterator};
17*890232f2SAndroid Build Coastguard Worker 
18*890232f2SAndroid Build Coastguard Worker /// Iterates over a flexbuffer vector, typed vector, or map. Yields [Readers](struct.Reader.html).
19*890232f2SAndroid Build Coastguard Worker ///
20*890232f2SAndroid Build Coastguard Worker /// If any error occurs, the Reader is defaulted to a Null flexbuffer Reader.
21*890232f2SAndroid Build Coastguard Worker pub struct ReaderIterator<B> {
22*890232f2SAndroid Build Coastguard Worker     pub(super) reader: VectorReader<B>,
23*890232f2SAndroid Build Coastguard Worker     pub(super) front: usize,
24*890232f2SAndroid Build Coastguard Worker     end: usize,
25*890232f2SAndroid Build Coastguard Worker }
26*890232f2SAndroid Build Coastguard Worker 
27*890232f2SAndroid Build Coastguard Worker impl<B: Buffer> ReaderIterator<B> {
new(reader: VectorReader<B>) -> Self28*890232f2SAndroid Build Coastguard Worker     pub(super) fn new(reader: VectorReader<B>) -> Self {
29*890232f2SAndroid Build Coastguard Worker         let end = reader.len();
30*890232f2SAndroid Build Coastguard Worker         ReaderIterator {
31*890232f2SAndroid Build Coastguard Worker             reader,
32*890232f2SAndroid Build Coastguard Worker             front: 0,
33*890232f2SAndroid Build Coastguard Worker             end,
34*890232f2SAndroid Build Coastguard Worker         }
35*890232f2SAndroid Build Coastguard Worker     }
36*890232f2SAndroid Build Coastguard Worker }
37*890232f2SAndroid Build Coastguard Worker 
38*890232f2SAndroid Build Coastguard Worker impl<B: Buffer> Iterator for ReaderIterator<B> {
39*890232f2SAndroid Build Coastguard Worker     type Item = Reader<B>;
next(&mut self) -> Option<Self::Item>40*890232f2SAndroid Build Coastguard Worker     fn next(&mut self) -> Option<Self::Item> {
41*890232f2SAndroid Build Coastguard Worker         if self.front < self.end {
42*890232f2SAndroid Build Coastguard Worker             let r = self.reader.idx(self.front);
43*890232f2SAndroid Build Coastguard Worker             self.front += 1;
44*890232f2SAndroid Build Coastguard Worker             Some(r)
45*890232f2SAndroid Build Coastguard Worker         } else {
46*890232f2SAndroid Build Coastguard Worker             None
47*890232f2SAndroid Build Coastguard Worker         }
48*890232f2SAndroid Build Coastguard Worker     }
size_hint(&self) -> (usize, Option<usize>)49*890232f2SAndroid Build Coastguard Worker     fn size_hint(&self) -> (usize, Option<usize>) {
50*890232f2SAndroid Build Coastguard Worker         let remaining = self.end - self.front;
51*890232f2SAndroid Build Coastguard Worker         (remaining, Some(remaining))
52*890232f2SAndroid Build Coastguard Worker     }
53*890232f2SAndroid Build Coastguard Worker }
54*890232f2SAndroid Build Coastguard Worker 
55*890232f2SAndroid Build Coastguard Worker impl<B: Buffer> DoubleEndedIterator for ReaderIterator<B> {
next_back(&mut self) -> Option<Self::Item>56*890232f2SAndroid Build Coastguard Worker     fn next_back(&mut self) -> Option<Self::Item> {
57*890232f2SAndroid Build Coastguard Worker         if self.front < self.end {
58*890232f2SAndroid Build Coastguard Worker             self.end -= 1;
59*890232f2SAndroid Build Coastguard Worker             Some(self.reader.idx(self.end))
60*890232f2SAndroid Build Coastguard Worker         } else {
61*890232f2SAndroid Build Coastguard Worker             None
62*890232f2SAndroid Build Coastguard Worker         }
63*890232f2SAndroid Build Coastguard Worker     }
64*890232f2SAndroid Build Coastguard Worker }
65*890232f2SAndroid Build Coastguard Worker 
66*890232f2SAndroid Build Coastguard Worker impl<B: Buffer> ExactSizeIterator for ReaderIterator<B> {}
67*890232f2SAndroid Build Coastguard Worker impl<B: Buffer> FusedIterator for ReaderIterator<B> {}
68