First commit

This commit is contained in:
Mossfet 2023-03-17 23:07:53 +00:00
commit 9aad62d5bc
189 changed files with 1086 additions and 0 deletions

141
Cargo.lock generated Normal file
View file

@ -0,0 +1,141 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "crossbeam-channel"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
dependencies = [
"cfg-if",
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a"
dependencies = [
"autocfg",
"cfg-if",
"crossbeam-utils",
"memoffset",
"scopeguard",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
dependencies = [
"cfg-if",
]
[[package]]
name = "either"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]]
name = "libc"
version = "0.2.137"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
[[package]]
name = "memoffset"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
dependencies = [
"autocfg",
]
[[package]]
name = "mossfets-game-of-life"
version = "0.7.0"
dependencies = [
"rayon",
"rustc-hash",
]
[[package]]
name = "num_cpus"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "rayon"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e060280438193c554f654141c9ea9417886713b7acd75974c85b18a69a88e0b"
dependencies = [
"crossbeam-deque",
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
"crossbeam-utils",
"num_cpus",
]
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"

20
Cargo.toml Normal file
View file

@ -0,0 +1,20 @@
[package]
authors = ["Mossfet"]
description = "A small, optionally zero-dependency Conway's Game of Life library"
edition = "2021"
license = "GPL-3.0-or-later"
name = "mossfets-game-of-life"
readme = "README.md"
repository = "https://git.solarpunk.moe/game-of-life"
version = "0.7.0"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rustc-hash = { version = "1.1.0", optional = true }
rayon = { version = "1.6.0", optional = true }
[profile.test]
debug = true
[features]
default = ["advanced_threading", "advanced_hashing"]
advanced_threading = ["dep:rayon"]
advanced_hashing = ["dep:rustc-hash"]

3
README.md Normal file
View file

@ -0,0 +1,3 @@
# game-of-life
A Rust implementation of Conway's Game of Life. Used as the basis for the GNOME app Mossfet's Life, but should be usable cross-platform

183
src/game.rs Normal file
View file

