Fix OOB index in grid::DisplayIter

When resizing prior to this patch, hidden rows in Storage were not
having columns added along with everything else. This feels like a bit
of tech debt, but the patch is simple enough that it won't be much extra
to back out later when the underlying cause is addressed (see comments
in code).
This commit is contained in:
Joe Wilm 2018-05-19 12:06:21 -07:00
parent c61a912f62
commit 5a11f85843
2 changed files with 17 additions and 1 deletions

View File

@ -244,7 +244,7 @@ impl<T: Copy + Clone> Grid<T> {
}
fn grow_cols(&mut self, cols: index::Column, template: &T) {
for row in self.raw.iter_mut() {
for row in self.raw.iter_mut_raw() {
row.grow(cols, template);
}

View File

@ -12,6 +12,7 @@
/// implementation is provided. Anything from Vec that should be exposed must be
/// done so manually.
use std::ops::{Index, IndexMut};
use std::slice;
use index::Line;
@ -183,10 +184,25 @@ impl<T> Storage<T> {
self.inner.swap(a, b);
}
/// Iterator over *logical* entries in the storage
///
/// This *does not* iterate over hidden entries.
pub fn iter_mut(&mut self) -> IterMut<T> {
IterMut { storage: self, index: 0 }
}
/// Iterate over *all* entries in the underlying buffer
///
/// This includes hidden entries.
///
/// XXX This suggests that Storage is a leaky abstraction. Ultimately, this
/// is needed because of the grow lines functionality implemented on
/// this type, and maybe that's where the leak is necessitating this
/// accessor.
pub fn iter_mut_raw<'a>(&'a mut self) -> slice::IterMut<'a, T> {
self.inner.iter_mut()
}
pub fn rotate(&mut self, count: isize) {
debug_assert!(count.abs() as usize <= self.inner.len());