use std::default::Default;
use ::{ Position, Tile, Grid, Axes, Color };
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum BoundState {
OutOfBound,
Tile(Tile),
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct Alignment(pub BoundState, pub usize, pub usize, pub BoundState);
impl Alignment {
pub fn len(&self) -> usize {
let &Alignment(_, backward, forward, _) = self;
backward + forward + 1
}
pub fn is_empty(&self) -> bool {
self.len() == 1
}
}
impl Default for Alignment {
fn default() -> Self {
Alignment(BoundState::OutOfBound, 0, 0, BoundState::OutOfBound)
}
}
fn horizontal_alignment(grid: &Grid, (x, y): Position, color: Color) -> Alignment {
let mut alignment = Alignment::default();
if y >= 1 {
for y in (0...y - 1).rev() {
match grid[x][y] {
Some(c) if c == color => alignment.1 += 1,
tile => { alignment.0 = BoundState::Tile(tile); break },
}
}
}
for y in y + 1..::GRID_LEN {
match grid[x][y] {
Some(c) if c == color => alignment.2 += 1,
tile => { alignment.3 = BoundState::Tile(tile); break },
}
}
alignment
}
fn diagonal_up_alignment(grid: &Grid, pos: Position, color: Color) -> Alignment {
let (mut x, mut y) = pos;
let mut alignment = Alignment::default();
x += 1;
y = y.wrapping_sub(1);
while x < ::GRID_LEN && y < ::GRID_LEN { match grid[x][y] {
Some(c) if c == color => alignment.1 += 1,
tile => { alignment.0 = BoundState::Tile(tile); break },
}
x += 1;
y = y.wrapping_sub(1);
}
let (mut x, mut y) = pos;
x = x.wrapping_sub(1);
y += 1;
while x < ::GRID_LEN && y < ::GRID_LEN { match grid[x][y] {
Some(c) if c == color => alignment.2 += 1,
tile => { alignment.3 = BoundState::Tile(tile); break },
}
x = x.wrapping_sub(1);
y += 1;
}
alignment
}
fn vertical_alignment(grid: &Grid, (x, y): Position, color: Color) -> Alignment {
let mut alignment = Alignment::default();
if x >= 1 {
for x in (0...x - 1).rev() {
match grid[x][y] {
Some(c) if c == color => alignment.1 += 1,
tile => { alignment.0 = BoundState::Tile(tile); break },
}
}
}
for x in x + 1..::GRID_LEN {
match grid[x][y] {
Some(c) if c == color => alignment.2 += 1,
tile => { alignment.3 = BoundState::Tile(tile); break },
}
}
alignment
}
fn diagonal_down_alignment(grid: &Grid, pos: Position, color: Color) -> Alignment {
let (mut x, mut y) = pos;
let mut alignment = Alignment::default();
x = x.wrapping_sub(1);
y = y.wrapping_sub(1);
while x < ::GRID_LEN && y < ::GRID_LEN { match grid[x][y] {
Some(c) if c == color => alignment.1 += 1,
tile => { alignment.0 = BoundState::Tile(tile); break },
}
x = x.wrapping_sub(1);
y = y.wrapping_sub(1);
}
let (mut x, mut y) = pos;
x += 1;
y += 1;
while x < ::GRID_LEN && y < ::GRID_LEN {
match grid[x][y] {
Some(c) if c == color => alignment.2 += 1,
tile => { alignment.3 = BoundState::Tile(tile); break },
}
x += 1;
y += 1;
}
alignment
}
pub fn get_alignments(grid: &Grid, pos: Position, color: Color) -> Axes<Alignment> {
let vert = vertical_alignment(grid, pos, color);
let diag_up = diagonal_up_alignment(grid, pos, color);
let hori = horizontal_alignment(grid, pos, color);
let diag_down = diagonal_down_alignment(grid, pos, color);
Axes::new(vert, diag_up, hori, diag_down)
}
#[cfg(test)]
mod tests {
use test::Bencher;
use ::{Axes, Alignment, BoundState};
use ::functions::alignments::*;
use color::Color;
#[bench]
fn alignments_horizontal_forward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let n = None;
let grid = [[n, b, b, b, b, b, b, b, b, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let expected_align = Alignment(BoundState::OutOfBound, 0, 8, BoundState::Tile(n));
bencher.iter(|| {
let alignment = horizontal_alignment(&grid, (0, 0), Color::Black);
assert_eq!(alignment, expected_align);
assert_eq!(alignment.len(), 9);
});
}
#[bench]
fn alignments_horizontal_backward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let n = None;
let grid = [[b, b, b, b, b, n, n, b, b, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::OutOfBound, 5, 0, BoundState::Tile(n));
bencher.iter(||
assert_eq!(horizontal_alignment(&grid, (0, 5), Color::Black), alignment)
);
}
#[bench]
fn alignments_horizontal_backward_and_forward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let n = None;
let grid = [[b, b, b, n, b, b, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::OutOfBound, 3, 2, BoundState::Tile(n));
bencher.iter(||
assert_eq!(horizontal_alignment(&grid, (0, 3), Color::Black), alignment)
);
}
#[bench]
fn alignments_diagonal_up_forward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::Tile(w), 0, 5, BoundState::Tile(n));
bencher.iter(||
assert_eq!(diagonal_up_alignment(&grid, (8, 2), Color::Black), alignment)
);
}
#[bench]
fn alignments_diagonal_up_backward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::Tile(w), 5, 0, BoundState::Tile(n));
bencher.iter(||
assert_eq!(diagonal_up_alignment(&grid, (3, 7), Color::Black), alignment)
);
}
#[bench]
fn alignments_diagonal_up_backward_and_forward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, w, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::Tile(n), 3, 2, BoundState::Tile(w));
bencher.iter(||
assert_eq!(diagonal_up_alignment(&grid, (5, 5), Color::Black), alignment)
);
}
#[bench]
fn alignments_vertical_forward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::Tile(w), 0, 5, BoundState::Tile(w));
bencher.iter(||
assert_eq!(vertical_alignment(&grid, (3, 4), Color::Black), alignment)
);
}
#[bench]
fn alignments_vertical_backward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::Tile(w), 5, 0, BoundState::Tile(n));
bencher.iter(||
assert_eq!(vertical_alignment(&grid, (8, 4), Color::Black), alignment)
);
}
#[bench]
fn alignments_vertical_backward_and_forward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::Tile(w), 3, 2, BoundState::Tile(w));
bencher.iter(||
assert_eq!(vertical_alignment(&grid, (6, 4), Color::Black), alignment)
);
}
#[bench]
fn alignments_diagonal_down_forward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::Tile(w), 0, 5, BoundState::Tile(n));
bencher.iter(||
assert_eq!(diagonal_down_alignment(&grid, (2, 2), Color::Black), alignment)
);
}
#[bench]
fn alignments_diagonal_down_backward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, w, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::Tile(n), 5, 0, BoundState::Tile(w));
bencher.iter(||
assert_eq!(diagonal_down_alignment(&grid, (7, 7), Color::Black), alignment)
);
}
#[bench]
fn alignments_diagonal_down_backward_and_forward(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, w, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignment = Alignment(BoundState::Tile(n), 3, 2, BoundState::Tile(w));
bencher.iter(||
assert_eq!(diagonal_down_alignment(&grid, (5, 5), Color::Black), alignment)
);
}
#[bench]
fn alignments_list_all(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n],
[n, w, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n],
[n, n, b, n, b, n, b, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, b, b, b, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, b, b, n, b, w, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, b, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignments = Axes::new(
Alignment(BoundState::Tile(n), 2, 0, BoundState::Tile(n)),
Alignment(BoundState::Tile(n), 2, 4, BoundState::OutOfBound),
Alignment(BoundState::Tile(n), 2, 1, BoundState::Tile(w)),
Alignment(BoundState::Tile(w), 2, 1, BoundState::Tile(n))
);
bencher.iter(||
assert_eq!(get_alignments(&grid, (4, 4), Color::Black), alignments)
);
}
#[bench]
fn alignments_list_all_too_small(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[n, n, n, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n],
[n, w, n, n, n, n, n, b, n, n, n, n, n, n, n, n, n, n, n],
[n, n, b, n, b, n, b, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, b, b, b, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, w, n, w, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, b, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, b, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let alignments = Axes::new(
Alignment(BoundState::Tile(n), 2, 0, BoundState::Tile(n)),
Alignment(BoundState::Tile(n), 2, 4, BoundState::OutOfBound),
Alignment(BoundState::Tile(w), 0, 0, BoundState::Tile(w)),
Alignment(BoundState::Tile(w), 2, 1, BoundState::Tile(n))
);
bencher.iter(||
assert_eq!(get_alignments(&grid, (4, 4), Color::Black), alignments)
);
}
}