From 6bf498e0e95223bba007f50e61011f8beced27b5 Mon Sep 17 00:00:00 2001 From: novacrazy Date: Tue, 12 Sep 2023 18:09:09 -0500 Subject: [PATCH] Implement nth_back --- src/iter.rs | 12 ++++++++++++ tests/iter.rs | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/iter.rs b/src/iter.rs index 2f0334ed2..009755e1c 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -217,6 +217,18 @@ impl DoubleEndedIterator for GenericArrayIter { ret } + + fn nth_back(&mut self, n: usize) -> Option { + let next_back = self.index_back - cmp::min(n, self.len()); + + unsafe { + ptr::drop_in_place(self.array.get_unchecked_mut(next_back..self.index_back)); + } + + self.index_back = next_back; + + self.next_back() + } } impl ExactSizeIterator for GenericArrayIter { diff --git a/tests/iter.rs b/tests/iter.rs index 801a9af1a..1af78ff4e 100644 --- a/tests/iter.rs +++ b/tests/iter.rs @@ -90,6 +90,20 @@ fn test_into_iter_nth() { assert_eq!(iter.nth(1).unwrap(), v[4]); } +#[test] +fn test_into_iter_nth_back() { + let v = arr![0, 1, 2, 3, 4]; + + for i in 0..v.len() { + assert_eq!(v.into_iter().nth_back(i).unwrap(), v[v.len() - i - 1]); + } + assert_eq!(v.into_iter().nth_back(v.len()), None); + + let mut iter = v.into_iter(); + assert_eq!(iter.nth_back(2).unwrap(), v[2]); + assert_eq!(iter.nth_back(1).unwrap(), v[0]); +} + #[test] fn test_into_iter_last() { let v = arr![0, 1, 2, 3, 4]; @@ -173,6 +187,16 @@ fn test_into_iter_drops() { } assert_eq!(i.get(), 5); + let i = Cell::new(0); + { + let mut iter = v(&i).into_iter(); + let _x = iter.nth_back(2); + assert_eq!(i.get(), 2); + let _y = iter.last(); + assert_eq!(i.get(), 3); + } + assert_eq!(i.get(), 5); + let i = Cell::new(0); for (index, _x) in v(&i).into_iter().enumerate() { assert_eq!(i.get(), index);