diff --git a/src/arrayish_vec.rs b/src/arrayish_vec.rs index ee87285..f99955d 100644 --- a/src/arrayish_vec.rs +++ b/src/arrayish_vec.rs @@ -538,8 +538,12 @@ impl ArrayishVec { 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. diff --git a/tests/basic_tests.rs b/tests/basic_tests.rs index 8b1367b..699bafd 100644 --- a/tests/basic_tests.rs +++ b/tests/basic_tests.rs @@ -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(); diff --git a/tests/tinyvec.rs b/tests/tinyvec.rs index 86756d2..a27823b 100644 --- a/tests/tinyvec.rs +++ b/tests/tinyvec.rs @@ -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();