1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
use crate::*;
crate::helpers::simple_enum! {
/// A file on a chessboard
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub enum File {
A,
B,
C,
D,
E,
F,
G,
H
}
}
crate::helpers::enum_char_conv! {
File, FileParseError {
A = 'a',
B = 'b',
C = 'c',
D = 'd',
E = 'e',
F = 'f',
G = 'g',
H = 'h'
}
}
impl File {
/// Flip the file.
/// # Examples
/// ```
/// # use cozy_chess_types::*;
/// assert_eq!(File::A.flip(), File::H);
/// ```
#[inline(always)]
pub const fn flip(self) -> Self {
Self::index_const(Self::H as usize - self as usize)
}
/// Get a bitboard with all squares on this file set.
/// # Examples
/// ```
/// # use cozy_chess_types::*;
/// assert_eq!(File::B.bitboard(), bitboard! {
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// });
/// ```
#[inline(always)]
pub const fn bitboard(self) -> BitBoard {
BitBoard(u64::from_ne_bytes([
0b00000001,
0b00000001,
0b00000001,
0b00000001,
0b00000001,
0b00000001,
0b00000001,
0b00000001
]) << self as usize)
}
/// Get a bitboard with all squares on adjacent files set.
/// # Examples
/// ```
/// # use cozy_chess_types::*;
/// assert_eq!(File::C.adjacent(), bitboard! {
/// . X . X . . . .
/// . X . X . . . .
/// . X . X . . . .
/// . X . X . . . .
/// . X . X . . . .
/// . X . X . . . .
/// . X . X . . . .
/// . X . X . . . .
/// });
/// assert_eq!(File::A.adjacent(), bitboard! {
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// . X . . . . . .
/// });
/// assert_eq!(File::H.adjacent(), bitboard! {
/// . . . . . . X .
/// . . . . . . X .
/// . . . . . . X .
/// . . . . . . X .
/// . . . . . . X .
/// . . . . . . X .
/// . . . . . . X .
/// . . . . . . X .
/// });
/// ```
#[inline(always)]
pub const fn adjacent(self) -> BitBoard {
const TABLE: [BitBoard; File::NUM] = {
let mut table = [BitBoard::EMPTY; File::NUM];
let mut i = 0;
while i < table.len() {
if i > 0 {
table[i].0 |= File::index_const(i - 1)
.bitboard().0;
}
if i < (table.len() - 1) {
table[i].0 |= File::index_const(i + 1)
.bitboard().0;
}
i += 1;
}
table
};
TABLE[self as usize]
}
}
