diff --git a/CHANGELOG.md b/CHANGELOG.md index 4158332..39c5794 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Cache board color-coordinate lookups to avoid repeated full-board scans. - Make `--file-type=auto` use recognized image extensions to select image parsing. ### Fixed diff --git a/src/board.rs b/src/board.rs index e498e76..779efb9 100644 --- a/src/board.rs +++ b/src/board.rs @@ -7,7 +7,7 @@ use anyhow::{Result, ensure}; use itertools::{Itertools, Position, iproduct}; use crate::{ - datastructure::{Coord, CoordSet}, + datastructure::{Coord, CoordSet, MAX_SET_SIZE}, squarecolor::SquareColor, }; @@ -69,6 +69,7 @@ pub struct Board { size: usize, colors: Vec, coords: CoordSet, + color_coords: [CoordSet; MAX_SET_SIZE], queen_borders: Vec, } @@ -92,10 +93,15 @@ impl Board { "Colors must be equal to size*size" ); let coords = iproduct!(0..size, 0..size).collect::(); + let mut color_coords = [CoordSet::default(); MAX_SET_SIZE]; + for (idx, color) in colors.iter().enumerate() { + color_coords[*color as usize].add((idx / size, idx % size)); + } let mut board = Board { size, colors, coords, + color_coords, queen_borders: vec![], }; board.compute_queen_borders(); @@ -210,10 +216,7 @@ impl Board { /// # } /// ``` pub fn coords_for_color(&self, color: &SquareColor) -> CoordSet { - self.all_coords() - .iter() - .filter(|&coord| self.color(&coord) == *color) - .collect() + self.color_coords[*color as usize] } /// Returns a list of all [Coord]s in the grid. @@ -302,9 +305,8 @@ impl Board { .filter(|coord| coord != queen), ); hs.extend( - self.all_coords() + self.coords_for_color(&self.color(queen)) .iter() - .filter(|coord| self.color(coord) == self.color(queen)) .filter(|coord| coord != queen), ); if queen.0 > 0 && queen.1 > 0 {