@ -0,0 +1,183 @@
#[cfg(not(feature = "advanced_threading"))]
use std::thread;
#[cfg(feature = "advanced_threading")]
use rayon::prelude::*;
#[cfg(feature = "advanced_hashing")]
type Board = rustc_hash::FxHashSet<Coord>;
#[cfg(not(feature = "advanced_hashing"))]
type Board = std::collections::HashSet<Coord>;
pub type Coord = (isize, isize);
/// An error in the game's logic
#[derive(Debug)]
pub enum GameError {
NoPreviousTurn
}
/// A representation of the game's state.
#[derive(Default)]
pub struct Game {
primary_board: Board,
initial_state: Board,
count: usize,
#[cfg(not(feature = "advanced_threading"))]
parallelism: usize,
}
impl Game {
/// Constructs a new board with all dead cells
pub fn new() -> Self {
Self {
primary_board: Board::default(),
initial_state: Board::default(),
count: 0,
#[cfg(not(feature = "advanced_threading"))]
parallelism: std::thread::available_parallelism().unwrap().into(),
}
}
/// Returns whether the cell at the given coordinate is alive
pub fn get_state(&self, coord: Coord) -> bool {
self.primary_board.contains(&coord)
}
/// Gets all live cells on the board
pub fn cells(&self) -> Vec<Coord> {
self.primary_board.iter().cloned().collect()
}
/// Flips the cell at the given coordinate betweeen alive and dead. Will return whether the new
/// cell is alive
pub fn flip_state(&mut self, coord: Coord) -> bool {
self.count = 0;
if self.primary_board.contains(&coord) {
self.primary_board.remove(&coord);
self.initial_state = self.primary_board.clone();
false
} else {
self.primary_board.insert(coord);
self.initial_state = self.primary_board.clone();
true
}
}
/// Advances the board by one turn
pub fn advance_board(&mut self) {
// Get all the cells to check
let mut check_set = Board::default();
for (x, y) in &self.primary_board {
let x = x.clone();
let y = y.clone();
check_set.insert((x, y));
check_set.insert((x, y+1));
check_set.insert((x, y-1));
check_set.insert((x+1, y));
check_set.insert((x+1, y+1));
check_set.insert((x+1, y-1));
check_set.insert((x-1, y));
check_set.insert((x-1, y+1));
check_set.insert((x-1, y-1));
}
// Iterate through the cells and modify the other HashSet
//let old_board = std::mem::take(&mut self.secondary_board);
let mut new_board = Board::default();
#[cfg(not(feature = "advanced_threading"))]
{
let binding = check_set.iter().collect::<Vec<&Coord>>();
let chunks = binding.chunks((binding.len()/self.parallelism)+1);
thread::scope(|s| {
let mut handles = vec![];
for chunk in chunks {
let handle = s.spawn(|| {
let owned_chunk = chunk.iter().map(|x| x.to_owned().to_owned());
let mut return_set = Board::default();
for coord in owned_chunk {
if get_next_state(&self.primary_board, coord) {
return_set.insert(coord);
}
}
return_set
});
handles.push(handle);
}
for handle in handles {
new_board.extend(handle.join().unwrap());
}
});
}
#[cfg(feature = "advanced_threading")]
{
new_board.par_extend(check_set.par_iter().filter(|coord| get_next_state(&self.primary_board, coord.to_owned().to_owned())));
}
// Swap the HashSets
self.primary_board = new_board;
self.count += 1;
}
/// Returns a vector of the values between the given top-left and bottom-right
/// coordinate
pub fn get_view(&self, coord1: Coord, coord2: Coord) -> Vec<&Coord>{
self.primary_board.iter()
.filter(|(x, y)| x >= &coord1.0 && y >= &coord1.1 && x <= &coord2.0 && y <= &coord2.1)
.collect()
}
/// Sets the board to its previous state. The board's history will only go back to the last
/// manual intervention done by a player (such as loading a file or toggling a cell). Returns
/// true if it reverted, and false if there was no previous revert.
pub fn revert_board(&mut self) -> bool {
// Check if there have been any turns since the initial state
if self.count == 0 {
return false;
}
self.primary_board = self.initial_state.clone();
// Check if we can simply swap out the old board.
/*if self.easy_buffer_revert {
std::mem::swap(&mut self.primary_board, &mut self.secondary_board);
self.easy_buffer_revert = false;
return;
}*/
let count = self.count;
for _ in 0..count-1 {
self.advance_board();
}
// let set = self.into_iter().nth(count).unwrap();
//self.primary_board = set;
self.count = count - 1;
true
}
}
impl Iterator for Game {
type Item = Board;
fn next(&mut self) -> Option<Self::Item> {
self.advance_board();
Some(self.primary_board.clone())
}
}
/// Given a board and a coordinate, return whether the cell at that coordinate should be live next
/// round
fn get_next_state(board: &Board, coord: Coord) -> bool {
let current_state = board.contains(&coord);
let (x, y) = coord;
let mut count: u8 = 0;
for coord in [(x, y+1), (x, y-1), (x+1, y), (x+1, y+1), (x+1, y-1), (x-1, y), (x-1, y+1), (x-1, y-1)] {
if board.contains(&coord) {
count += 1;
}
}
if current_state {
(2 <= count) && (count <= 3)
} else {
count == 3
}
}

19
src/lib.rs Normal file
View file

@ -0,0 +1,19 @@
//! A library implemting the logic for Conway's Game of Life
//! It can be embedded into applications, and can read the Plaintext and Life 1.05 file formats.
#![feature(test)]
extern crate test;
pub mod game;
pub mod reader;
pub mod writer;
#[cfg(test)]
mod tests {
use super::*;
use test::Bencher;
#[bench]
fn test_spacefiller_perf (b: &mut Bencher) {
let mut game = reader::read_game_at_path("tests/cells/spacefiller.cells").unwrap();
b.iter(|| game.advance_board());
}
}

62
src/reader.rs Normal file
View file

