melib: fix bounds checking for StackVec

embed
Manos Pitsidianakis 2019-07-22 14:57:54 +03:00
parent 8543a06f59
commit a00e3fcbde
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
1 changed files with 15 additions and 3 deletions

View File

@ -38,7 +38,7 @@ impl<T: Default + Copy + std::fmt::Debug> StackVec<T> {
if self.len == 0 {
return None;
}
if self.len >= self.array.len() {
if self.len > self.array.len() {
self.len -= 1;
self.heap_vec.pop()
} else {
@ -60,7 +60,7 @@ impl<T: Default + Copy + std::fmt::Debug> StackVec<T> {
}
}
pub fn remove(&mut self, i: usize) -> T {
if self.len >= self.array.len() {
if self.len > self.array.len() {
self.heap_vec.remove(i)
} else {
let ret = std::mem::replace(&mut self.array[i], T::default());
@ -71,6 +71,18 @@ impl<T: Default + Copy + std::fmt::Debug> StackVec<T> {
ret
}
}
pub fn set(&mut self, i: usize, val: T) {
debug_assert!(i < self.len);
if self.len > self.array.len() {
self.heap_vec[i] = val;
if i + 1 < self.array.len() {
self.array[i] = val;
}
} else {
self.array[i] = val;
}
}
}
pub struct StackVecIter<'a, T: Default + Copy + std::fmt::Debug> {
@ -108,7 +120,7 @@ impl<T: Default + Copy + std::fmt::Debug> Index<usize> for StackVec<T> {
type Output = T;
fn index(&self, idx: usize) -> &T {
if self.len >= self.array.len() {
if self.len > self.array.len() {
&self.heap_vec[idx]
} else {
&self.array[idx]