[board] Implement BitAndAssign and BitOrAssign on BitBoard

This commit is contained in:
Eryn Wells 2023-12-29 16:34:11 -08:00
parent 808222eef1
commit 53dc80b6bb

View file

@ -3,7 +3,7 @@
use super::BitScanner;
use crate::Square;
use std::fmt;
use std::ops::{BitAnd, BitOr, Not};
use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, Not};
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
pub(crate) struct BitBoard(pub(super) u64);
@ -89,13 +89,29 @@ macro_rules! infix_op {
};
}
macro_rules! assign_op {
($trait_type:ident, $func_name:ident, $left_type:ty, $op:tt) => {
impl $trait_type for $left_type {
#[inline]
fn $func_name(&mut self, rhs: Self) {
self.0 $op rhs.0
}
}
};
}
infix_op!(BitAnd, bitand, BitBoard, BitBoard, &);
infix_op!(BitAnd, bitand, &BitBoard, BitBoard, &);
infix_op!(BitAnd, bitand, BitBoard, &BitBoard, &);
infix_op!(BitAnd, bitand, &BitBoard, &BitBoard, &);
assign_op!(BitAndAssign, bitand_assign, BitBoard, &=);
assign_op!(BitOrAssign, bitor_assign, BitBoard, |=);
infix_op!(BitOr, bitor, BitBoard, BitBoard, |);
infix_op!(BitOr, bitor, &BitBoard, BitBoard, |);
infix_op!(BitOr, bitor, BitBoard, &BitBoard, |);
infix_op!(BitOr, bitor, &BitBoard, &BitBoard, |);
impl Not for BitBoard {
type Output = BitBoard;