Skip to main content

BitBoard

Struct BitBoard 

Source
pub struct BitBoard(pub u64);
Expand description

A BitBoard represents a 64-bit chessboard where each bit corresponds to a square. It is useful for efficiently representing and manipulating chess positions.

The bitboard follows the Little-Endian Rank-File (LERF) notation. In this system, the least significant bit (LSB) represents the bottom-left corner of the chessboard, while the most significant bit (MSB) represents the top-right corner.

8 | 56 57 58 59 60 61 62 63
7 | 48 49 50 51 52 53 54 55
6 | 40 41 42 43 44 45 46 47
5 | 32 33 34 35 36 37 38 39
4 | 24 25 26 27 28 29 30 31
3 | 16 17 18 19 20 21 22 23
2 | 8  9  10 11 12 13 14 15
1 | 0  1  2  3  4  5  6  7
  -------------------------
    A  B  C  D  E  F  G  H

Tuple Fields§

§0: u64

Implementations§

Source§

impl BitBoard

Methods for the BitBoard struct, including utilities for manipulating bits and interacting with squares.

Source

pub const WHITE_SIDE: BitBoard

BitBoard representing WHITE_SIDE.

Source

pub const BLACK_SIDE: BitBoard

BitBoard representing BLACK_SIDE.

Source

pub const FILE_A: BitBoard

BitBoard representing FILE_A.

Source

pub const FILE_B: BitBoard

BitBoard representing FILE_B.

Source

pub const FILE_C: BitBoard

BitBoard representing FILE_C.

Source

pub const FILE_D: BitBoard

BitBoard representing FILE_D.

Source

pub const FILE_E: BitBoard

BitBoard representing FILE_E.

Source

pub const FILE_F: BitBoard

BitBoard representing FILE_F.

Source

pub const FILE_G: BitBoard

BitBoard representing FILE_G.

Source

pub const FILE_H: BitBoard

BitBoard representing FILE_H.

Source

pub const RANK_1: BitBoard

BitBoard representing RANK_1.

Source

pub const RANK_2: BitBoard

BitBoard representing RANK_2.

Source

pub const RANK_3: BitBoard

BitBoard representing RANK_3.

Source

pub const RANK_4: BitBoard

BitBoard representing RANK_4.

Source

pub const RANK_5: BitBoard

BitBoard representing RANK_5.

Source

pub const RANK_6: BitBoard

BitBoard representing RANK_6.

Source

pub const RANK_7: BitBoard

BitBoard representing RANK_7.

Source

pub const RANK_8: BitBoard

BitBoard representing RANK_8.

Source

pub const DARK_SQUARES: BitBoard

BitBoard representing DARK_SQUARES.

Source

pub const LIGHT_SQUARES: BitBoard

BitBoard representing LIGHT_SQUARES.

Source

pub const EMPTY: BitBoard

BitBoard representing EMPTY.

Source

pub const FULL: BitBoard

BitBoard representing FULL.

Source

pub const fn to_square(self) -> Option<Square>

Converts the BitBoard to a Square by returning the square corresponding to the least significant set bit (LSB), or None if the bitboard is empty.

§Examples

// BitBoard with a single bit set at B2
let bitboard = BitBoard(1 << Square::B2 as u64);
assert_eq!(bitboard.to_square(), Some(Square::B2));

// BitBoard with multiple bits set; returns the least significant one (D1)
let bitboard = BitBoard((1 << Square::D1 as u64) | (1 << Square::E1 as u64));
assert_eq!(bitboard.to_square(), Some(Square::D1));

// Empty BitBoard returns None
let bitboard = BitBoard::EMPTY;
assert_eq!(bitboard.to_square(), None);
Source

pub const fn to_square_nearest<const COLOR: usize>(self) -> Option<Square>

Returns the nearest Square set in the bitboard, based on the specified color’s perspective.

