MAJOR (25%+) perf increase with propegate iterator and copies
This commit is contained in:
parent
3096c4d85b
commit
176505b897
21
src/board.rs
21
src/board.rs
@ -166,7 +166,7 @@ impl Board {
|
||||
}
|
||||
|
||||
/// Get a reference to a backing [`BitBoard`]
|
||||
pub const fn board(&self, color: Piece) -> &BitBoard {
|
||||
const fn board(&self, color: Piece) -> &BitBoard {
|
||||
match color {
|
||||
Piece::Black => &self.black_board,
|
||||
Piece::White => &self.white_board,
|
||||
@ -174,7 +174,7 @@ impl Board {
|
||||
}
|
||||
|
||||
/// Get a mutable reference to a backing [`BitBoard`]
|
||||
pub const fn board_mut(&mut self, color: Piece) -> &mut BitBoard {
|
||||
const fn board_mut(&mut self, color: Piece) -> &mut BitBoard {
|
||||
match color {
|
||||
Piece::Black => &mut self.black_board,
|
||||
Piece::White => &mut self.white_board,
|
||||
@ -249,13 +249,19 @@ impl Board {
|
||||
return 0;
|
||||
};
|
||||
|
||||
let pos_s: Vec<(usize, usize)> = self.propegate_from_dry(i, j, starting_color).collect();
|
||||
let pos_len = pos_s.len();
|
||||
for (i, j) in pos_s {
|
||||
// PERF! avoid clones and collections here using raw pointers
|
||||
let iterator = unsafe {
|
||||
// SAFETY! `propegate_from_dry` should not have overlapping chains
|
||||
// if overlapping chains were to exist, `self.place_unchecked` could collide with `self.get`
|
||||
(&*(self as *const Self)).propegate_from_dry(i, j, starting_color)
|
||||
};
|
||||
let mut count = 0;
|
||||
for &(i, j) in iterator {
|
||||
self.place_unchecked(i, j, starting_color);
|
||||
count += 1;
|
||||
}
|
||||
|
||||
pos_len
|
||||
count
|
||||
}
|
||||
|
||||
/// Propegate piece captures originating from (i, j)
|
||||
@ -266,7 +272,7 @@ impl Board {
|
||||
i: usize,
|
||||
j: usize,
|
||||
starting_color: Piece,
|
||||
) -> impl Iterator<Item = (usize, usize)> + use<'_> {
|
||||
) -> impl Iterator<Item = &(usize, usize)> + use<'_> {
|
||||
ADJ_LOOKUP[i][j]
|
||||
.iter()
|
||||
.filter_map(move |chain| {
|
||||
@ -281,7 +287,6 @@ impl Board {
|
||||
end_idx.and_then(|idx| chain.get(..idx))
|
||||
})
|
||||
.flatten()
|
||||
.cloned()
|
||||
}
|
||||
|
||||
/// Count the number of a type of [`Piece`] on the board
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user