From 242f554cc6f344fba5d8311dba7a6bd4f2bb7a96 Mon Sep 17 00:00:00 2001 From: Pascal Seitz Date: Wed, 7 Sep 2022 12:16:29 +0800 Subject: [PATCH] add impls --- fastfield_codecs/src/lib.rs | 40 ++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/fastfield_codecs/src/lib.rs b/fastfield_codecs/src/lib.rs index d923938c4..e0dff1341 100644 --- a/fastfield_codecs/src/lib.rs +++ b/fastfield_codecs/src/lib.rs @@ -4,6 +4,7 @@ extern crate more_asserts; use std::io; use std::io::Write; +use std::iter::FusedIterator; use std::marker::PhantomData; use std::ops::Range; @@ -116,19 +117,16 @@ impl<'a> Column for &'a [u64] { pub struct ColumnIter<'a, C: Column, I> { column: &'a C, - end_pos: u64, - current_pos: u64, + range: Range, _phantom: PhantomData, } impl<'a, C: Column, I> ColumnIter<'a, C, I> { #[inline] pub fn new(col: &'a C, range: Range) -> Self { - let current_pos = range.start; Self { column: col, - end_pos: range.end, - current_pos, + range, _phantom: PhantomData, } } @@ -139,16 +137,34 @@ impl<'a, C: Column, I> Iterator for ColumnIter<'a, C, I> { #[inline] fn next(&mut self) -> Option { - if self.current_pos < self.end_pos { - let val = self.column.get_val(self.current_pos); - self.current_pos += 1; - Some(val) - } else { - None - } + Some(self.column.get_val(self.range.next()?)) + } + + #[inline] + fn fold(self, init: Acc, mut g: G) -> Acc + where + G: FnMut(Acc, Self::Item) -> Acc, + { + self.range + .fold(init, move |acc, idx| g(acc, self.column.get_val(idx))) + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + let size = (self.range.end - self.range.start) as usize; + (size, Some(size)) } } +impl<'a, C: Column, I> ExactSizeIterator for ColumnIter<'a, C, I> { + #[inline] + fn len(&self) -> usize { + let size = (self.range.end - self.range.start) as usize; + size as usize + } +} +impl<'a, C: Column, I> FusedIterator for ColumnIter<'a, C, I> {} + impl Column for Vec { fn get_val(&self, position: u64) -> u64 { self[position as usize]