First commit
This commit is contained in:
commit
9aad62d5bc
189 changed files with 1086 additions and 0 deletions
141
Cargo.lock
generated
Normal file
141
Cargo.lock
generated
Normal 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
20
Cargo.toml
Normal 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
3
README.md
Normal 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
183
src/game.rs
Normal 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
19
src/lib.rs
Normal 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
62
src/reader.rs
Normal 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
86
src/writer.rs
Normal 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
1
target/.rustc_info.json
Normal 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
3
target/CACHEDIR.TAG
Normal 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
0
target/debug/.cargo-lock
Normal file
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
e3e3bcf4f93381eb
|
|
@ -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}
|
BIN
target/debug/.fingerprint/cfg-if-047a17fcf848a7e5/dep-lib-cfg-if
Normal file
BIN
target/debug/.fingerprint/cfg-if-047a17fcf848a7e5/dep-lib-cfg-if
Normal file
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
1ea8219b31b820eb
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
1fe31c4cf0dab974
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
9851066ce987ab0b
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
b18aa0a741a9d0ca
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
0146f167e95cdc0f
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
42efd4ff66c4bc51
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
6d4750a1d3778a5a
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
e660ff4293c47b71
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
7d4becbb590b9184
|
|
@ -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}
|
BIN
target/debug/.fingerprint/either-e3a3f6608a1c39f5/dep-lib-either
Normal file
BIN
target/debug/.fingerprint/either-e3a3f6608a1c39f5/dep-lib-either
Normal file
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
38509df7db9cce38
|
|
@ -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}
|
BIN
target/debug/.fingerprint/libc-8258942407591c42/dep-lib-libc
Normal file
BIN
target/debug/.fingerprint/libc-8258942407591c42/dep-lib-libc
Normal file
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
1
target/debug/.fingerprint/libc-8258942407591c42/lib-libc
Normal file
1
target/debug/.fingerprint/libc-8258942407591c42/lib-libc
Normal file
|
@ -0,0 +1 @@
|
|||
477bb6816f776d61
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
729d61773dc1ba40
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
c91b4acea5b4b822
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
56b247ac11a92a34
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
ffbcfaedfe8349c6
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
e9559722afc857fd
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -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"}
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -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}
|
|
@ -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"}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
a0b4ddc7bb8a0822
|
|
@ -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}
|
BIN
target/debug/.fingerprint/rayon-bc34e96e0734519e/dep-lib-rayon
Normal file
BIN
target/debug/.fingerprint/rayon-bc34e96e0734519e/dep-lib-rayon
Normal file
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
0c86067d8dc9d216
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
c500fd1d58082fdd
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
588dc1f8a94031ef
|
|
@ -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}
|
Binary file not shown.
|
@ -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
Loading…
Reference in a new issue