timecat 1.52.0

A NNUE-based chess engine that implements the Negamax algorithm and can be integrated into any project as a library. It features move generation, advanced position evaluation through NNUE, and move searching capabilities.
Documentation
use super::*;

#[inline]
pub fn identity_function<T>(item: T) -> T {
    item
}

pub fn print_uci_info<T: fmt::Display>(message: &str, info: impl Into<Option<T>>) {
    if !GLOBAL_TIMECAT_STATE.is_in_debug_mode() {
        return;
    }
    let mut to_print = info.into().map_or_else(
        || message.colorize(SUCCESS_MESSAGE_STYLE),
        |info_message| {
            format!(
                "{} {}",
                message.colorize(SUCCESS_MESSAGE_STYLE),
                info_message.colorize(INFO_MESSAGE_STYLE),
            )
        },
    );
    if GLOBAL_TIMECAT_STATE.is_in_uci_mode() {
        to_print = format!("{} {to_print}", "info string".colorize(INFO_MESSAGE_STYLE))
    }
    println_wasm!("{to_print}");
}

#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct TimecatDefaults {
    #[cfg(feature = "colored")]
    pub colored: bool,
    pub console_mode: bool,
    pub t_table_size: CacheTableSize,
    pub long_algebraic_notation: bool,
    pub num_threads: NonZeroUsize,
    pub move_overhead: Duration,
    pub use_own_book: bool,
    pub book_path: Option<&'static str>,
    pub inbuilt_book_bytes: Option<&'static [u8]>,
    pub debug_mode: bool,
    pub chess960_mode: bool,
}

#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug)]
pub struct GlobalTimecatState {
    #[cfg(feature = "colored")]
    _colored: AtomicBool,
    _console_mode: AtomicBool,
    _long_algebraic_notation: AtomicBool,
    _debug_mode: AtomicBool,
}

impl Default for GlobalTimecatState {
    fn default() -> Self {
        Self::new()
    }
}

impl GlobalTimecatState {
    pub const fn new() -> Self {
        Self {
            #[cfg(feature = "colored")]
            _colored: AtomicBool::new(TIMECAT_DEFAULTS.colored),
            _console_mode: AtomicBool::new(TIMECAT_DEFAULTS.console_mode),
            _long_algebraic_notation: AtomicBool::new(TIMECAT_DEFAULTS.long_algebraic_notation),
            _debug_mode: AtomicBool::new(TIMECAT_DEFAULTS.debug_mode),
        }
    }

    #[inline]
    #[cfg(feature = "colored")]
    pub fn is_colored_output(&self) -> bool {
        self._colored.load(MEMORY_ORDERING)
    }

    #[inline]
    #[cfg(not(feature = "colored"))]
    pub fn is_colored(&self) -> bool {
        false
    }

    #[cfg(feature = "colored")]
    pub fn set_colored_output(&self, b: bool, verbose: bool) {
        self._colored.store(b, MEMORY_ORDERING);
        if verbose {
            print_uci_info("Colored output is set to", b);
        }
    }

    #[inline]
    pub fn is_in_console_mode(&self) -> bool {
        self._console_mode.load(MEMORY_ORDERING)
    }

    #[inline]
    pub fn is_in_uci_mode(&self) -> bool {
        !self.is_in_console_mode()
    }

    pub fn set_console_mode(&self, b: bool, verbose: bool) {
        self._console_mode.store(b, MEMORY_ORDERING);
        self._debug_mode.store(b, MEMORY_ORDERING);
        if verbose {
            force_println_info("Console mode is set to", b);
        }
    }

    pub fn set_uci_mode(&self, b: bool, verbose: bool) {
        self.set_console_mode(!b, false);
        if verbose {
            force_println_info("UCI mode is set to", b);
        }
    }

    #[inline]
    pub fn set_to_uci_mode(&self) {
        self.set_uci_mode(true, false);
    }

    #[inline]
    pub fn set_to_console_mode(&self) {
        self.set_console_mode(true, false);
    }

    #[inline]
    pub fn use_long_algebraic_notation(&self) -> bool {
        self._long_algebraic_notation.load(MEMORY_ORDERING)
    }

    pub fn set_long_algebraic_notation(&self, b: bool) {
        self._long_algebraic_notation.store(b, MEMORY_ORDERING);
        print_uci_info("Long algebraic notation is set to", b);
    }

    #[inline]
    pub fn is_in_debug_mode(&self) -> bool {
        self._debug_mode.load(MEMORY_ORDERING)
    }

    pub fn set_debug_mode(&self, b: bool) {
        self._debug_mode.store(b, MEMORY_ORDERING);
        print_uci_info("Debug Mode is set to", b);
    }
}