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