Skip to content

Commit

Permalink
Merge pull request #15 from Nemo157/fix-swap_remove
Browse files Browse the repository at this point in the history
Fix ArrayishVec::swap_remove for last element
  • Loading branch information
Lokathor authored Jan 14, 2020
2 parents d0bdff5 + 71ad62a commit b5622d9
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 2 deletions.
8 changes: 6 additions & 2 deletions src/arrayish_vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -538,8 +538,12 @@ impl<A: Arrayish> ArrayishVec<A> {
index,
self.len
);
let i = self.pop().unwrap();
replace(&mut self[index], i)
if index == self.len - 1 {
self.pop().unwrap()
} else {
let i = self.pop().unwrap();
replace(&mut self[index], i)
}
}

/// Reduces the vec's length to the given value.
Expand Down
17 changes: 17 additions & 0 deletions tests/basic_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,23 @@ fn ArrayishVec_remove() {
assert_eq!(&av[..], &[1, 3][..]);
}

#[test]
fn ArrayishVec_swap_remove() {
let mut av: ArrayishVec<[i32; 10]> = Default::default();
av.push(1);
av.push(2);
av.push(3);
av.push(4);
assert_eq!(av.swap_remove(3), 4);
assert_eq!(&av[..], &[1, 2, 3][..]);
assert_eq!(av.swap_remove(0), 1);
assert_eq!(&av[..], &[3, 2][..]);
assert_eq!(av.swap_remove(0), 3);
assert_eq!(&av[..], &[2][..]);
assert_eq!(av.swap_remove(0), 2);
assert_eq!(&av[..], &[][..]);
}

#[test]
fn ArrayishVec_drain() {
let mut av: ArrayishVec<[i32; 10]> = Default::default();
Expand Down
17 changes: 17 additions & 0 deletions tests/tinyvec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,23 @@
use tinyvec::*;
use std::iter::FromIterator;

#[test]
fn TinyVec_swap_remove() {
let mut tv: TinyVec<[i32; 10]> = Default::default();
tv.push(1);
tv.push(2);
tv.push(3);
tv.push(4);
assert_eq!(tv.swap_remove(3), 4);
assert_eq!(&tv[..], &[1, 2, 3][..]);
assert_eq!(tv.swap_remove(0), 1);
assert_eq!(&tv[..], &[3, 2][..]);
assert_eq!(tv.swap_remove(0), 3);
assert_eq!(&tv[..], &[2][..]);
assert_eq!(tv.swap_remove(0), 2);
assert_eq!(&tv[..], &[][..]);
}

#[test]
fn TinyVec_drain() {
let mut tv: TinyVec<[i32; 10]> = Default::default();
Expand Down

0 comments on commit b5622d9

Please sign in to comment.