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.
This commit is contained in:
Josh Stone
2020-03-31 12:36:39 -07:00
committed by GitHub
parent 0c31798eba
commit d04abff44c
3 changed files with 31 additions and 3 deletions
+20
View File
@@ -959,6 +959,26 @@ impl<A: Array> IntoIterator for ArrayVec<A> {
}
}
impl<'a, A: Array> IntoIterator for &'a mut ArrayVec<A> {
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<A> {
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<A: Array> PartialEq for ArrayVec<A>
where
A::Item: PartialEq,
+2 -2
View File
@@ -840,7 +840,7 @@ impl<A: Array> IntoIterator for TinyVec<A> {
impl<'a, A: Array> IntoIterator for &'a mut TinyVec<A> {
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<A> {
impl<'a, A: Array> IntoIterator for &'a TinyVec<A> {
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 {
+9 -1
View File
@@ -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]