yt_tools/
variable_mesh.rs

1extern crate wasm_bindgen;
2use wasm_bindgen::prelude::*;
3
4#[wasm_bindgen]
5#[derive(Clone, Debug)]
6pub struct VariableMesh {
7    px: Vec<f64>,
8    py: Vec<f64>,
9    pdx: Vec<f64>,
10    pdy: Vec<f64>,
11    val: Vec<f64>,
12}
13
14#[derive(Clone, Debug, Copy)]
15pub struct VariablePixel{
16    pub px: f64,
17    pub py: f64,
18    pub pdx: f64,
19    pub pdy: f64,
20    pub val: f64,
21}
22
23pub struct VariablePixelIterator<'a>  {
24    mesh: &'a VariableMesh,
25    index: usize,
26    values: &'a Vec<f64>,
27}
28
29#[wasm_bindgen]
30impl VariableMesh {
31    #[wasm_bindgen(constructor)]
32    pub fn new(
33        px: Vec<f64>,
34        py: Vec<f64>,
35        pdx: Vec<f64>,
36        pdy: Vec<f64>,
37        val: Vec<f64>,
38        //values: HashMap<String, Vec<f64>>,
39    ) -> VariableMesh {
40        let size = px.len();
41        if !( (size == py.len()) &&
42              (size == pdx.len()) &&
43              (size == pdy.len()) &&
44              (size == val.len())
45        ) {
46            // This should eventually be a Result
47            panic!("Size mismatch for Vector components: {:?}, {:?}, {:?}, {:?}, {:?}",
48                   px.len(), py.len(), pdx.len(), pdy.len(), val.len());
49        }
50        VariableMesh {
51            px,
52            py,
53            pdx,
54            pdy,
55            val,
56        }
57    }
58}
59
60impl VariableMesh {
61    pub fn iter<'a>(&'a self) -> VariablePixelIterator<'a> {
62        VariablePixelIterator {
63            mesh: self,
64            index: 0,
65            values: &self.val
66        }
67    }
68}
69
70impl<'a> Iterator for VariablePixelIterator<'a> {
71    type Item = VariablePixel;
72
73    fn next(&mut self) -> Option<VariablePixel> {
74
75        if self.index >= self.mesh.px.len() {
76            None
77        } else {
78            self.index += 1;
79            Some(VariablePixel {
80                px: self.mesh.px[self.index - 1],
81                py: self.mesh.py[self.index - 1],
82                pdx: self.mesh.pdx[self.index - 1],
83                pdy: self.mesh.pdy[self.index - 1],
84                val: self.values[self.index - 1],
85            })
86        }
87    }
88}
89
90#[cfg(test)]
91mod tests {
92    use super::*;
93    #[test]
94    fn create_variable_mesh() {
95        // Create a new variable mesh with basic values
96
97        let _vm_test = VariableMesh::new(
98            vec![1.0, 2.0, 3.0, 4.0, 5.0],
99            vec![1.0, 2.0, 3.0, 4.0, 5.0],
100            vec![1.0, 2.0, 3.0, 4.0, 5.0],
101            vec![1.0, 2.0, 3.0, 4.0, 5.0],
102            vec![1.0, 2.0, 3.0, 4.0, 5.0],
103        );
104
105    }
106
107    #[test]
108    #[should_panic]
109    fn create_bad_variable_mesh() {
110        let _vm_test = VariableMesh::new(
111            vec![1.0, 2.0, 3.0, 4.0, 5.0],
112            vec![1.0, 2.0, 3.0, 4.0, 5.0],
113            vec![1.0, 2.0, 3.0, 4.0, 5.0],
114            vec![1.0, 2.0, 3.0, 4.0, 5.0],
115            vec![2.0, 3.0, 4.0, 5.0],
116        );
117    }
118
119    #[test]
120    fn test_iterator() {
121        let mut px: Vec<f64> = Vec::new();
122        let mut py: Vec<f64> = Vec::new();
123        let mut pdx: Vec<f64> = Vec::new();
124        let mut pdy: Vec<f64> = Vec::new();
125        let mut val: Vec<f64> = Vec::new();
126        for i in 0..1024*1024 {
127            // Just toss some random stuff in here
128            px.push((i as f64) * 1.0);
129            py.push((i as f64) * 1.2);
130            pdx.push((i as f64) * 0.21);
131            pdy.push((i as f64) * 0.22);
132            val.push((i as f64) * 4.05);
133        }
134        let vm = VariableMesh::new(
135            px, py, pdx, pdy, val
136        );
137        for (i, pixel) in vm.iter().enumerate() {
138            assert_eq!(pixel.px, (i as f64) * 1.0);
139            assert_eq!(pixel.py, (i as f64) * 1.2);
140            assert_eq!(pixel.pdx, (i as f64) * 0.21);
141            assert_eq!(pixel.pdy, (i as f64) * 0.22);
142            assert_eq!(pixel.val, (i as f64) * 4.05);
143        }
144        assert_eq!(vm.iter().count(), 1024*1024);
145    }
146}