Skip to main content

vtk_pure_rs/data/
field_data.rs

1use crate::data::AnyDataArray;
2
3/// A named, heterogeneous collection of data arrays.
4///
5/// Analogous to VTK's `vtkFieldData`.
6#[derive(Debug, Clone, Default, PartialEq)]
7pub struct FieldData {
8    arrays: Vec<AnyDataArray>,
9}
10
11impl FieldData {
12    pub fn new() -> Self {
13        Self { arrays: Vec::new() }
14    }
15
16    pub fn add_array(&mut self, array: AnyDataArray) {
17        // Replace existing array with the same name.
18        if let Some(pos) = self.arrays.iter().position(|a| a.name() == array.name()) {
19            self.arrays[pos] = array;
20        } else {
21            self.arrays.push(array);
22        }
23    }
24
25    pub fn get_array(&self, name: &str) -> Option<&AnyDataArray> {
26        self.arrays.iter().find(|a| a.name() == name)
27    }
28
29    pub fn get_array_mut(&mut self, name: &str) -> Option<&mut AnyDataArray> {
30        self.arrays.iter_mut().find(|a| a.name() == name)
31    }
32
33    pub fn get_array_by_index(&self, idx: usize) -> Option<&AnyDataArray> {
34        self.arrays.get(idx)
35    }
36
37    pub fn num_arrays(&self) -> usize {
38        self.arrays.len()
39    }
40
41    pub fn iter(&self) -> impl Iterator<Item = &AnyDataArray> {
42        self.arrays.iter()
43    }
44
45    pub fn remove_array(&mut self, name: &str) -> Option<AnyDataArray> {
46        if let Some(pos) = self.arrays.iter().position(|a| a.name() == name) {
47            Some(self.arrays.remove(pos))
48        } else {
49            None
50        }
51    }
52
53    /// Check if an array with the given name exists.
54    pub fn has_array(&self, name: &str) -> bool {
55        self.arrays.iter().any(|a| a.name() == name)
56    }
57
58    /// Get all array names.
59    pub fn names(&self) -> Vec<&str> {
60        self.arrays.iter().map(|a| a.name()).collect()
61    }
62
63    /// Check if the field data is empty.
64    pub fn is_empty(&self) -> bool {
65        self.arrays.is_empty()
66    }
67
68    /// Clear all arrays.
69    pub fn clear(&mut self) {
70        self.arrays.clear();
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77    use crate::data::DataArray;
78
79    #[test]
80    fn add_and_get() {
81        let mut fd = FieldData::new();
82        fd.add_array(crate::data::AnyDataArray::F64(DataArray::from_vec("temp", vec![1.0, 2.0], 1)));
83        assert_eq!(fd.num_arrays(), 1);
84        assert!(fd.has_array("temp"));
85        assert!(!fd.has_array("other"));
86    }
87
88    #[test]
89    fn replace_same_name() {
90        let mut fd = FieldData::new();
91        fd.add_array(crate::data::AnyDataArray::F64(DataArray::from_vec("x", vec![1.0], 1)));
92        fd.add_array(crate::data::AnyDataArray::F64(DataArray::from_vec("x", vec![2.0, 3.0], 1)));
93        assert_eq!(fd.num_arrays(), 1);
94        assert_eq!(fd.get_array("x").unwrap().num_tuples(), 2);
95    }
96
97    #[test]
98    fn remove() {
99        let mut fd = FieldData::new();
100        fd.add_array(crate::data::AnyDataArray::F64(DataArray::from_vec("a", vec![1.0], 1)));
101        fd.add_array(crate::data::AnyDataArray::F64(DataArray::from_vec("b", vec![2.0], 1)));
102        fd.remove_array("a");
103        assert_eq!(fd.num_arrays(), 1);
104        assert!(!fd.has_array("a"));
105    }
106
107    #[test]
108    fn names() {
109        let mut fd = FieldData::new();
110        fd.add_array(crate::data::AnyDataArray::F64(DataArray::from_vec("x", vec![1.0], 1)));
111        fd.add_array(crate::data::AnyDataArray::F64(DataArray::from_vec("y", vec![2.0], 1)));
112        assert_eq!(fd.names(), vec!["x", "y"]);
113    }
114
115    #[test]
116    fn clear() {
117        let mut fd = FieldData::new();
118        fd.add_array(crate::data::AnyDataArray::F64(DataArray::from_vec("x", vec![1.0], 1)));
119        assert!(!fd.is_empty());
120        fd.clear();
121        assert!(fd.is_empty());
122    }
123}