@ -0,0 +1,62 @@
use std::{path::Path, fs::File, io::{self, BufRead, Read}};
use crate::game::Game;
/// An error when reading the file
#[derive(Debug)]
pub enum ReaderError {
FileAccessError,
ParseError,
}
/// Read the file at a given path. If all goes well, will return `Ok(game)`, with a game
/// initialised with that pattern. Can return errors for either file access or failed parsing.
pub fn read_game_at_path(path: &str) -> Result<Game, ReaderError> {
let path = Path::new(path);
let file = open_file(path)?;
read_game(file)
}
/// Read from any `impl Read`. If all goes well, will return `Ok<Game>` with a game
/// initialised with that pattern. Can return errors for failed parsing.
pub fn read_game(file: impl Read) -> Result<Game, ReaderError> {
let lines = io::BufReader::new(file).lines();
let mut game = Game::new();
let mut x_index = 0;
for line in lines {
if let Ok(ip) = line {
// Comment/metadata
if ip.starts_with("!") || ip.starts_with("#") {continue}
x_index += 1;
for (cell, y_index) in ip.chars().zip(0..) {
match cell {
// Live cell
'*' | 'O' => {game.flip_state((y_index, x_index));},
// Dead cell
'.' | ' ' => continue,
// Invalid character
_ => {return Err(ReaderError::ParseError);},
}
/*if cell == '*' || cell == 'O' {
// Live cell
game.flip_state((y_index, x_index));
} else if cell == '.' || cell == ' ' {
// Dead cell
continue
} else {
// Invalid character
return Err(ReaderError::ParseError);
}*/
}
}
}
Ok(game)
}
fn open_file(path: &Path) -> Result<File, ReaderError> {
match File::open(path) {
Ok(file) => Ok(file),
Err(_) => Err(ReaderError::FileAccessError),
}
}

86
src/writer.rs Normal file
View file

@ -0,0 +1,86 @@
use std::path::{Path, PathBuf};
use std::fs::File;
use std::collections::{HashMap, BinaryHeap};
use std::cmp::Reverse;
use std::io::Write;
use crate::game::{Game, Coord};
/// An error when writing to a file
#[derive(Debug)]
pub enum WriterError {
FileAccessError,
WriteError,
}
/// Write the given game to the file at the given path.
pub fn write_game_at_path(path: PathBuf, game: &Game) -> Result<(), WriterError> {
let mut file = create_file(path.as_path())?;
write_game(&mut file, game)
}
/// Write the given game to the writer. Currently only accept `std::io::Write` implementors.
pub fn write_game(writer: &mut impl Write, game: &Game) -> Result<(), WriterError> {
//let path = Path::new(path);
let mut string = String::new();
let mut values = CellRows::new();
for i in game.cells() {
values.insert(i);
}
for y in values.smallest_y..values.greatest_y+1 {
if let Some(row) = values.rows.get_mut(&y) {
for x in values.smallest_x..values.greatest_x+1 {
if let Some(ch) = row.peek() {
if ch.0 == x {
string.push_str("*");
row.pop();
} else {
string.push_str(".");
}
} else {
string.push_str(".");
}
}
}
string.push_str("\n");
}
match write!(writer, "{}", string) {
Ok(_) => Ok(()),
Err(_) => Err(WriterError::WriteError),
}
}
fn create_file(path: &Path) -> Result<File, WriterError> {
match File::create(path) {
Ok(file) => Ok(file),
Err(_) => Err(WriterError::FileAccessError),
}
}
#[derive(Default)]
struct CellRows {
rows: HashMap<isize, BinaryHeap<Reverse<isize>>>,
smallest_x: isize,
greatest_x: isize,
smallest_y: isize,
greatest_y: isize,
smallest_x_set: bool,
smallest_y_set: bool,
greatest_x_set: bool,
greatest_y_set: bool,
}
impl CellRows {
pub fn new() -> Self {
Self::default()
}
pub fn insert(&mut self, (x, y): Coord) {
if x < self.smallest_x || !self.smallest_x_set { self.smallest_x = x; self.smallest_x_set = true };
if y < self.smallest_y || !self.smallest_y_set { self.smallest_y = y; self.smallest_y_set = true };
if x > self.greatest_x || !self.greatest_x_set { self.greatest_x = x; self.greatest_x_set = true };
if y > self.greatest_y || !self.greatest_y_set { self.greatest_y = y; self.greatest_y_set = true };
self.rows.entry(y).and_modify(|heap| {heap.push(Reverse(x))}).or_insert({let mut heap = BinaryHeap::new(); heap.push(Reverse(x)); heap});
}
}

1
target/.rustc_info.json Normal file
View file

