pub struct Board<T>(/* private fields */)
where
T: Eq + Hash;
Expand description
A two-dimensional orthogonal grid map of live/dead cells.
The type parameter T
is used as the type of the x- and y-coordinate values for each cell.
§Examples
use life_backend::{Board, Position};
let pattern = [Position(0, 0), Position(1, 0), Position(2, 0), Position(1, 1)];
let board: Board<i16> = pattern.iter().collect();
assert_eq!(board.contains(&Position(0, 0)), true);
assert_eq!(board.contains(&Position(0, 1)), false);
assert_eq!(board.iter().count(), 4);
Implementations§
Source§impl<T> Board<T>
impl<T> Board<T>
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates an empty board.
§Examples
use life_backend::Board;
let board = Board::<i16>::new();
assert_eq!(board.iter().count(), 0);
Sourcepub fn contains(&self, position: &Position<T>) -> bool
pub fn contains(&self, position: &Position<T>) -> bool
Returns true
if the board contains the specified position.
§Examples
use life_backend::{Board, Position};
let board = Board::<i16>::new();
assert_eq!(board.contains(&Position(0, 0)), false);
Sourcepub fn insert(&mut self, position: Position<T>) -> bool
pub fn insert(&mut self, position: Position<T>) -> bool
Adds the specified position to the board.
Returns whether the position was newly inserted, like as insert()
of HashSet
.
§Examples
use life_backend::{Board, Position};
let mut board = Board::<i16>::new();
assert_eq!(board.insert(Position(0, 0)), true);
assert_eq!(board.contains(&Position(0, 0)), true);
Sourcepub fn remove(&mut self, position: &Position<T>) -> bool
pub fn remove(&mut self, position: &Position<T>) -> bool
Removes the specified position from the board.
Returns whether the position was contained in the board, like as remove()
of HashSet
.
§Examples
use life_backend::{Board, Position};
let mut board = Board::<i16>::new();
assert_eq!(board.insert(Position(0, 0)), true);
assert_eq!(board.remove(&Position(0, 0)), true);
assert_eq!(board.contains(&Position(0, 0)), false);
Sourcepub fn bounding_box(&self) -> BoardRange<T>
pub fn bounding_box(&self) -> BoardRange<T>
Returns the minimum bounding box of all live cells on the board.
§Examples
use life_backend::{Board, Position};
let mut board = Board::new();
board.insert(Position(-1, 2));
board.insert(Position(3, -2));
let bbox = board.bounding_box();
assert_eq!(bbox.x(), &(-1..=3));
assert_eq!(bbox.y(), &(-2..=2));
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Removes all live cells in the board.
§Examples
use life_backend::{Board, Position};
let mut board = Board::<i16>::new();
board.insert(Position(0, 0));
board.clear();
assert_eq!(board.contains(&Position(0, 0)), false);
Sourcepub fn retain<F>(&mut self, pred: F)
pub fn retain<F>(&mut self, pred: F)
Retains only the live cell positions specified by the predicate, similar as retain()
of HashSet
.
§Examples
use life_backend::{Board, Position};
let mut board = Board::<i16>::new();
board.insert(Position(0, 0));
board.insert(Position(1, 0));
board.insert(Position(0, 1));
board.retain(|&pos| pos.0 == pos.1);
assert_eq!(board.contains(&Position(0, 0)), true);
assert_eq!(board.contains(&Position(1, 0)), false);
assert_eq!(board.contains(&Position(0, 1)), false);
Source§impl<'a, T> Board<T>
impl<'a, T> Board<T>
Sourcepub fn iter(&'a self) -> Iter<'a, Position<T>>
pub fn iter(&'a self) -> Iter<'a, Position<T>>
Creates a non-owning iterator over the series of immutable live cell positions on the board in arbitrary order.
§Examples
use std::collections::HashSet;
use life_backend::{Board, Position};
let mut board = Board::<i16>::new();
board.insert(Position(1, 0));
board.insert(Position(0, 1));
let result: HashSet<_> = board.iter().collect();
assert_eq!(result.len(), 2);
assert!(result.contains(&Position(1, 0)));
assert!(result.contains(&Position(0, 1)));
Trait Implementations§
Source§impl<'a, T> Extend<&'a Position<T>> for Board<T>
impl<'a, T> Extend<&'a Position<T>> for Board<T>
Source§fn extend<U>(&mut self, iter: U)where
U: IntoIterator<Item = &'a Position<T>>,
fn extend<U>(&mut self, iter: U)where
U: IntoIterator<Item = &'a Position<T>>,
Extends the board with the contents of the specified non-owning iterator over the series of &Position<T>
.
Each item in the series represents an immutable reference of a live cell position.
§Examples
use life_backend::{Board, Position};
let mut board = Board::<i16>::new();
let pattern = [Position(1, 0), Position(0, 1)];
board.extend(pattern.iter());
assert_eq!(board.contains(&Position(0, 0)), false);
assert_eq!(board.contains(&Position(1, 0)), true);
assert_eq!(board.contains(&Position(0, 1)), true);
assert_eq!(board.contains(&Position(1, 1)), false);
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)Source§impl<T> Extend<Position<T>> for Board<T>
impl<T> Extend<Position<T>> for Board<T>
Source§fn extend<U>(&mut self, iter: U)where
U: IntoIterator<Item = Position<T>>,
fn extend<U>(&mut self, iter: U)where
U: IntoIterator<Item = Position<T>>,
Extends the board with the contents of the specified owning iterator over the series of Position<T>
.
Each item in the series represents a moved live cell position.
§Examples
use life_backend::{Board, Position};
let mut board = Board::<i16>::new();
let pattern = [Position(1, 0), Position(0, 1)];
board.extend(pattern.into_iter());
assert_eq!(board.contains(&Position(0, 0)), false);
assert_eq!(board.contains(&Position(1, 0)), true);
assert_eq!(board.contains(&Position(0, 1)), true);
assert_eq!(board.contains(&Position(1, 1)), false);
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)Source§impl<'a, T> FromIterator<&'a Position<T>> for Board<T>
impl<'a, T> FromIterator<&'a Position<T>> for Board<T>
Source§fn from_iter<U>(iter: U) -> Selfwhere
U: IntoIterator<Item = &'a Position<T>>,
fn from_iter<U>(iter: U) -> Selfwhere
U: IntoIterator<Item = &'a Position<T>>,
Creates a value from a non-owning iterator over a series of &Position<T>
.
Each item in the series represents an immutable reference of a live cell position.
§Examples
use life_backend::{Board, Position};
let pattern = [Position(1, 0), Position(0, 1)];
let board: Board<i16> = pattern.iter().collect();
assert_eq!(board.contains(&Position(0, 0)), false);
assert_eq!(board.contains(&Position(1, 0)), true);
assert_eq!(board.contains(&Position(0, 1)), true);
assert_eq!(board.contains(&Position(1, 1)), false);
Source§impl<T> FromIterator<Position<T>> for Board<T>
impl<T> FromIterator<Position<T>> for Board<T>
Source§fn from_iter<U>(iter: U) -> Selfwhere
U: IntoIterator<Item = Position<T>>,
fn from_iter<U>(iter: U) -> Selfwhere
U: IntoIterator<Item = Position<T>>,
Creates a value from an owning iterator over a series of Position<T>
.
Each item in the series represents a moved live cell position.
§Examples
use life_backend::{Board, Position};
let mut pattern = [Position(1, 0), Position(0, 1)];
let board: Board<i16> = pattern.into_iter().collect();
assert_eq!(board.contains(&Position(0, 0)), false);
assert_eq!(board.contains(&Position(1, 0)), true);
assert_eq!(board.contains(&Position(0, 1)), true);
assert_eq!(board.contains(&Position(1, 1)), false);
Source§impl<'a, T> IntoIterator for &'a Board<T>
impl<'a, T> IntoIterator for &'a Board<T>
Source§fn into_iter(self) -> Self::IntoIter
fn into_iter(self) -> Self::IntoIter
Creates a non-owning iterator over the series of immutable live cell positions on the board in arbitrary order.
§Examples
use std::collections::HashSet;
use life_backend::{Board, Position};
let pattern = [Position(1, 0), Position(0, 1)];
let board: Board<i16> = pattern.iter().collect();
let result: HashSet<_> = (&board).into_iter().collect();
let expected: HashSet<_> = pattern.iter().collect();
assert_eq!(result, expected);
Source§impl<T> IntoIterator for Board<T>
impl<T> IntoIterator for Board<T>
Source§fn into_iter(self) -> Self::IntoIter
fn into_iter(self) -> Self::IntoIter
Creates an owning iterator over the series of moved live cell positions on the board in arbitrary order.
§Examples
use std::collections::HashSet;
use life_backend::{Board, Position};
let pattern = [Position(1, 0), Position(0, 1)];
let board: Board<i16> = pattern.iter().collect();
let result: HashSet<_> = board.into_iter().collect();
let expected: HashSet<_> = pattern.iter().copied().collect();
assert_eq!(result, expected);