This method returns the square corresponding to the most relevant bit set in the bitboard:

  • For White, the nearest square is the least significant bit (LSB), i.e., the lowest square index.
  • For Black, the nearest square is the most significant bit (MSB), i.e., the highest square index.

This is particularly useful when evaluating move generation or determining priority based on color direction.

§Examples

// Bitboard with multiple squares set
let bitboard = BitBoard((1 << Square::C3 as u64) | (1 << Square::E5 as u64));

// From White's perspective, C3 is the closest (LSB)
assert_eq!(bitboard.to_square_nearest::<{Color::White as usize}>(), Some(Square::C3));

// From Black's perspective, E5 is the closest (MSB)
assert_eq!(bitboard.to_square_nearest::<{Color::Black as usize}>(), Some(Square::E5));

// Empty bitboard returns None
let empty = BitBoard::EMPTY;
assert_eq!(empty.to_square_nearest::<{Color::White as usize}>(), None);
Source

pub const fn set_square(self, square: Square) -> Self

Returns a new BitBoard with the bit corresponding to the given Square set to 1.

This operation does not mutate the original BitBoard, but instead returns a new instance with the specified square set.

§Examples

// Setting a bit on an empty square
let bitboard = BitBoard::EMPTY;
assert!(bitboard.is_empty());
let square = Square::C2;
let updated = bitboard.set_square(square);
assert_eq!(updated, BitBoard(1 << Square::C2 as u64));

// Setting a bit on a BitBoard that already has bits set (D1 and E1)
let bitboard = BitBoard((1 << Square::D1 as u64) | (1 << Square::E1 as u64));
let square = Square::C2;
let updated = bitboard.set_square(square);
assert_eq!(updated, BitBoard((1 << Square::D1 as u64) | (1 << Square::E1 as u64) | (1 << Square::C2 as u64)));
Source

pub const fn get_square(self, square: Square) -> bool

Returns true if the bit corresponding to the given Square is set in the BitBoard, otherwise returns false.

This method performs a bitwise check to determine whether the specified square is active (set to 1).

§Examples

let bitboard = BitBoard::EMPTY;
assert!(!bitboard.get_square(Square::C3));

// BitBoard with a single bit set at square C3
let bitboard = BitBoard(1 << Square::C3 as u64);
assert!(bitboard.get_square(Square::C3));

// BitBoard with multiple bits set (E4 and F6)
let bitboard = BitBoard((1 << Square::E4 as u64) | (1 << Square::F6 as u64));
assert!(bitboard.get_square(Square::F6));
assert!(!bitboard.get_square(Square::G1));
Source

pub const fn pop_square(self, square: Square) -> Self

Returns a new BitBoard with the bit corresponding to the given Square cleared (set to 0).

This operation does not mutate the original BitBoard, but returns a new instance with the specified square cleared. If the square was already cleared, the result is unchanged.

§Examples

// Clear a square that is set (C4)
let bitboard = BitBoard(1 << Square::C4 as u64);
let updated = bitboard.pop_square(Square::C4);
assert_eq!(updated, BitBoard::EMPTY);

// Clear a square in a multi-bit board (D5 and E6)
let bitboard = BitBoard((1 << Square::D5 as u64) | (1 << Square::E6 as u64));
let updated = bitboard.pop_square(Square::D5);
let expected = BitBoard(1 << Square::E6 as u64);
assert_eq!(updated, expected);

// Clearing a square that is already empty does nothing
let bitboard = BitBoard(1 << Square::H1 as u64);
let updated = bitboard.pop_square(Square::A2);
assert_eq!(updated, bitboard);
Source

pub const fn count_bits(self) -> u32

Returns the number of set bits in the BitBoard, representing how many squares are currently occupied.

§Examples

// Empty BitBoard has 0 bits set
let bitboard = BitBoard::EMPTY;
assert_eq!(bitboard.count_bits(), 0);

