From a6b98abb95e36a52d75f51ba93c568d2b0533302 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Mon, 15 Jan 2024 17:17:34 -0800 Subject: [PATCH] [board] Create a bitboard! macro and BitBoardBuilder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Builder enables cleanly building a BitBoard out of squares. The macro lets you create a BitBoard from a simple list of coordinates: bitboard!(A1, B2, C3, D4, …) --- board/src/bitboard/bitboard.rs | 21 +++++++++++++++++++++ board/src/bitboard/mod.rs | 11 ++++++++++- board/src/lib.rs | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/board/src/bitboard/bitboard.rs b/board/src/bitboard/bitboard.rs index 0ccc713..60d4f22 100644 --- a/board/src/bitboard/bitboard.rs +++ b/board/src/bitboard/bitboard.rs @@ -188,6 +188,27 @@ impl Not for &BitBoard { } } +pub struct BitBoardBuilder(BitBoard); + +impl BitBoardBuilder { + pub const fn empty() -> BitBoardBuilder { + BitBoardBuilder(BitBoard::empty()) + } + + pub fn new(bits: u64) -> BitBoardBuilder { + BitBoardBuilder(BitBoard::new(bits)) + } + + pub fn square(mut self, square: Square) -> BitBoardBuilder { + self.0.set_square(square); + self + } + + pub fn build(&self) -> BitBoard { + self.0 + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/board/src/bitboard/mod.rs b/board/src/bitboard/mod.rs index 6093fa8..238f6ac 100644 --- a/board/src/bitboard/mod.rs +++ b/board/src/bitboard/mod.rs @@ -4,4 +4,13 @@ mod library; mod shifts; pub(crate) use bit_scanner::{LeadingBitScanner, TrailingBitScanner}; -pub(crate) use bitboard::BitBoard; +pub(crate) use bitboard::{BitBoard, BitBoardBuilder}; + +#[macro_export] +macro_rules! bitboard { + ($($sq:ident),*) => { + $crate::bitboard::BitBoardBuilder::empty() + $(.square($crate::Square::$sq))* + .build() + }; +} diff --git a/board/src/lib.rs b/board/src/lib.rs index 03b5c96..cea348e 100644 --- a/board/src/lib.rs +++ b/board/src/lib.rs @@ -1,5 +1,6 @@ // Eryn Wells +#[macro_use] mod bitboard; mod display; mod moves;