diff --git a/src/zip/mod.rs b/src/zip/mod.rs index fc8b99c7d..5badb91f3 100644 --- a/src/zip/mod.rs +++ b/src/zip/mod.rs @@ -220,6 +220,20 @@ impl<'a, A: 'a, S, D> IntoNdProducer for &'a ArrayBase } } +/// An array reference is an n-dimensional producer of element references +/// (like ArrayView). +impl<'a, 'b, A: 'a + 'b, S, D> IntoNdProducer for &'b &'a ArrayBase + where D: Dimension, + S: Data, +{ + type Item = &'a A; + type Dim = D; + type Output = ArrayView<'a, A, D>; + fn into_producer(self) -> Self::Output { + self.view() + } +} + /// A mutable array reference is an n-dimensional producer of mutable element /// references (like ArrayViewMut). impl<'a, A: 'a, S, D> IntoNdProducer for &'a mut ArrayBase @@ -234,6 +248,21 @@ impl<'a, A: 'a, S, D> IntoNdProducer for &'a mut ArrayBase } } +/// A mutable array reference is an n-dimensional producer of mutable element +/// references (like ArrayViewMut). +impl<'a, 'b, A: 'a + 'b, S, D> IntoNdProducer for &'a mut &'b mut ArrayBase + where D: Dimension, + S: DataMut, + 'b: 'a +{ + type Item = &'a mut A; + type Dim = D; + type Output = ArrayViewMut<'a, A, D>; + fn into_producer(self) -> Self::Output { + self.view_mut() + } +} + /// A slice is a one-dimensional producer impl<'a, A: 'a> IntoNdProducer for &'a [A] { type Item = ::Item; diff --git a/tests/zip.rs b/tests/zip.rs new file mode 100644 index 000000000..c59373f2d --- /dev/null +++ b/tests/zip.rs @@ -0,0 +1,9 @@ +use ndarray::{azip, ArrayBase, Data, DataMut, Dimension}; + +#[allow(unused)] +fn zip_ref_ref(mut a: &mut ArrayBase, b: &ArrayBase) +where Sa: DataMut, + Sb: Data +{ + azip!(mut a, b in { *a = 2.0*b }); +}