// BitBoard with a single square set (E4)
let bitboard = BitBoard(1 << Square::E4 as u64);
assert_eq!(bitboard.count_bits(), 1);

// BitBoard with multiple squares set (A1, H8 and D4)
let bitboard = BitBoard((1 << Square::A1 as u64)
                      | (1 << Square::H8 as u64)
                      | (1 << Square::D4 as u64));
assert_eq!(bitboard.count_bits(), 3);
Source

pub const fn flip(self) -> Self

Flips the BitBoard vertically by mirroring its bits across the horizontal axis (rank 4).

This operation swaps the ranks of the board so that rank 1 becomes rank 8, rank 2 becomes rank 7, and so on.

§Examples

// A piece on A1 is flipped to A8
let bitboard = BitBoard(1 << Square::A1 as u64);
let flipped = bitboard.flip();
assert_eq!(flipped, BitBoard(1 << Square::A8 as u64));

// Multiple pieces on the first and second ranks flipped to eighth and seventh
let bitboard = BitBoard((1 << Square::B1 as u64) | (1 << Square::C2 as u64));
let flipped = bitboard.flip();
let expected = BitBoard((1 << Square::B8 as u64) | (1 << Square::C7 as u64));
assert_eq!(flipped, expected);

// Flipping twice returns the original position
let original = bitboard;
let flipped_twice = bitboard.flip().flip();
assert_eq!(flipped_twice, original);
Source

pub const fn forward(self, side: Color) -> Self

Shifts the BitBoard one rank forward relative to the side to move.

For White, this shifts all bits one rank up (towards rank 8).
For Black, this shifts all bits one rank down (towards rank 1).

This function is commonly used to generate forward moves, such as pawn pushes, and respects the perspective of the side to move.

§Examples

// A White pawn on D2 moves forward to D3
let white_pawn = BitBoard(1 << Square::D2 as u64);
let advanced = white_pawn.forward(Color::White);
assert_eq!(advanced, BitBoard(1 << Square::D3 as u64));

// A Black pawn on E7 moves forward to E6 (i.e., shifted down the board)
let black_pawn = BitBoard(1 << Square::E7 as u64);
let advanced = black_pawn.forward(Color::Black);
assert_eq!(advanced, BitBoard(1 << Square::E6 as u64));
§Expected behavior

A square on rank 8 remains off-board after shifting forward, and cannot be shifted back by the same operation


let offboard = BitBoard(1 << Square::H8 as u64).forward(Color::White);
assert_eq!(offboard, BitBoard(0));
Source

pub const fn left(self, side: Color) -> Self

Returns a new BitBoard representing the squares to the "left" of the current positions, from the perspective of the given Color.

From White’s perspective, "left" means west (toward file A), and bits are shifted right.

From Black’s perspective, "left" means east (toward file H), and bits are shifted left.

§Examples

// A White piece on D4 moves left to C4
let bitboard = BitBoard(1 << Square::D4 as u64);
let result = bitboard.left(Color::White);
assert_eq!(result, BitBoard(1 << Square::C4 as u64));

// A Black piece on D4 moves left to E4 (inverted perspective)
let bitboard = BitBoard(1 << Square::D4 as u64);
let result = bitboard.left(Color::Black);
assert_eq!(result, BitBoard(1 << Square::E4 as u64));
§Note

This operation does not wrap around the board. Any square on the edge (file A for White, file H for Black) will be cleared in the result.


// A White piece on file A cannot move left
let bitboard = BitBoard(1 << Square::A2 as u64);
assert_eq!(bitboard.left(Color::White), BitBoard::EMPTY);

// A Black piece on file H cannot move left
let bitboard = BitBoard(1 << Square::H7 as u64);
assert_eq!(bitboard.left(Color::Black), BitBoard::EMPTY);
Source

pub const fn left_for<const COLOR: usize>(self) -> Self

Returns a new BitBoard representing the squares to the "left" of the current positions, from the perspective of a specific color known at compile time.

