pub mod attack_tables;
mod bitboard256;
mod bitboard_set;
mod move_list;
pub mod movegen;
#[cfg(feature = "initial-positions")]
pub mod initial_positions;
pub mod perft;
mod parser;
pub use parser::{
PositionState, SfenError, generate_position_state, generate_sfen,
generate_sfen_from_position_state, generate_sfen_with_ply, parse_sfen,
};
mod lookup;
pub mod zobrist;
pub mod position;
pub(crate) mod state_info;
pub(crate) mod mate_constant;
#[cfg(test)]
pub(crate) mod test_support;
pub use crate::types::Bitboard;
pub use attack_tables::{
GOLD_ATTACKS, KING_ATTACKS, KNIGHT_ATTACKS, PAWN_ATTACKS, SILVER_ATTACKS, check_candidate_bb,
};
pub use bitboard_set::BitboardSet;
pub use bitboard256::Bitboard256;
#[cfg(feature = "initial-positions")]
pub use initial_positions::InitialPosition;
pub use move_list::{Move32List, MoveList};
pub use movegen::{
CapturePlusPro, CapturePlusProAll, Captures, CapturesAll, Checks, ChecksAll, Evasions,
EvasionsAll, Legal, LegalAll, Move32Sink, MoveGenType, NonEvasions, NonEvasionsAll,
QuietChecks, QuietChecksAll, Quiets, QuietsAll, QuietsProMinus, QuietsProMinusAll, Recaptures,
RecapturesAll, generate_legal_all_move32, generate_legal_all_move32_into,
generate_legal_evasions_all_move32, generate_legal_evasions_all_move32_into,
generate_legal_evasions_move32, generate_legal_evasions_move32_into, generate_moves,
generate_moves_move32, generate_moves_move32_into, generate_moves_to_move32,
generate_moves_to_move32_into, generate_quiet_checks, generate_recaptures,
generate_recaptures_all, generate_recaptures_all_move32, generate_recaptures_move32,
};
pub use position::{
BoardArray, CapturedPieceDelta, DeclarationDetail, DeclarationEvaluation, MoveApplyFacts,
MoveDelta32, MoveStackSiteFacts, PackedPiece, PartialKeys, Ply, Position, StateCacheView,
StateHistory, StateHistoryEntry, ValidationIssue, ValidationReport,
};
#[cfg(feature = "position-serialization")]
pub use position::{
HuffmanCodedPos, HuffmanCodedPosError, PackedSfen, PackedSfenError, PackedSfenSink,
};
pub use state_info::CheckSquares;
#[cfg(test)]
mod tests;
pub const STARTPOS_SFEN: &str = "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1";
pub fn init() {
Bitboard::init_tables();
}
pub fn position_from_sfen(sfen: &str) -> Result<Position, parser::SfenError> {
let mut pos = Position::empty();
pos.set_sfen(sfen)?;
Ok(pos)
}
#[must_use]
pub fn position_from_position_state(state: &PositionState) -> Position {
let mut pos = Position::empty();
pos.set_position_state(state);
pos
}
#[must_use]
pub fn hirate_position() -> Position {
let mut pos = Position::empty();
pos.set_hirate();
pos
}
#[must_use]
pub fn move_from_usi(pos: &Position, usi: &str) -> Option<crate::types::Move32> {
use crate::types::{Move, Move32};
let mv16 = Move::from_usi(usi)?;
if mv16.is_drop() {
let piece_type = mv16.dropped_piece()?;
Some(Move32::drop(piece_type, mv16.to_sq(), pos.turn()))
} else {
let from = mv16.from_sq();
let to = mv16.to_sq();
let piece = pos.piece_on(from);
if mv16.is_promotion() {
Some(Move32::promotion(from, to, piece))
} else {
Some(Move32::normal(from, to, piece))
}
}
}
#[must_use]
pub fn move_from_usi_expect(pos: &Position, usi: &str) -> crate::types::Move32 {
move_from_usi(pos, usi).unwrap_or_else(|| panic!("invalid USI move: {usi}"))
}