@ -0,0 +1 @@
{"rustc_fingerprint":7330002731536784780,"outputs":{"10376369925670944939":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/alice/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"4614504638168534921":{"success":true,"status":"","code":0,"stdout":"rustc 1.67.1 (d5a82bbd2 2023-02-07)\nbinary: rustc\ncommit-hash: d5a82bbd26e1ad8b7401f6a718a9c57c96905483\ncommit-date: 2023-02-07\nhost: x86_64-unknown-linux-gnu\nrelease: 1.67.1\nLLVM version: 15.0.6\n","stderr":""},"15697416045686424142":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n","stderr":""}},"successes":{}}

3
target/CACHEDIR.TAG Normal file
View file

@ -0,0 +1,3 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/

0
target/debug/.cargo-lock Normal file
View file

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
e3e3bcf4f93381eb

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[]","target":14886237245231788030,"profile":12637318739757120569,"path":14942906322655160595,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/autocfg-25db3455927a66e1/dep-lib-autocfg"}}],"rustflags":[],"metadata":13102859075309379048,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
1ea8219b31b820eb

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[]","target":10623512480563079566,"profile":3735503092003429423,"path":4889523692089320874,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-047a17fcf848a7e5/dep-lib-cfg-if"}}],"rustflags":[],"metadata":8462187951337715540,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
1fe31c4cf0dab974

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"crossbeam-utils\", \"default\", \"std\"]","target":13396203165277677985,"profile":3735503092003429423,"path":6774069498105017244,"deps":[[2452538001284770427,"cfg_if",false,16942744321363388446],[7193308319923015694,"crossbeam_utils",false,8177345685184536806]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/crossbeam-channel-6c23968bf1f43814/dep-lib-crossbeam-channel"}}],"rustflags":[],"metadata":909643187441988617,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
9851066ce987ab0b

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"crossbeam-epoch\", \"crossbeam-utils\", \"default\", \"std\"]","target":13833579601254447815,"profile":3735503092003429423,"path":10026719190720898149,"deps":[[2452538001284770427,"cfg_if",false,16942744321363388446],[7193308319923015694,"crossbeam_utils",false,8177345685184536806],[10704852821984090675,"crossbeam_epoch",false,14614366890267544241]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/crossbeam-deque-647335b25c703d9c/dep-lib-crossbeam-deque"}}],"rustflags":[],"metadata":14304628380895324452,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
b18aa0a741a9d0ca

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"alloc\", \"std\"]","target":2794700018165025075,"profile":3735503092003429423,"path":124792095271550924,"deps":[[2452538001284770427,"cfg_if",false,16942744321363388446],[3181319709735290124,"memoffset",false,18255280269094770153],[7193308319923015694,"crossbeam_utils",false,8177345685184536806],[10704852821984090675,"build_script_build",false,1142890562986264065],[16976214665626565167,"scopeguard",false,16949537069360077078]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/crossbeam-epoch-00b671f68f10b544/dep-lib-crossbeam-epoch"}}],"rustflags":[],"metadata":8562320424510714295,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"","target":0,"profile":0,"path":0,"deps":[[10704852821984090675,"build_script_build",false,5889798359351619394]],"local":[{"RerunIfChanged":{"output":"debug/build/crossbeam-epoch-7eecb9abe92d74d5/output","paths":["no_atomic.rs"]}}],"rustflags":[],"metadata":0,"config":0,"compile_kind":0}

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"alloc\", \"std\"]","target":2297296889237502566,"profile":12637318739757120569,"path":9742061672718594767,"deps":[[14832468857926148571,"autocfg",false,16969902019554632675]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/crossbeam-epoch-ee4745e9c0367577/dep-build-script-build-script-build"}}],"rustflags":[],"metadata":8562320424510714295,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"default\", \"std\"]","target":2297296889237502566,"profile":12637318739757120569,"path":8454127933311123041,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/crossbeam-utils-41c63de93ae345d1/dep-build-script-build-script-build"}}],"rustflags":[],"metadata":1609393243086812936,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
e660ff4293c47b71

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"default\", \"std\"]","target":10601540825848783185,"profile":3735503092003429423,"path":10588951052679757494,"deps":[[2452538001284770427,"cfg_if",false,16942744321363388446],[7193308319923015694,"build_script_build",false,9552428764662352765]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/crossbeam-utils-8068a5071f13bd8c/dep-lib-crossbeam-utils"}}],"rustflags":[],"metadata":1609393243086812936,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"","target":0,"profile":0,"path":0,"deps":[[7193308319923015694,"build_script_build",false,6524158761027782509]],"local":[{"RerunIfChanged":{"output":"debug/build/crossbeam-utils-b84467037cb25ff8/output","paths":["no_atomic.rs"]}}],"rustflags":[],"metadata":0,"config":0,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
38509df7db9cce38

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[]","target":10519268927367075084,"profile":3735503092003429423,"path":11395375885168537987,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/either-e3a3f6608a1c39f5/dep-lib-either"}}],"rustflags":[],"metadata":15700307601938671422,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
477bb6816f776d61

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"default\", \"std\"]","target":1307715644349195660,"profile":3735503092003429423,"path":2097357289368071566,"deps":[[15453419386813495897,"build_script_build",false,2501948217227877321]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-8258942407591c42/dep-lib-libc"}}],"rustflags":[],"metadata":14998826085014762512,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
729d61773dc1ba40

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"default\", \"std\"]","target":8188216131759486267,"profile":12637318739757120569,"path":14467832633122737499,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-c2fb0df62231fde0/dep-build-script-build-script-build"}}],"rustflags":[],"metadata":14998826085014762512,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
c91b4acea5b4b822

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"","target":0,"profile":0,"path":0,"deps":[[15453419386813495897,"build_script_build",false,4664252833835621746]],"local":[{"RerunIfChanged":{"output":"debug/build/libc-e2821d70ed17689c/output","paths":["build.rs"]}}],"rustflags":[],"metadata":0,"config":0,"compile_kind":0}

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"","target":0,"profile":0,"path":0,"deps":[[3181319709735290124,"build_script_build",false,14288096423747173631]],"local":[{"Precalculated":"0.7.1"}],"rustflags":[],"metadata":0,"config":0,"compile_kind":0}

View file

@ -0,0 +1 @@
ffbcfaedfe8349c6

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"default\"]","target":8188216131759486267,"profile":12637318739757120569,"path":7328723003965709422,"deps":[[14832468857926148571,"autocfg",false,16969902019554632675]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/memoffset-4eb1601c091a32e3/dep-build-script-build-script-build"}}],"rustflags":[],"metadata":1371205671251306698,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
e9559722afc857fd

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"default\"]","target":1229535848872979174,"profile":3735503092003429423,"path":14756628218157747310,"deps":[[3181319709735290124,"build_script_build",false,3759002732364018262]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/memoffset-f60c5b43cf7c6e17/dep-lib-memoffset"}}],"rustflags":[],"metadata":1371205671251306698,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"advanced_hashing\", \"advanced_threading\", \"default\"]","target":4730905551101281842,"profile":1021633075455700787,"path":18228827298942340194,"deps":[[1098045598771442027,"rustc_hash",false,569280686061656922],[12200337248470852780,"rayon",false,1644598423468803596],[13530821832827362251,"mossfets_game_of_life",false,3457346562389382372]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/mossfets-game-of-life-8e251872954f0de6/dep-test-integration-test-filetest"}}],"rustflags":[],"metadata":15350291162696798016,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"advanced_hashing\", \"advanced_threading\", \"default\"]","target":1636371728156516668,"profile":1021633075455700787,"path":9346530204598392790,"deps":[[1098045598771442027,"rustc_hash",false,569280686061656922],[12200337248470852780,"rayon",false,1644598423468803596],[13530821832827362251,"mossfets_game_of_life",false,3457346562389382372]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/mossfets-game-of-life-9293d5feb433bce3/dep-test-integration-test-logictests"}}],"rustflags":[],"metadata":15350291162696798016,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1,3 @@
{"message":"`#![feature]` may not be used on the stable release channel","code":{"code":"E0554","explanation":"Feature attributes are only allowed on the nightly release channel. Stable or\nbeta compilers will not comply.\n\nErroneous code example:\n\n```ignore (depends on release channel)\n#![feature(lang_items)] // error: `#![feature]` may not be used on the\n // stable release channel\n```\n\nIf you need the feature, make sure to use a nightly release of the compiler\n(but be warned that the feature may be removed or altered in the future).\n"},"level":"error","spans":[{"file_name":"src/lib.rs","byte_start":170,"byte_end":174,"line_start":3,"line_end":3,"column_start":12,"column_end":16,"is_primary":true,"text":[{"text":"#![feature(test)]","highlight_start":12,"highlight_end":16}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[38;5;9merror[E0554]\u001b[0m\u001b[0m\u001b[1m: `#![feature]` may not be used on the stable release channel\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:3:12\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m3\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m#![feature(test)]\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;9m^^^^\u001b[0m\n\n"}
{"message":"aborting due to previous error","code":null,"level":"error","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[38;5;9merror\u001b[0m\u001b[0m\u001b[1m: aborting due to previous error\u001b[0m\n\n"}
{"message":"For more information about this error, try `rustc --explain E0554`.","code":null,"level":"failure-note","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1mFor more information about this error, try `rustc --explain E0554`.\u001b[0m\n"}

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"advanced_hashing\", \"advanced_threading\", \"default\"]","target":5076570488437081263,"profile":1021633075455700787,"path":17523903030608720598,"deps":[[1098045598771442027,"rustc_hash",false,569280686061656922],[12200337248470852780,"rayon",false,1644598423468803596]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/mossfets-game-of-life-98237fe70c38b346/dep-test-lib-mossfets-game-of-life"}}],"rustflags":[],"metadata":15350291162696798016,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[\"advanced_hashing\", \"advanced_threading\", \"default\"]","target":5076570488437081263,"profile":7309141686862299243,"path":17523903030608720598,"deps":[[1098045598771442027,"rustc_hash",false,569280686061656922],[12200337248470852780,"rayon",false,1644598423468803596]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/mossfets-game-of-life-98d7d9ef4c6cf555/dep-lib-mossfets-game-of-life"}}],"rustflags":[],"metadata":15350291162696798016,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1,3 @@
{"message":"`#![feature]` may not be used on the stable release channel","code":{"code":"E0554","explanation":"Feature attributes are only allowed on the nightly release channel. Stable or\nbeta compilers will not comply.\n\nErroneous code example:\n\n```ignore (depends on release channel)\n#![feature(lang_items)] // error: `#![feature]` may not be used on the\n // stable release channel\n```\n\nIf you need the feature, make sure to use a nightly release of the compiler\n(but be warned that the feature may be removed or altered in the future).\n"},"level":"error","spans":[{"file_name":"src/lib.rs","byte_start":170,"byte_end":174,"line_start":3,"line_end":3,"column_start":12,"column_end":16,"is_primary":true,"text":[{"text":"#![feature(test)]","highlight_start":12,"highlight_end":16}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[38;5;9merror[E0554]\u001b[0m\u001b[0m\u001b[1m: `#![feature]` may not be used on the stable release channel\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:3:12\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m3\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m#![feature(test)]\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;9m^^^^\u001b[0m\n\n"}
{"message":"aborting due to previous error","code":null,"level":"error","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[38;5;9merror\u001b[0m\u001b[0m\u001b[1m: aborting due to previous error\u001b[0m\n\n"}
{"message":"For more information about this error, try `rustc --explain E0554`.","code":null,"level":"failure-note","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1mFor more information about this error, try `rustc --explain E0554`.\u001b[0m\n"}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
a0b4ddc7bb8a0822

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[]","target":13426536227497734495,"profile":3735503092003429423,"path":15455988322078452367,"deps":[[15453419386813495897,"libc",false,7020398714941766471]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/num_cpus-d59d9f31f9d661e0/dep-lib-num_cpus"}}],"rustflags":[],"metadata":1799163834891829354,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
0c86067d8dc9d216

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[]","target":11362289256543939748,"profile":3735503092003429423,"path":8336307195746771972,"deps":[[4580265255435207023,"crossbeam_deque",false,840915192044212632],[5239889730035657011,"either",false,4093381579892412472],[14110832792477743216,"rayon_core",false,2134430715470800254]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/rayon-bc34e96e0734519e/dep-lib-rayon"}}],"rustflags":[],"metadata":16007375514346065096,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"","target":0,"profile":0,"path":0,"deps":[[14110832792477743216,"build_script_build",false,17235628347690683736]],"local":[{"RerunIfChanged":{"output":"debug/build/rayon-core-3a011cba58d26b21/output","paths":["build.rs"]}}],"rustflags":[],"metadata":0,"config":0,"compile_kind":0}

View file

@ -0,0 +1 @@
588dc1f8a94031ef

View file

@ -0,0 +1 @@
{"rustc":4936231744503104448,"features":"[]","target":427768481117760528,"profile":12637318739757120569,"path":7589689886644562382,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/rayon-core-c912384fbeb5ddaa/dep-build-script-build-script-build"}}],"rustflags":[],"metadata":14590378261418540923,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

Some files were not shown because too many files have changed in this diff Show more