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]
    }
}