1
0
Fork 0

wip: misc

This commit is contained in:
Paul-Nicolas Madelaine 2025-12-17 23:30:13 +01:00
parent 9ac271f276
commit 42ccddc12b
2 changed files with 46 additions and 21 deletions

View file

@ -308,12 +308,6 @@ impl Position {
from: Bitboard, from: Bitboard,
to: Bitboard, to: Bitboard,
} }
impl<const ROLE: u8> MoveGenImpl<ROLE> {
#[inline]
fn new(role: Role, from: Bitboard, to: Bitboard) -> Self {
Self { role, from, to }
}
}
impl<const ROLE: u8> MoveGen<RawMove> for MoveGenImpl<ROLE> { impl<const ROLE: u8> MoveGen<RawMove> for MoveGenImpl<ROLE> {
#[inline] #[inline]
fn roles(&self, role: Role) -> bool { fn roles(&self, role: Role) -> bool {
@ -348,7 +342,6 @@ impl Position {
to, to,
promotion, promotion,
} = uci; } = uci;
let role = self.0.role(from).ok_or(InvalidUciMove::Illegal)?;
#[inline] #[inline]
fn aux<'l, const ROLE: u8>( fn aux<'l, const ROLE: u8>(
position: &'l Position, position: &'l Position,
@ -356,13 +349,18 @@ impl Position {
from: Square, from: Square,
to: Square, to: Square,
) -> Result<Move<'l>, InvalidUciMove> { ) -> Result<Move<'l>, InvalidUciMove> {
let mut moves = MoveGenImpl::<ROLE>::new(role, from.bitboard(), to.bitboard()); let mut moves = MoveGenImpl::<ROLE> {
role,
from: from.bitboard(),
to: to.bitboard(),
};
let raw = position let raw = position
.generate_moves(&mut moves) .generate_moves(&mut moves)
.break_value() .break_value()
.ok_or(InvalidUciMove::Illegal)?; .ok_or(InvalidUciMove::Illegal)?;
Ok(unsafe { Move::new(position, raw) }) Ok(unsafe { Move::new(position, raw) })
} }
let role = self.0.role(from).ok_or(InvalidUciMove::Illegal)?;
let promotion = if role == Role::Pawn { let promotion = if role == Role::Pawn {
promotion.unwrap_or(Role::Pawn) promotion.unwrap_or(Role::Pawn)
} else if promotion.is_some() { } else if promotion.is_some() {
@ -381,18 +379,6 @@ impl Position {
found: Option<RawMove>, found: Option<RawMove>,
found_other: bool, found_other: bool,
} }
impl<const ROLE: u8> MoveGenImpl<ROLE> {
#[inline]
fn new(role: Role, from: Bitboard, to: Bitboard) -> Self {
Self {
role,
from,
to,
found: None,
found_other: false,
}
}
}
impl<const ROLE: u8> MoveGen<Infallible> for MoveGenImpl<ROLE> { impl<const ROLE: u8> MoveGen<Infallible> for MoveGenImpl<ROLE> {
#[inline] #[inline]
fn roles(&self, role: Role) -> bool { fn roles(&self, role: Role) -> bool {
@ -466,7 +452,13 @@ impl Position {
from: Bitboard, from: Bitboard,
to: Bitboard, to: Bitboard,
) -> Result<Move<'l>, InvalidSan> { ) -> Result<Move<'l>, InvalidSan> {
let mut moves = MoveGenImpl::<ROLE>::new(role, from, to); let mut moves = MoveGenImpl::<ROLE> {
role,
from,
to,
found: None,
found_other: false,
};
let ControlFlow::Continue(()) = position.generate_moves(&mut moves); let ControlFlow::Continue(()) = position.generate_moves(&mut moves);
match moves.found { match moves.found {
None => Err(InvalidSan::Illegal), None => Err(InvalidSan::Illegal),

View file

@ -2,6 +2,7 @@ use eschac::board::*;
use eschac::position::*; use eschac::position::*;
use eschac::san::*; use eschac::san::*;
use eschac::setup::*; use eschac::setup::*;
use eschac::uci::*;
static P1: &'static str = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq -"; static P1: &'static str = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq -";
static P2: &'static str = "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -"; static P2: &'static str = "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -";
@ -319,6 +320,38 @@ fn san() {
); );
} }
#[test]
fn uci_move() {
let position = Setup::from_text_record("3qk3/2P5/8/8/8/8/8/B3K2R w K -")
.unwrap()
.into_position()
.unwrap();
for uci in ["a1a1", "a1a2", "c7b8q", "c7c8", "c7d8"].map(|s| s.parse::<UciMove>().unwrap()) {
assert!(uci.to_move(&position).is_err(), "{uci}");
}
for uci in ["c7c8q", "c7d8n", "e1g1"].map(|s| s.parse::<UciMove>().unwrap()) {
assert!(uci.to_move(&position).is_ok(), "{uci}");
}
assert_eq!(
"h1h8"
.parse::<UciMove>()
.unwrap()
.to_move(&position)
.unwrap()
.role(),
Role::Rook,
);
assert_eq!(
"a1h8"
.parse::<UciMove>()
.unwrap()
.to_move(&position)
.unwrap()
.role(),
Role::Bishop,
);
}
#[test] #[test]
fn max_legal_moves() { fn max_legal_moves() {
let position = Setup::from_text_record("R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNN1KB1 w - -") let position = Setup::from_text_record("R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNN1KB1 w - -")