Skip to content

Commit b36367a

Browse files
authored
Merge pull request #275 from MarcusGrass/indexmap_into_iter
Add intoiter for Indexmap
2 parents 4ad6060 + 8b3c7f2 commit b36367a

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

src/indexmap.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,6 +857,34 @@ where
857857
}
858858
}
859859

860+
#[derive(Clone)]
861+
pub struct IntoIter<K, V, const N: usize> {
862+
entries: Vec<Bucket<K, V>, N>,
863+
}
864+
865+
impl<K, V, const N: usize> Iterator for IntoIter<K, V, N> {
866+
type Item = (K, V);
867+
868+
fn next(&mut self) -> Option<Self::Item> {
869+
self.entries.pop().map(|bucket| (bucket.key, bucket.value))
870+
}
871+
}
872+
873+
impl<K, V, S, const N: usize> IntoIterator for IndexMap<K, V, S, N>
874+
where
875+
K: Eq + Hash,
876+
S: BuildHasher,
877+
{
878+
type Item = (K, V);
879+
type IntoIter = IntoIter<K, V, N>;
880+
881+
fn into_iter(self) -> Self::IntoIter {
882+
IntoIter {
883+
entries: self.core.entries
884+
}
885+
}
886+
}
887+
860888
impl<'a, K, V, S, const N: usize> IntoIterator for &'a IndexMap<K, V, S, N>
861889
where
862890
K: Eq + Hash,
@@ -974,4 +1002,17 @@ mod tests {
9741002
assert!(a == b);
9751003
}
9761004
}
1005+
1006+
#[test]
1007+
fn into_iter() {
1008+
let mut src: FnvIndexMap<_, _, 4> = FnvIndexMap::new();
1009+
src.insert("k1", "v1").unwrap();
1010+
src.insert("k2", "v2").unwrap();
1011+
src.insert("k3", "v3").unwrap();
1012+
src.insert("k4", "v4").unwrap();
1013+
let clone = src.clone();
1014+
for (k, v) in clone.into_iter() {
1015+
assert_eq!(v, *src.get(k).unwrap());
1016+
}
1017+
}
9771018
}

0 commit comments

Comments
 (0)