use std::ptr;
use clippy_utilities::OverflowArithmetic;
pub(crate) trait RemoveN {
fn remove_n(&mut self, index: usize, n: usize);
}
impl<T> RemoveN for Vec<T> {
fn remove_n(&mut self, index: usize, n: usize) {
if n == 0 {
return;
}
let len = self.len();
assert!(
index.overflow_add(n).overflow_sub(1) < len,
"removed elements are out of range"
);
#[allow(unsafe_code)]
unsafe {
let ptr = self.as_mut_ptr().add(index);
ptr::copy(ptr.add(n), ptr, len.overflow_sub(index).overflow_sub(n));
self.set_len(len.overflow_sub(n));
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_remove_n() {
let mut v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
v.remove_n(3, 2);
assert_eq!(v, vec![1, 2, 3, 6, 7, 8, 9, 10]);
assert_eq!(v.len(), 8);
}
#[test]
#[should_panic]
fn test_remove_n_panic() {
let mut v = vec![1, 2, 3, 4, 5];
v.remove_n(3, 4);
}
}