|
@@ -102,15 +102,15 @@ impl Move {
|
|
|
*
|
|
|
* Extracts every bit out of the bitboard and returns each one as a separate bitboard.
|
|
|
*/
|
|
|
-pub struct BitboardIterator { pub board: Bitboard }
|
|
|
+pub struct BitboardIterator (pub Bitboard);
|
|
|
|
|
|
impl Iterator for BitboardIterator {
|
|
|
type Item = Bitboard;
|
|
|
|
|
|
fn next(&mut self) -> Option<Bitboard> {
|
|
|
- if self.board != 0 {
|
|
|
- let lsb = self.board & (self.board.wrapping_neg());
|
|
|
- self.board ^= lsb;
|
|
|
+ if self.0 != 0 {
|
|
|
+ let lsb = self.0 & (self.0.wrapping_neg());
|
|
|
+ self.0 ^= lsb;
|
|
|
//Some(lsb.trailing_zeros())
|
|
|
Some(lsb)
|
|
|
} else {
|
|
@@ -197,17 +197,6 @@ pub fn sort_moves(game: &Game, move_list: &mut Vec<Move>) {
|
|
|
}
|
|
|
|
|
|
|
|
|
-/*
|
|
|
-pub fn generate_pawn_moves(game: &Game, side: Side) -> Bitboard {
|
|
|
- let pushed = generate_pawn_pushes(game, side);
|
|
|
- let iter = BitboardIterator { board: pushed };
|
|
|
- for p in iter {
|
|
|
- println!("{}", p.trailing_zeros());
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}*/
|
|
|
-
|
|
|
fn generate_pawn_pushes(game: &Game, side: Side, move_list: &mut Vec<Move>) {
|
|
|
let pawns = game.pawns(side);
|
|
|
let others = game.get_all_side(!side);
|
|
@@ -218,7 +207,7 @@ fn generate_pawn_pushes(game: &Game, side: Side, move_list: &mut Vec<Move>) {
|
|
|
BLACK => south_one(pawns)
|
|
|
} & !(ROW_1 | ROW_8) & !(others | pieces);
|
|
|
|
|
|
- let iter = BitboardIterator { board: moved_pawns & !others };
|
|
|
+ let iter = BitboardIterator(moved_pawns & !others);
|
|
|
for p in iter {
|
|
|
let origin = match side {
|
|
|
WHITE => south_one(p),
|
|
@@ -241,7 +230,7 @@ fn generate_pawn_doublepushes(game: &Game, side: Side, move_list: &mut Vec<Move>
|
|
|
BLACK => south_one(south_one(pawns) & !all_pieces)
|
|
|
} & !all_pieces;
|
|
|
|
|
|
- let iter = BitboardIterator { board: moved_pawns & !others };
|
|
|
+ let iter = BitboardIterator(moved_pawns & !others);
|
|
|
for p in iter {
|
|
|
let origin = match side {
|
|
|
WHITE => south_one(south_one(p)),
|
|
@@ -256,7 +245,7 @@ fn generate_pawn_captures(game: &Game, side: Side, move_list: &mut Vec<Move>) {
|
|
|
let others = game.get_all_side(!side);
|
|
|
let promotion_mask = ROW_1 | ROW_8;
|
|
|
|
|
|
- let pawn_iterator = BitboardIterator { board: pawns };
|
|
|
+ let pawn_iterator = BitboardIterator(pawns);
|
|
|
|
|
|
for pawn in pawn_iterator {
|
|
|
let left_cap = match side {
|
|
@@ -295,7 +284,7 @@ fn generate_promotions(game: &Game, side: Side, move_list: &mut Vec<Move>) {
|
|
|
BLACK => south_one(pawns)
|
|
|
} & (ROW_1 | ROW_8) & !(others | pieces);
|
|
|
|
|
|
- let iter = BitboardIterator { board: moved_pawns };
|
|
|
+ let iter = BitboardIterator(moved_pawns);
|
|
|
for p in iter {
|
|
|
let origin = match side {
|
|
|
WHITE => south_one(p),
|
|
@@ -350,7 +339,7 @@ fn generate_knight_moves(game: &Game, side: Side, move_list: &mut Vec<Move>, cap
|
|
|
let others = game.get_all_side(!side);
|
|
|
|
|
|
let knights = game.knights(side);
|
|
|
- let knight_iter = BitboardIterator{ board: knights };
|
|
|
+ let knight_iter = BitboardIterator(knights);
|
|
|
|
|
|
for k in knight_iter {
|
|
|
let target_mask = if captures_only {
|
|
@@ -358,7 +347,7 @@ fn generate_knight_moves(game: &Game, side: Side, move_list: &mut Vec<Move>, cap
|
|
|
} else {
|
|
|
!friends
|
|
|
};
|
|
|
- let targets = BitboardIterator { board: get_knight_targets(square(k)) & target_mask };
|
|
|
+ let targets = BitboardIterator(get_knight_targets(square(k)) & target_mask);
|
|
|
for target in targets {
|
|
|
let simple_move = SimpleMove { from: square(k), to: square(target) };
|
|
|
move_list.push(Move::Default{ mov: simple_move, piece_type: KNIGHT });
|
|
@@ -408,13 +397,13 @@ fn generate_queen_moves(game: &Game, side: Side, move_list: &mut Vec<Move>, capt
|
|
|
|
|
|
fn generate_sliding_moves(friends: Bitboard, others: Bitboard, pieces: Bitboard, piece_type: PieceType,
|
|
|
straight: bool, diagonal: bool, move_list: &mut Vec<Move>, captures_only: bool) {
|
|
|
- let pieces_iter = BitboardIterator { board: pieces };
|
|
|
+ let pieces_iter = BitboardIterator(pieces);
|
|
|
|
|
|
let mask = if captures_only { others } else { !(0 as Bitboard) };
|
|
|
|
|
|
for piece in pieces_iter {
|
|
|
let destinations = generate_sliding_destinations(friends, others, piece, straight, diagonal);
|
|
|
- let dest_iter = BitboardIterator { board: destinations & mask };
|
|
|
+ let dest_iter = BitboardIterator(destinations & mask);
|
|
|
for dest in dest_iter {
|
|
|
let smove = SimpleMove{ from: square(piece), to: square(dest) };
|
|
|
move_list.push(Move::Default { mov: smove, piece_type: piece_type});
|
|
@@ -487,7 +476,7 @@ fn generate_king_moves(game: &Game, side: Side, move_list: &mut Vec<Move>, captu
|
|
|
| southeast_one(king))
|
|
|
& mask;
|
|
|
|
|
|
- let area_iter = BitboardIterator { board: area };
|
|
|
+ let area_iter = BitboardIterator(area);
|
|
|
for destination in area_iter {
|
|
|
let simple_move = SimpleMove{ from: square(king), to: square(destination) };
|
|
|
move_list.push(Move::Default { mov: simple_move, piece_type: KING });
|