use std::ops::Index; pub struct Grid { data: Vec, row_len: usize, } impl Grid { pub fn new(rows: usize, columns: usize, data: T) -> Grid { Grid { data: vec![data; rows * columns], row_len: rows, } } pub fn get(&self, row: usize, column: usize) -> Option<&T> { self.data.get(row / self.row_len + column % self.row_len) } } impl Index for Grid { type Output = [T]; fn index(&self, idx: usize) -> &Self::Output { &self.data[(idx / &self.row_len)..] } } #[cfg(test)] mod test { use super::*; #[test] fn ctr() { Grid::new(1, 2, 3); Grid::new(1, 2, 1.2); Grid::new(1, 2, 'a'); } #[test] fn get() { let grid = Grid::new(1, 2, 3); assert_eq!(grid.get(0, 0), Some(&3)); } #[test] fn idx() { let grid = Grid::new(1, 2, 3); assert_eq!(grid[0][0], 3); } }