1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
use std::iter::FusedIterator; use crate::{ core::{Vector, VectorElement, VectorExtern}, platform_types::size_t, }; impl<T: VectorElement> IntoIterator for Vector<T> where Vector<T>: VectorExtern<T> { type Item = T; type IntoIter = VectorIterator<T>; #[inline] fn into_iter(self) -> VectorIterator<T> { Self::IntoIter::new(self) } } impl<'v, T: VectorElement> IntoIterator for &'v Vector<T> where Vector<T>: VectorExtern<T> { type Item = T; type IntoIter = VectorRefIterator<'v, T>; #[inline] fn into_iter(self) -> VectorRefIterator<'v, T> { self.iter() } } pub struct VectorIterator<T: VectorElement> where Vector<T>: VectorExtern<T> { vec: Vector<T>, i: size_t, } impl<T: VectorElement> VectorIterator<T> where Vector<T>: VectorExtern<T> { pub fn new(vec: Vector<T>) -> Self { Self { vec, i: 0 } } } impl<T: VectorElement> Iterator for VectorIterator<T> where Vector<T>: VectorExtern<T> { type Item = T; fn next(&mut self) -> Option<Self::Item> { let out = self.vec.get(self.i); self.i += 1; out.ok() } fn size_hint(&self) -> (usize, Option<usize>) { let len = self.vec.len() - self.i; (len, Some(len)) } fn nth(&mut self, n: usize) -> Option<Self::Item> { self.vec.get(n).ok() } } impl<T: VectorElement> ExactSizeIterator for VectorIterator<T> where Vector<T>: VectorExtern<T> {} impl<T: VectorElement> FusedIterator for VectorIterator<T> where Vector<T>: VectorExtern<T> {} pub struct VectorRefIterator<'v, T: VectorElement> where Vector<T>: VectorExtern<T> { vec: &'v Vector<T>, i: size_t, } impl<'v, T: VectorElement> VectorRefIterator<'v, T> where Vector<T>: VectorExtern<T> { pub fn new(vec: &'v Vector<T>) -> Self { Self { vec, i: 0 } } } impl<T: VectorElement> Iterator for VectorRefIterator<'_, T> where Vector<T>: VectorExtern<T> { type Item = T; fn next(&mut self) -> Option<Self::Item> { let out = self.vec.get(self.i); self.i += 1; out.ok() } fn size_hint(&self) -> (usize, Option<usize>) { let len = self.vec.len() - self.i; (len, Some(len)) } fn nth(&mut self, n: usize) -> Option<Self::Item> { self.vec.get(n).ok() } } impl<T: VectorElement> ExactSizeIterator for VectorRefIterator<'_, T> where Vector<T>: VectorExtern<T> {} impl<T: VectorElement> FusedIterator for VectorRefIterator<'_, T> where Vector<T>: VectorExtern<T> {}