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