Skip to content

Commit bed17db

Browse files
authored
fix: Correct Iterator::size_hint and ExactSizeIterator implementation for FieldNames (#3768)
Signed-off-by: Adam Gutglick <[email protected]>
1 parent 38e757d commit bed17db

File tree

1 file changed

+37
-8
lines changed

1 file changed

+37
-8
lines changed

vortex-dtype/src/dtype.rs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,15 @@ impl<'a> Iterator for FieldNamesIter<'a> {
7777
self.idx += 1;
7878
Some(i)
7979
}
80-
}
8180

82-
impl ExactSizeIterator for FieldNamesIter<'_> {
83-
fn len(&self) -> usize {
84-
self.inner.len() - self.idx
81+
fn size_hint(&self) -> (usize, Option<usize>) {
82+
let len = self.inner.len() - self.idx;
83+
(len, Some(len))
8584
}
8685
}
8786

87+
impl ExactSizeIterator for FieldNamesIter<'_> {}
88+
8889
/// Owned iterator of field names.
8990
pub struct FieldNamesIntoIter {
9091
inner: FieldNames,
@@ -103,14 +104,15 @@ impl Iterator for FieldNamesIntoIter {
103104
self.idx += 1;
104105
Some(i)
105106
}
106-
}
107107

108-
impl ExactSizeIterator for FieldNamesIntoIter {
109-
fn len(&self) -> usize {
110-
self.inner.len() - self.idx
108+
fn size_hint(&self) -> (usize, Option<usize>) {
109+
let len = self.inner.len() - self.idx;
110+
(len, Some(len))
111111
}
112112
}
113113

114+
impl ExactSizeIterator for FieldNamesIntoIter {}
115+
114116
impl IntoIterator for FieldNames {
115117
type Item = FieldName;
116118

@@ -421,3 +423,30 @@ impl Display for DType {
421423
}
422424
}
423425
}
426+
427+
#[cfg(test)]
428+
mod tests {
429+
use super::*;
430+
431+
#[test]
432+
fn test_field_names_iter() {
433+
let names = ["a", "b"];
434+
let field_names = FieldNames::from(names);
435+
assert_eq!(field_names.iter().len(), names.len());
436+
let mut iter = field_names.iter();
437+
assert_eq!(iter.next(), Some(&"a".into()));
438+
assert_eq!(iter.next(), Some(&"b".into()));
439+
assert_eq!(iter.next(), None);
440+
}
441+
442+
#[test]
443+
fn test_field_names_owned_iter() {
444+
let names = ["a", "b"];
445+
let field_names = FieldNames::from(names);
446+
assert_eq!(field_names.clone().into_iter().len(), names.len());
447+
let mut iter = field_names.into_iter();
448+
assert_eq!(iter.next(), Some("a".into()));
449+
assert_eq!(iter.next(), Some("b".into()));
450+
assert_eq!(iter.next(), None);
451+
}
452+
}

0 commit comments

Comments
 (0)