Speedup init grid

This commit is contained in:
Armin Becher 2020-04-04 18:18:37 +02:00
parent 182d349c23
commit b7dff2e573

View file

@ -34,7 +34,8 @@ macro_rules! grid {
}; };
( [$( $x:expr ),* ]) => { { ( [$( $x:expr ),* ]) => { {
let vec = vec![$($x),*]; let vec = vec![$($x),*];
$crate::Grid::from_vec(&vec, vec.len()) let len = vec.len();
$crate::Grid::from_vec(vec, len)
} }; } };
( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => { ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
{ {
@ -50,7 +51,7 @@ macro_rules! grid {
$( vec.push($x); )* $( vec.push($x); )*
)* )*
$crate::Grid::from_vec(&vec, cols) $crate::Grid::from_vec(vec, cols)
} }
}; };
} }
@ -110,7 +111,7 @@ impl<T: Clone> Grid<T> {
/// use grid::Grid; /// use grid::Grid;
/// Grid::from_vec(&vec![1,2,3,4,5], 3); /// Grid::from_vec(&vec![1,2,3,4,5], 3);
/// ``` /// ```
pub fn from_vec(vec: &Vec<T>, cols: usize) -> Grid<T> { pub fn from_vec(vec: Vec<T>, cols: usize) -> Grid<T> {
if vec.len() == 0 { if vec.len() == 0 {
if cols == 0 { if cols == 0 {
return grid![]; return grid![];
@ -121,9 +122,10 @@ impl<T: Clone> Grid<T> {
if vec.len() % cols != 0 { if vec.len() % cols != 0 {
panic!("Vector length must be a multiple of cols."); panic!("Vector length must be a multiple of cols.");
} }
let rows = vec.len();
Grid { Grid {
data: vec.to_vec(), data: vec,
rows: vec.len() / cols, rows: rows / cols,
cols: cols, cols: cols,
} }
} }
@ -226,26 +228,26 @@ mod test {
#[test] #[test]
fn from_vec_zero() { fn from_vec_zero() {
let grid: Grid<u8> = Grid::from_vec(&vec![], 0); let grid: Grid<u8> = Grid::from_vec(vec![], 0);
assert_eq!(grid.size(), (0, 0)); assert_eq!(grid.size(), (0, 0));
} }
#[test] #[test]
#[should_panic] #[should_panic]
fn from_vec_panics_1() { fn from_vec_panics_1() {
let _: Grid<u8> = Grid::from_vec(&vec![1, 2, 3], 0); let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 0);
} }
#[test] #[test]
#[should_panic] #[should_panic]
fn from_vec_panics_2() { fn from_vec_panics_2() {
let _: Grid<u8> = Grid::from_vec(&vec![1, 2, 3], 2); let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 2);
} }
#[test] #[test]
#[should_panic] #[should_panic]
fn from_vec_panics_3() { fn from_vec_panics_3() {
let _: Grid<u8> = Grid::from_vec(&vec![], 1); let _: Grid<u8> = Grid::from_vec(vec![], 1);
} }
#[test] #[test]