Skip to content

Commit

Permalink
Implement nth_back
Browse files Browse the repository at this point in the history
  • Loading branch information
novacrazy committed Sep 12, 2023
1 parent 5f9e39b commit 6bf498e
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/iter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,18 @@ impl<T, N: ArrayLength> DoubleEndedIterator for GenericArrayIter<T, N> {

ret
}

fn nth_back(&mut self, n: usize) -> Option<T> {
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<T, N: ArrayLength> ExactSizeIterator for GenericArrayIter<T, N> {
Expand Down
24 changes: 24 additions & 0 deletions tests/iter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 6bf498e

Please sign in to comment.