For White, "left" refers to west (toward file A), and bits are shifted right.
For Black, "left" refers to east (toward file H), and bits are shifted left.

§Examples

// A White piece on D4 moves left to C4
let bitboard = BitBoard(1 << Square::D4 as u64);
let result = bitboard.left_for::<{ Color::White as usize }>();
assert_eq!(result, BitBoard(1 << Square::C4 as u64));

// A Black piece on D4 moves left to E4 (inverted perspective)
let bitboard = BitBoard(1 << Square::D4 as u64);
let result = bitboard.left_for::<{ Color::Black as usize }>();
assert_eq!(result, BitBoard(1 << Square::E4 as u64));
§Note

This operation does not wrap around the board. Any square on the edge (file A for White, file H for Black) will be cleared in the result.


// A White piece on file A cannot move left
let bitboard = BitBoard(1 << Square::A2 as u64);
let result = bitboard.left_for::<{ Color::White as usize }>();
assert_eq!(result, BitBoard::EMPTY);

// A Black piece on file H cannot move left
let bitboard = BitBoard(1 << Square::H7 as u64);
let result = bitboard.left_for::<{ Color::Black as usize }>();
assert_eq!(result, BitBoard::EMPTY);
Source

pub const fn right(self, side: Color) -> Self

Returns a new BitBoard representing the squares to the "right" of the current positions, from the perspective of the given Color.

From the perspective of White, "right" means east (toward file H), and bits are shifted left.
From the perspective of Black, "right" means west (toward file A), and bits are shifted right.

§Examples

// A White piece on D4 moves right to E4
let bitboard = BitBoard(1 << Square::D4 as u64);
let result = bitboard.right(Color::White);
assert_eq!(result, BitBoard(1 << Square::E4 as u64));

// A Black piece on D4 moves right to C4 (inverted perspective)
let bitboard = BitBoard(1 << Square::D4 as u64);
let result = bitboard.right(Color::Black);
assert_eq!(result, BitBoard(1 << Square::C4 as u64));
§Expected behavior

Squares on the edge files are cleared to avoid horizontal wrap-around:


// A White piece on file H cannot move right
let bitboard = BitBoard(1 << Square::H2 as u64);
assert_eq!(bitboard.right(Color::White), BitBoard::EMPTY);

// A Black piece on file A cannot move right
let bitboard = BitBoard(1 << Square::A7 as u64);
assert_eq!(bitboard.right(Color::Black), BitBoard::EMPTY);
Source

pub const fn right_for<const COLOR: usize>(self) -> Self

Returns a new BitBoard representing the squares to the "right" of the current positions, from the perspective of a specific color known at compile time.

For White, "right" means east (toward file H), and bits are shifted left.
For Black, "right" means west (toward file A), and bits are shifted right.

§Examples

// A White piece on D4 moves right to E4
let bitboard = BitBoard(1 << Square::D4 as u64);
let result = bitboard.right_for::<{ Color::White as usize }>();
assert_eq!(result, BitBoard(1 << Square::E4 as u64));

// A Black piece on D4 moves right to C4 (inverted perspective)
let bitboard = BitBoard(1 << Square::D4 as u64);
let result = bitboard.right_for::<{ Color::Black as usize }>();
assert_eq!(result, BitBoard(1 << Square::C4 as u64));
§Expected behavior

Squares on the edge files are cleared to avoid horizontal wrap-around:


// A White piece on file H cannot move right
let bitboard = BitBoard(1 << Square::H2 as u64);
let result = bitboard.right_for::<{ Color::White as usize }>();
assert_eq!(result, BitBoard::EMPTY);

// A Black piece on file A cannot move right
let bitboard = BitBoard(1 << Square::A7 as u64);
let result = bitboard.right_for::<{ Color::Black as usize }>();
assert_eq!(result, BitBoard::EMPTY);
Source

