cellular_lib/
lib.rs

1#![feature(test)]
2#![warn(
3    clippy::pedantic,
4    clippy::all,
5    clippy::style,
6    clippy::complexity,
7    clippy::correctness,
8    clippy::perf
9)]
10#![allow(
11    clippy::module_name_repetitions,
12    clippy::module_name_repetitions,
13    clippy::inline_always,
14    clippy::cast_sign_loss,
15    clippy::cast_possible_wrap
16)]
17
18#[macro_use]
19pub mod cellular_automata;
20//use self::cellular_automata::*;
21//use cellular_automata;
22
23#[cfg(test)]
24mod tests {
25    extern crate test;
26    use test::Bencher;
27    /*
28    #[test]
29    fn adaptive_transition_function_map_node_parse() {
30        let _parsed: crate::cellular_automata::AdaptiveTransitionFunctionMapNode =
31            crate::cellular_automata::util::Parseable::parse("1 1 2 3,1 1 4 3");
32    }
33    #[test]
34    fn adaptive_transition_function_map_node_visit() {
35        let parsed: crate::cellular_automata::AdaptiveTransitionFunctionMapNode =
36            crate::cellular_automata::util::Parseable::parse("2 3,4 5");
37        assert_eq!(
38            parsed.next_node(&crate::cellular_automata::util::UsizeWrapper::from(2)),
39            &crate::cellular_automata::AdaptiveTransitionFunctionMapNode::End(
40                crate::cellular_automata::util::UsizeWrapper::from(3)
41            )
42        );
43        assert_eq!(
44            parsed.next_node(&crate::cellular_automata::util::UsizeWrapper::from(4)),
45            &crate::cellular_automata::AdaptiveTransitionFunctionMapNode::End(
46                crate::cellular_automata::util::UsizeWrapper::from(5)
47            )
48        );
49    }
50    #[test]
51    fn adaptive_transition_function_map_node_lookup() {
52        let parsed: crate::cellular_automata::AdaptiveTransitionFunctionMapNode =
53            crate::cellular_automata::util::Parseable::parse("2 3 4,5 6 7,8 9 10");
54        assert_eq!(
55            crate::cellular_automata::util::UsizeWrapper::from(4),
56            parsed.follow_path(vec![
57                &crate::cellular_automata::util::UsizeWrapper::from(2),
58                &crate::cellular_automata::util::UsizeWrapper::from(3)
59            ])
60        );
61    }
62    */
63    #[test]
64    fn test_addr_normal_to_flattened_usize() {
65        assert_eq!(
66            crate::cellular_automata::util::addr_normal_to_flattened_usize(&[2, 3], &[5, 6]),
67            28
68        );
69    }
70    #[test]
71    fn new_adaptive_transition_function_map_node_lookup() {
72        let parsed: crate::cellular_automata::AdaptiveTransitionFunctionMatrix =
73            crate::cellular_automata::util::Parseable::parse("2 3 4;5 6 7;8 9 10");
74        assert_eq!(
75            crate::cellular_automata::util::NanoVec::new(
76                1,
77                crate::cellular_automata::util::UsizeWrapper::from(4)
78            ),
79            parsed.follow_path(&[
80                &crate::cellular_automata::util::NanoVec::new(
81                    1,
82                    crate::cellular_automata::util::UsizeWrapper::from(2)
83                ),
84                &crate::cellular_automata::util::NanoVec::new(
85                    1,
86                    crate::cellular_automata::util::UsizeWrapper::from(3)
87                )
88            ])
89        );
90        assert_eq!(
91            crate::cellular_automata::util::NanoVec::new(
92                1,
93                crate::cellular_automata::util::UsizeWrapper::from(10)
94            ),
95            parsed.follow_path(&[
96                &crate::cellular_automata::util::NanoVec::new(
97                    1,
98                    crate::cellular_automata::util::UsizeWrapper::from(8)
99                ),
100                &crate::cellular_automata::util::NanoVec::new(
101                    1,
102                    crate::cellular_automata::util::UsizeWrapper::from(9)
103                )
104            ])
105        );
106    }
107    #[test]
108    fn test_nano_vec_index() {
109        let mut tmp: crate::cellular_automata::util::NanoVec<
110            crate::cellular_automata::util::UsizeWrapper,
111        > = crate::cellular_automata::util::NanoVec::new(
112            16,
113            crate::cellular_automata::util::UsizeWrapper::from(0),
114        );
115        for j in 0..16 {
116            tmp.set_at(j, crate::cellular_automata::util::UsizeWrapper::from(j));
117        }
118        for j in 0..16 {
119            assert_eq!(
120                tmp.at(j),
121                &crate::cellular_automata::util::UsizeWrapper::from(j)
122            );
123        }
124    }
125    #[test]
126    fn test_nano_vec_iter() {
127        let mut tmp: crate::cellular_automata::util::NanoVec<
128            crate::cellular_automata::util::UsizeWrapper,
129        > = crate::cellular_automata::util::NanoVec::new(
130            16,
131            crate::cellular_automata::util::UsizeWrapper::from(0),
132        );
133        for j in 0..16 {
134            tmp.set_at(j, crate::cellular_automata::util::UsizeWrapper::from(j));
135        }
136        for (j, item) in tmp.into_iter().enumerate() {
137            assert_eq!(item, crate::cellular_automata::util::UsizeWrapper::from(j));
138        }
139    }
140    #[test]
141    fn test_parse_table_sections() {
142        assert_eq!(
143            crate::cellular_automata::util::parse_table_sections("7;1,1,1,1;a,s,d,f"),
144            vec!["a", "s", "d", "f"]
145        );
146    }
147    #[test]
148    fn test_access_flattened_vec() {
149        /*
150        assert_eq!(
151            crate::cellular_automata::util::access_flattened_vec(
152                &vec![1, 2, 3, 4, 5, 6, 7, 8][..],
153                &vec![0, 1, 1],
154                &vec![2, 2, 2],
155                0
156            ),
157            &4
158        );
159        */
160        assert_eq!(
161            crate::cellular_automata::util::access_flattened_vec(
162                &vec![2, 3, 4, 5, 6, 7, 8, 9, 10][..],
163                &vec![3][..],
164                &vec![8][..],
165                0,
166                &0
167            ),
168            &5
169        );
170        assert_eq!(
171            crate::cellular_automata::util::access_flattened_vec(
172                &vec![2, 3, 4, 5, 6, 7, 8, 9, 10][..],
173                &vec![1, 2][..],
174                &vec![3, 3][..],
175                0,
176                &0
177            ),
178            &7
179        );
180        assert_eq!(
181            crate::cellular_automata::util::access_flattened_vec(
182                &vec![2, 3, 4, 5, 6, 7][..],
183                &vec![1, 2][..],
184                &vec![2, 3][..],
185                0,
186                &0
187            ),
188            &7
189        );
190        assert_eq!(
191            crate::cellular_automata::util::access_flattened_vec(
192                &vec![2, 3, 4, 5, 6, 7][..],
193                &vec![6, 2][..],
194                &vec![2, 3][..],
195                0,
196                &99
197            ),
198            &99
199        );
200    }
201    /*
202    #[test]
203    fn test_adaptive_neighbor_parser_parse() {
204        let parsed: crate::cellular_automata::AdaptiveNeighborParserNode =
205            crate::cellular_automata::util::Parseable::parse("a2 3 4");
206        assert_eq!(
207            parsed,
208            crate::cellular_automata::AdaptiveNeighborParserNode::Absolute(vec![2, 3, 4])
209        );
210        let parsed_2: crate::cellular_automata::AdaptiveNeighborParserNode =
211            crate::cellular_automata::util::Parseable::parse("r2 -3 4");
212        assert_eq!(
213            parsed_2,
214            crate::cellular_automata::AdaptiveNeighborParserNode::Relative(vec![2, -3, 4])
215        )
216    }
217    */
218    #[test]
219    fn test_encode_table_sections() {
220        let to_encode = vec![
221            String::from("asdf"),
222            String::from("foo"),
223            String::from(";,.bar"),
224            String::from("Baz"),
225        ];
226        let encoded = crate::cellular_automata::util::encode_table_sections(&to_encode);
227        assert_eq!(
228            crate::cellular_automata::util::parse_table_sections(encoded.as_str()),
229            to_encode
230        );
231    }
232    #[bench]
233    fn bench_new_transition_function_lookup(bencher: &mut Bencher) {
234        let parsed: crate::cellular_automata::AdaptiveTransitionFunctionMatrix =
235            crate::cellular_automata::util::Parseable::parse("2 3 4;5 6 7;8 9 10");
236        bencher.iter(|| {
237            for _ in 0..200 {
238                assert_eq!(
239                    crate::cellular_automata::util::NanoVec::new(
240                        1,
241                        crate::cellular_automata::util::UsizeWrapper::from(4)
242                    ),
243                    parsed.follow_path(&[
244                        &crate::cellular_automata::util::NanoVec::new(
245                            1,
246                            crate::cellular_automata::util::UsizeWrapper::from(2)
247                        ),
248                        &crate::cellular_automata::util::NanoVec::new(
249                            1,
250                            crate::cellular_automata::util::UsizeWrapper::from(3)
251                        )
252                    ])
253                );
254                assert_eq!(
255                    crate::cellular_automata::util::NanoVec::new(
256                        1,
257                        crate::cellular_automata::util::UsizeWrapper::from(10)
258                    ),
259                    parsed.follow_path(&[
260                        &crate::cellular_automata::util::NanoVec::new(
261                            1,
262                            crate::cellular_automata::util::UsizeWrapper::from(8)
263                        ),
264                        &crate::cellular_automata::util::NanoVec::new(
265                            1,
266                            crate::cellular_automata::util::UsizeWrapper::from(9)
267                        )
268                    ])
269                );
270            }
271        });
272    }
273    /*
274    #[bench]
275    fn bench_transition_function_lookup(bencher: &mut Bencher) {
276        let parsed: crate::cellular_automata::AdaptiveTransitionFunctionMapNode =
277            crate::cellular_automata::util::Parseable::parse("2 3 4,5 6 7,8 9 10");
278        bencher.iter(|| {
279            for _ in 0..200 {
280                assert_eq!(
281                    crate::cellular_automata::util::UsizeWrapper::from(4),
282                    parsed.follow_path(vec![
283                        &crate::cellular_automata::util::UsizeWrapper::from(2),
284                        &crate::cellular_automata::util::UsizeWrapper::from(3)
285                    ])
286                );
287                assert_eq!(
288                    crate::cellular_automata::util::UsizeWrapper::from(7),
289                    parsed.follow_path(vec![
290                        &crate::cellular_automata::util::UsizeWrapper::from(5),
291                        &crate::cellular_automata::util::UsizeWrapper::from(6)
292                    ])
293                );
294                assert_eq!(
295                    crate::cellular_automata::util::UsizeWrapper::from(10),
296                    parsed.follow_path(vec![
297                        &crate::cellular_automata::util::UsizeWrapper::from(8),
298                        &crate::cellular_automata::util::UsizeWrapper::from(9)
299                    ])
300                );
301            }
302        });
303    }
304    */
305}