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