pub const fn up_left(self, side: Color) -> Self

Returns a new BitBoard representing the squares diagonally "up-left" from the current positions, from the perspective of the given Color.

For White, this corresponds to a shift one rank forward and one file to the left.
For Black, this corresponds to a shift one rank backward and one file to the right.

§Examples

// A White pawn on E4 attacks diagonally up-left to D5
let bitboard = BitBoard(1 << Square::E4 as u64);
let result = bitboard.up_left(Color::White);
assert_eq!(result, BitBoard(1 << Square::D5 as u64));

// A Black pawn on D5 attacks diagonally up-left to E4 (from Black's perspective)
let bitboard = BitBoard(1 << Square::D5 as u64);
let result = bitboard.up_left(Color::Black);
assert_eq!(result, BitBoard(1 << Square::E4 as u64));
§Expected behavior

Movement from edge files is masked out to prevent wrap-around:


// A White piece on file A cannot move diagonally up-left
let bitboard = BitBoard(1 << Square::A2 as u64);
let result = bitboard.up_left(Color::White);
assert_eq!(result, BitBoard::EMPTY);

// A Black piece on file H cannot move diagonally up-left
let bitboard = BitBoard(1 << Square::H7 as u64);
let result = bitboard.up_left(Color::Black);
assert_eq!(result, BitBoard::EMPTY);
Source

pub const fn up_left_for<const COLOR: usize>(self) -> Self

Returns a new BitBoard representing the squares diagonally "up-left" from the current positions, from the perspective of a specific color known at compile time.

For White, this corresponds to a shift one rank forward and one file to the left.
For Black, this corresponds to a shift one rank backward and one file to the right.

§Examples

// A White pawn on E4 attacks diagonally up-left to D5
let bitboard = BitBoard(1 << Square::E4 as u64);
let result = bitboard.up_left_for::<{ Color::White as usize }>();
assert_eq!(result, BitBoard(1 << Square::D5 as u64));

// A Black pawn on D5 attacks diagonally up-left to E4 (from Black's perspective)
let bitboard = BitBoard(1 << Square::D5 as u64);
let result = bitboard.up_left_for::<{ Color::Black as usize }>();
assert_eq!(result, BitBoard(1 << Square::E4 as u64));
§Expected behavior

Movement from edge files is masked out to prevent wrap-around:


// A White piece on file A cannot move diagonally up-left
let bitboard = BitBoard(1 << Square::A2 as u64);
let result = bitboard.up_left_for::<{ Color::White as usize }>();
assert_eq!(result, BitBoard::EMPTY);

// A Black piece on file H cannot move diagonally up-left
let bitboard = BitBoard(1 << Square::H7 as u64);
let result = bitboard.up_left_for::<{ Color::Black as usize }>();
assert_eq!(result, BitBoard::EMPTY);
Source

pub const fn up_right(self, side: Color) -> Self

Returns a new BitBoard representing the squares diagonally "up-right" from the current positions, from the perspective of the given Color.

For White, this corresponds to a shift one rank forward and one file to the right.
For Black, this corresponds to a shift one rank backward and one file to the left.

§Examples

// A White pawn on E4 attacks diagonally up-right to F5
let bitboard = BitBoard(1 << Square::E4 as u64);
let result = bitboard.up_right(Color::White);
assert_eq!(result, BitBoard(1 << Square::F5 as u64));

// A Black pawn on D5 attacks diagonally up-right to C4 (from Black's perspective)
let bitboard = BitBoard(1 << Square::D5 as u64);
let result = bitboard.up_right(Color::Black);
assert_eq!(result, BitBoard(1 << Square::C4 as u64));
§Expected behavior

Movement from edge files is masked out to prevent wrap-around:


// A White piece on file H cannot move diagonally up-right
let bitboard = BitBoard(1 << Square::H2 as u64);
let result = bitboard.up_right(Color::White);
assert_eq!(result, BitBoard::EMPTY);

