Skip to main content

wolfram_expr/
packed_array.rs

1//! [`PackedArray`][ref/PackedArray]<sub>WL</sub> data type.
2//!
3//! [ref/PackedArray]: https://reference.wolfram.com/language/ref/Developer/PackedArrayQ.html
4
5use crate::array_buf::{ArrayBuf, ArrayElement};
6use crate::wxf::PackedArrayEnum;
7
8/// Owned [`PackedArray`][ref/PackedArray]<sub>WL</sub> value.
9///
10/// [ref/PackedArray]: https://reference.wolfram.com/language/ref/Developer/PackedArrayQ.html
11pub type PackedArray = ArrayBuf<PackedArrayEnum>;
12
13impl<T: ArrayElement<PackedArrayEnum>> From<(Vec<usize>, &[T])> for PackedArray {
14    fn from((dims, slice): (Vec<usize>, &[T])) -> Self {
15        PackedArray::from_slice(dims, slice)
16    }
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22    use crate::wxf::NumericArrayEnum;
23    use crate::NumericArrayRead;
24
25    #[test]
26    fn from_slice_basic() {
27        let arr = PackedArray::from_slice::<f64>(vec![2, 2], &[1.0, 2.0, 3.0, 4.0]);
28        assert_eq!(arr.data_type(), PackedArrayEnum::Real64);
29        assert_eq!(arr.dimensions(), &[2, 2]);
30        assert_eq!(arr.element_count(), 4);
31        assert_eq!(
32            arr.try_as_slice::<f64>(),
33            Some([1.0, 2.0, 3.0, 4.0].as_slice())
34        );
35        assert_eq!(arr.try_as_slice::<i32>(), None);
36    }
37
38    #[test]
39    fn bridge_to_numeric_array_read() {
40        let arr = PackedArray::from_slice::<i32>(vec![3], &[10, 20, 30]);
41        assert_eq!(NumericArrayRead::rank(&arr), 1);
42        assert_eq!(NumericArrayRead::byte_count(&arr), 12);
43        assert_eq!(
44            NumericArrayRead::data_type(&arr),
45            NumericArrayEnum::Integer32
46        );
47    }
48}