From d04abff44cebef8e2c616c115b3e1fe955a216a8 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Tue, 31 Mar 2020 12:36:39 -0700 Subject: [PATCH] impl IntoIterator for &/&mut ArrayVec (#69) These just create slice iterators, but the impls are useful to have for contexts that don't auto-deref, as in the new tests. --- src/arrayvec.rs | 20 ++++++++++++++++++++ src/tinyvec.rs | 4 ++-- tests/arrayvec.rs | 10 +++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/arrayvec.rs b/src/arrayvec.rs index f2bbeb0..49b3bb4 100644 --- a/src/arrayvec.rs +++ b/src/arrayvec.rs @@ -959,6 +959,26 @@ impl IntoIterator for ArrayVec { } } +impl<'a, A: Array> IntoIterator for &'a mut ArrayVec { + type Item = &'a mut A::Item; + type IntoIter = core::slice::IterMut<'a, A::Item>; + #[inline(always)] + #[must_use] + fn into_iter(self) -> Self::IntoIter { + self.iter_mut() + } +} + +impl<'a, A: Array> IntoIterator for &'a ArrayVec { + type Item = &'a A::Item; + type IntoIter = core::slice::Iter<'a, A::Item>; + #[inline(always)] + #[must_use] + fn into_iter(self) -> Self::IntoIter { + self.iter() + } +} + impl PartialEq for ArrayVec where A::Item: PartialEq, diff --git a/src/tinyvec.rs b/src/tinyvec.rs index 90c197d..7fe65ee 100644 --- a/src/tinyvec.rs +++ b/src/tinyvec.rs @@ -840,7 +840,7 @@ impl IntoIterator for TinyVec { impl<'a, A: Array> IntoIterator for &'a mut TinyVec { type Item = &'a mut A::Item; - type IntoIter = alloc::slice::IterMut<'a, A::Item>; + type IntoIter = core::slice::IterMut<'a, A::Item>; #[inline(always)] #[must_use] fn into_iter(self) -> Self::IntoIter { @@ -850,7 +850,7 @@ impl<'a, A: Array> IntoIterator for &'a mut TinyVec { impl<'a, A: Array> IntoIterator for &'a TinyVec { type Item = &'a A::Item; - type IntoIter = alloc::slice::Iter<'a, A::Item>; + type IntoIter = core::slice::Iter<'a, A::Item>; #[inline(always)] #[must_use] fn into_iter(self) -> Self::IntoIter { diff --git a/tests/arrayvec.rs b/tests/arrayvec.rs index a9a9381..ea63c09 100644 --- a/tests/arrayvec.rs +++ b/tests/arrayvec.rs @@ -99,8 +99,16 @@ fn ArrayVec_iteration() { let av = array_vec!([i32; 4], 10, 11, 12, 13); - let av2: ArrayVec<[i32; 4]> = av.clone().into_iter().collect(); + let mut av2: ArrayVec<[i32; 4]> = av.clone().into_iter().collect(); assert_eq!(av, av2); + + // IntoIterator for &mut ArrayVec + for x in &mut av2 { + *x = -*x; + } + + // IntoIterator for &ArrayVec + assert!(av.iter().zip(&av2).all(|(&a, &b)| a == -b)); } #[test]