summaryrefslogtreecommitdiffstats
path: root/CLI/rust/src/game_of_life/simulation
diff options
context:
space:
mode:
Diffstat (limited to 'CLI/rust/src/game_of_life/simulation')
-rw-r--r--CLI/rust/src/game_of_life/simulation/plane.rs72
-rw-r--r--CLI/rust/src/game_of_life/simulation/universe.rs80
2 files changed, 152 insertions, 0 deletions
diff --git a/CLI/rust/src/game_of_life/simulation/plane.rs b/CLI/rust/src/game_of_life/simulation/plane.rs
new file mode 100644
index 0000000..10acd43
--- /dev/null
+++ b/CLI/rust/src/game_of_life/simulation/plane.rs
@@ -0,0 +1,72 @@
+use std::ops::{Index, IndexMut};
+use super::circular_index;
+
+/// Game of Life universe building blocks (a plane is a circular Vec)
+///
+/// This is used internally in the implementation of the Universe to allow
+/// more readable and safer traversing of the universe blocks
+#[derive(Debug, Clone, PartialEq)]
+pub(crate) struct Plane(pub Vec<bool>);
+
+impl Index<isize> for Plane {
+ type Output = bool;
+ fn index(&self, idx: isize) -> &bool {
+ let len = self.0.len() as isize;
+ &self.0[circular_index(idx, len)]
+ }
+}
+
+impl IndexMut<isize> for Plane {
+ fn index_mut(&mut self, idx: isize) -> &mut Self::Output {
+ let len = self.0.len() as isize;
+ &mut self.0[circular_index(idx, len)]
+ }
+}
+
+#[cfg(test)]
+mod plane {
+ use super::*;
+
+ mod index {
+ use super::*;
+
+ #[test]
+ fn get_element() {
+ let p = Plane(vec![false, false, true, false, false]);
+ assert_eq!(p[0], false);
+ assert_eq!(p[1], false);
+ assert_eq!(p[3], false);
+ assert_eq!(p[4], false);
+
+ assert_eq!(p[-3], true);
+ assert_eq!(p[2], true);
+ assert_eq!(p[7], true);
+ }
+ }
+
+ #[cfg(test)]
+ mod index_mut {
+ use super::*;
+
+ #[test]
+ fn set_negative_index_element() {
+ let mut p = Plane(vec![false, false, false, false, false]);
+ p[-3] = true;
+ assert_eq!(p, Plane(vec![false, false, true, false, false]));
+ }
+
+ #[test]
+ fn set_element() {
+ let mut p = Plane(vec![false, false, false, false, false]);
+ p[2] = true;
+ assert_eq!(p, Plane(vec![false, false, true, false, false]));
+ }
+
+ #[test]
+ fn set_out_of_bound_element() {
+ let mut p = Plane(vec![false, false, false, false, false]);
+ p[7] = true;
+ assert_eq!(p, Plane(vec![false, false, true, false, false]));
+ }
+ }
+}
diff --git a/CLI/rust/src/game_of_life/simulation/universe.rs b/CLI/rust/src/game_of_life/simulation/universe.rs
new file mode 100644
index 0000000..5e5a921
--- /dev/null
+++ b/CLI/rust/src/game_of_life/simulation/universe.rs
@@ -0,0 +1,80 @@
+use crate::game_of_life::opts::Opts;
+use crate::game_of_life::simulation::plane::Plane;
+use std::ops::Index;
+use super::circular_index;
+
+
+/// Game of Life universe struct for running simulations
+#[derive(Debug, Clone, PartialEq)]
+pub(crate) struct Universe {
+ pub opts: Opts,
+ pub current: Vec<Plane>,
+ pub future: Vec<Plane>,
+}
+
+impl Index<isize> for Universe
+{
+ type Output = Plane;
+ fn index(&self, idx: isize) -> &Plane {
+ let len = self.current.len() as isize;
+ &self.current[circular_index(idx, len)]
+ }
+}
+
+#[cfg(test)]
+mod universe {
+ use super::*;
+
+ mod index {
+ use super::*;
+
+ #[test]
+ fn get_element() {
+ let opts = Opts {
+ seed: 1337,
+ input: None,
+ width: 13,
+ height: 13,
+ live_cell: 'L',
+ dead_cell: 'D',
+ delay: 13,
+ };
+ let u = Universe {
+ opts,
+ current: vec![
+ Plane(vec![false; 5]),
+ Plane(vec![false, false, true, false, false]),
+ Plane(vec![false; 5]),
+ ],
+ future: vec![Plane(vec![])],
+ };
+
+ assert_eq!(u[-3][0], false);
+ assert_eq!(u[-3][1], false);
+ assert_eq!(u[-3][3], false);
+ assert_eq!(u[-3][4], false);
+ assert_eq!(u[0][0], false);
+ assert_eq!(u[0][1], false);
+ assert_eq!(u[0][3], false);
+ assert_eq!(u[0][4], false);
+ assert_eq!(u[2][0], false);
+ assert_eq!(u[2][1], false);
+ assert_eq!(u[2][3], false);
+ assert_eq!(u[2][4], false);
+ assert_eq!(u[5][0], false);
+ assert_eq!(u[5][1], false);
+ assert_eq!(u[5][3], false);
+ assert_eq!(u[5][4], false);
+
+ assert_eq!(u[-2][-3], true);
+ assert_eq!(u[-2][2], true);
+ assert_eq!(u[-2][7], true);
+ assert_eq!(u[1][-3], true);
+ assert_eq!(u[1][2], true);
+ assert_eq!(u[1][7], true);
+ assert_eq!(u[4][-3], true);
+ assert_eq!(u[4][2], true);
+ assert_eq!(u[4][7], true);
+ }
+ }
+}