// A Black piece on file A cannot move diagonally up-right
let bitboard = BitBoard(1 << Square::A7 as u64);
let result = bitboard.up_right(Color::Black);
assert_eq!(result, BitBoard::EMPTY);
Source

pub const fn up_right_for<const COLOR: usize>(self) -> Self

Returns a new BitBoard representing the squares diagonally "up-right" from the current positions, from the perspective of a specific color known at compile time.

For White, this corresponds to a shift one rank forward and one file to the right.
For Black, this corresponds to a shift one rank backward and one file to the left.

§Examples

// A White pawn on E4 attacks diagonally up-right to F5
let bitboard = BitBoard(1 << Square::E4 as u64);
let result = bitboard.up_right_for::<{ Color::White as usize }>();
assert_eq!(result, BitBoard(1 << Square::F5 as u64));

// A Black pawn on D5 attacks diagonally up-right to C4 (from Black's perspective)
let bitboard = BitBoard(1 << Square::D5 as u64);
let result = bitboard.up_right_for::<{ Color::Black as usize }>();
assert_eq!(result, BitBoard(1 << Square::C4 as u64));
§Expected behavior

Squares on the edge files are cleared to avoid horizontal wrap-around:


// A White piece on file H cannot move diagonally up-right
let bitboard = BitBoard(1 << Square::H4 as u64);
let result = bitboard.up_right_for::<{ Color::White as usize }>();
assert_eq!(result, BitBoard::EMPTY);

// A Black piece on file A cannot move diagonally up-right
let bitboard = BitBoard(1 << Square::A6 as u64);
let result = bitboard.up_right_for::<{ Color::Black as usize }>();
assert_eq!(result, BitBoard::EMPTY);
Source

pub const fn is_empty(self) -> bool

Returns true if the BitBoard is empty (i.e., no bits are set), otherwise returns false.

An empty BitBoard means that no squares are occupied — all 64 bits are zero.

§Examples

// An explicitly empty BitBoard
let empty = BitBoard::EMPTY;
assert!(empty.is_empty());

// A BitBoard with a single square set is not empty
let bitboard = BitBoard(1 << Square::E4 as u64);
assert!(!bitboard.is_empty());

// BitBoard cleared by an operation becomes empty
let occupied = BitBoard(1 << Square::D2 as u64);
let cleared = occupied.pop_square(Square::D2);
assert!(cleared.is_empty());

Trait Implementations§

Source§

impl BitAnd for BitBoard

Source§

type Output = BitBoard

The resulting type after applying the & operator.
Source§

fn bitand(self, other: Self) -> BitBoard

Performs the & operation. Read more
Source§

impl BitAndAssign for BitBoard

Source§

fn bitand_assign(&mut self, other: Self)

Performs the &= operation. Read more
Source§

impl BitOr for BitBoard

Source§

type Output = BitBoard

The resulting type after applying the | operator.
Source§

fn bitor(self, other: Self) -> BitBoard

Performs the | operation. Read more
Source§

impl BitOrAssign for BitBoard

Source§

fn bitor_assign(&mut self, other: Self)

Performs the |= operation. Read more
Source§

impl BitXor for BitBoard

Source§

type Output = BitBoard

The resulting type after applying the ^ operator.
Source§

fn bitxor(self, other: Self) -> BitBoard

Performs the ^ operation. Read more
Source§

impl BitXorAssign for BitBoard

Source§

fn bitxor_assign(&mut self, other: Self)

Performs the ^= operation. Read more
Source§

impl Clone for BitBoard

Source§

fn clone(&self) -> BitBoard

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BitBoard

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for BitBoard

Source§

fn default() -> BitBoard

Returns the “default value” for a type. Read more
Source§

impl Display for BitBoard

