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 ) -> 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 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 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 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}