use ::{ Grid, Position, Color };
use ::directions::*;
pub fn get_captures(grid: &Grid, (x, y): Position, color: Color) -> Directions<bool> {
let mut captures = [false; 8];
if x >= 3 {
captures[TOP] = grid[x - 3][y] == Some(color)
&& grid[x - 2][y] == Some(-color)
&& grid[x - 1][y] == Some(-color);
if y <= ::GRID_LEN - 4 {
captures[TOP_RIGHT] = grid[x - 3][y + 3] == Some(color)
&& grid[x - 2][y + 2] == Some(-color)
&& grid[x - 1][y + 1] == Some(-color);
}
}
if y <= ::GRID_LEN - 4 {
captures[RIGHT] = grid[x][y + 3] == Some(color)
&& grid[x][y + 2] == Some(-color)
&& grid[x][y + 1] == Some(-color);
if x <= ::GRID_LEN - 4 {
captures[BOT_RIGHT] = grid[x + 3][y + 3] == Some(color)
&& grid[x + 2][y + 2] == Some(-color)
&& grid[x + 1][y + 1] == Some(-color);
}
}
if x <= ::GRID_LEN - 4 {
captures[BOT] = grid[x + 3][y] == Some(color)
&& grid[x + 2][y] == Some(-color)
&& grid[x + 1][y] == Some(-color);
if y >= 3 {
captures[BOT_LEFT] = grid[x + 3][y - 3] == Some(color)
&& grid[x + 2][y - 2] == Some(-color)
&& grid[x + 1][y - 1] == Some(-color);
}
}
if y >= 3 {
captures[LEFT] = grid[x][y - 3] == Some(color)
&& grid[x][y - 2] == Some(-color)
&& grid[x][y - 1] == Some(-color);
if x >= 3 {
captures[TOP_LEFT] = grid[x - 3][y - 3] == Some(color)
&& grid[x - 2][y - 2] == Some(-color)
&& grid[x - 1][y - 1] == Some(-color);
}
}
captures.into()
}
#[cfg(test)]
mod tests {
use test::Bencher;
use ::directions::*;
use ::get_captures;
use color::Color;
impl Default for Directions<bool> {
fn default() -> Directions<bool> {
[false; 8].into()
}
}
#[bench]
fn captures_top(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[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, 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, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, 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 mut captures = Directions::default();
(*captures)[TOP] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, 3), Color::Black), captures)
});
}
#[bench]
fn captures_top_bounds(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[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],
[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],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, 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, w],
[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]];
let mut captures = Directions::default();
(*captures)[TOP] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, 0), Color::Black), captures);
assert_eq!(get_captures(&grid, (::GRID_LEN - 1, ::GRID_LEN - 1), Color::Black), captures);
});
}
#[bench]
fn captures_top_right(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[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, 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, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, 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 mut captures = Directions::default();
(*captures)[TOP_RIGHT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, 3), Color::Black), captures)
});
}
#[bench]
fn captures_top_right_bounds(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, 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, 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, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, 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, w, 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, n]];
let mut captures = Directions::default();
(*captures)[TOP_RIGHT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, ::GRID_LEN - 4), Color::Black), captures);
assert_eq!(get_captures(&grid, (::GRID_LEN - 1, 0), Color::Black), captures);
});
}
#[bench]
fn captures_right(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, b, w, w, 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]];
let mut captures = Directions::default();
(*captures)[RIGHT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, 3), Color::Black), captures)
});
}
#[bench]
fn captures_right_bounds(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[b, w, w, 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, b, w, w, b]];
let mut captures = Directions::default();
(*captures)[RIGHT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (::GRID_LEN - 1, ::GRID_LEN - 4), Color::Black), captures);
assert_eq!(get_captures(&grid, (0, 0), Color::Black), captures);
});
}
#[bench]
fn captures_bot_right(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, 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, w, 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, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let mut captures = Directions::default();
(*captures)[BOT_RIGHT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, 3), Color::Black), captures)
});
}
#[bench]
fn captures_bot_right_bounds(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[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, w, 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, 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, w, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, b]];
let mut captures = Directions::default();
(*captures)[BOT_RIGHT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (::GRID_LEN - 4, ::GRID_LEN - 4), Color::Black), captures);
assert_eq!(get_captures(&grid, (0, 0), Color::Black), captures);
});
}
#[bench]
fn captures_bot(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, 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, 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, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, 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 mut captures = Directions::default();
(*captures)[BOT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, 3), Color::Black), captures)
});
}
#[bench]
fn captures_bot_bounds(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, 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, 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, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, 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],
[w, 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]];
let mut captures = Directions::default();
(*captures)[BOT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (::GRID_LEN - 4, 0), Color::Black), captures);
assert_eq!(get_captures(&grid, (0, ::GRID_LEN - 1), Color::Black), captures);
});
}
#[bench]
fn captures_bot_left(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, 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, 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, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, 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 mut captures = Directions::default();
(*captures)[BOT_LEFT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, 3), Color::Black), captures)
});
}
#[bench]
fn captures_bot_left_bounds(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, 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, 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, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, 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, w, 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, n]];
let mut captures = Directions::default();
(*captures)[BOT_LEFT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (::GRID_LEN - 4, 3), Color::Black), captures);
assert_eq!(get_captures(&grid, (0, ::GRID_LEN - 1), Color::Black), captures);
});
}
#[bench]
fn captures_left(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],
[b, w, w, 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]];
let mut captures = Directions::default();
(*captures)[LEFT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, 3), Color::Black), captures)
});
}
#[bench]
fn captures_left_bounds(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[b, w, w, 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, b, w, w, b]];
let mut captures = Directions::default();
(*captures)[LEFT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (0, 3), Color::Black), captures);
assert_eq!(get_captures(&grid, (::GRID_LEN - 1, ::GRID_LEN - 1), Color::Black), captures);
});
}
#[bench]
fn captures_top_left(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[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, w, 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, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, 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 mut captures = Directions::default();
(*captures)[TOP_LEFT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, 3), Color::Black), captures)
});
}
#[bench]
fn captures_top_left_bounds(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[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, w, 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, 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, w, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, b]];
let mut captures = Directions::default();
(*captures)[TOP_LEFT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (3, 3), Color::Black), captures);
assert_eq!(get_captures(&grid, (::GRID_LEN - 1, ::GRID_LEN - 1), Color::Black), captures);
});
}
#[bench]
fn captures_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, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, 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, b, n, n, b, n, n, n, n, n, n],
[n, n, n, n, n, n, n, w, n, w, n, w, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, w, w, w, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, b, w, w, b, w, w, b, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, w, w, w, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, w, n, w, n, w, n, n, n, n, n, n, n],
[n, n, n, n, n, n, b, n, n, b, 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]];
let captures: Directions<_> = [true; 8].into();
bencher.iter(|| {
assert_eq!(get_captures(&grid, (8, 9), Color::Black), captures);
});
}
#[bench]
fn captures_right_and_bot(bencher: &mut Bencher) {
let b = Some(Color::Black);
let w = Some(Color::White);
let n = None;
let grid = [[w, n, w, n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, w, w, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[w, w, b, w, w, b, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, w, w, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[w, n, w, n, w, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, b, 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, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n]];
let mut captures = Directions::default();
(*captures)[RIGHT] = true;
(*captures)[BOT_RIGHT] = true;
(*captures)[BOT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (2, 2), Color::Black), captures);
});
}
#[bench]
fn captures_left_and_top(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, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n],
[n, n, n, n, n, n, n, n, 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, b, n, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, w, n, w, n, w],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, w, w, w, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, b, w, w, b, w, w],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, w, w, w, n],
[n, n, n, n, n, n, n, n, n, n, n, n, n, n, w, n, w, n, w]];
let mut captures = Directions::default();
(*captures)[TOP] = true;
(*captures)[LEFT] = true;
(*captures)[TOP_LEFT] = true;
bencher.iter(|| {
assert_eq!(get_captures(&grid, (::GRID_LEN - 3, ::GRID_LEN - 3), Color::Black), captures);
});
}
}