Implements display formatting for the BitBoard struct. This allows for the BitBoard to be printed in a human-readable format, where filled squares are shown as ‘★’ and empty squares as ‘·’.

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for BitBoard

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Iterator for BitBoard

Implements Iterator for BitBoard, allowing iteration over the set squares. Each call to next returns the next Square that is set (i.e., the next ‘1’ bit)

Source§

type Item = Square

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Square>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( &mut self, ) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where Self: Sized,

Creates an iterator starting at the same point, but stepping by the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where Self: Sized, U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where Self: Sized, U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where Self: Sized, Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where Self: Sized, G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where Self: Sized, F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where Self: Sized, F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where Self: Sized, P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where Self: Sized, F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where Self: Sized,

Creates an iterator which gives the current iteration count as well as the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where Self: Sized,

Creates an iterator which can use the peek and peek_mut methods to look at the next element of the iterator without consuming it. See their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where Self: Sized, P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where Self: Sized, P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where Self: Sized, P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where Self: Sized,

Creates an iterator that yields the first n elements, or fewer if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where Self: Sized, F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where Self: Sized, U: IntoIterator, F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where Self: Sized, F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over self and returns an iterator over the outputs of f. Like slice::windows(), the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where Self: Sized, F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where B: FromIterator<Self::Item>, Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where E: Extend<Self::Item>, Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where Self: Sized, B: Default + Extend<Self::Item>, F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where Self: Sized, P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Output = B>,

An iterator method that applies a function as long as it returns successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where Self: Sized, F: FnMut(Self::Item) -> R, R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where Self: Sized, F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where Self: Sized, F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing operation. Read more
Source§

fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where Self: Sized, R: Try<Output = Self::Item>, <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where Self: Sized, F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where Self: Sized, F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where Self: Sized, P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where Self: Sized, F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns the first non-none result. Read more
Source§

fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where Self: Sized, R: Try<Output = bool>, <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where Self: Sized, P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where Self: Sized, Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where Self: Sized, Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where B: Ord, Self: Sized, F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where B: Ord, Self: Sized, F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where FromA: Default + Extend<A>, FromB: Default + Extend<B>, Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where T: Copy + 'a, Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where T: Clone + 'a, Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where Self: Sized, S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where Self: Sized, P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where I: IntoIterator<Item = Self::Item>, Self::Item: Ord, Self: Sized,

Lexicographically compares the elements of this Iterator with those of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where Self: Sized, I: IntoIterator, F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where I: IntoIterator, Self::Item: PartialOrd<<I as IntoIterator>::Item>, Self: Sized,

Lexicographically compares the PartialOrd elements of this Iterator with those of another. The comparison works like short-circuit evaluation, returning a result without comparing the remaining elements. As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where Self: Sized, I: IntoIterator, F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialEq<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are equal to those of another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where Self: Sized, I: IntoIterator, F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialEq<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are not equal to those of another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialOrd<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are lexicographically less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialOrd<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are lexicographically less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialOrd<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are lexicographically greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where I: IntoIterator, Self::Item: PartialOrd<<I as IntoIterator>::Item>, Self: Sized,

Determines if the elements of this Iterator are lexicographically greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where Self: Sized, Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where Self: Sized, F: FnMut(Self::Item) -> K, K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction function. Read more
Source§

impl Not for BitBoard

Implements the Not trait for BitBoard, allowing the bitwise NOT operation !. The bitwise NOT flips all bits in the BitBoard, effectively inverting the board state.

Source§

type Output = BitBoard

The resulting type after applying the ! operator.
Source§

fn not(self) -> Self::Output

Performs the unary ! operation. Read more
Source§

impl PartialEq for BitBoard

Source§

fn eq(&self, other: &BitBoard) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for BitBoard

Source§

fn partial_cmp(&self, other: &BitBoard) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl Copy for BitBoard

Source§

impl Eq for BitBoard

Source§

impl StructuralPartialEq for BitBoard

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<I> IntoIterator for I
where I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.