Skip to content

Commit bd3ade9

Browse files
Make ArrayViewMut::into_view public to allow lifetime preservation during conversion (#1600)
1 parent 0612fb7 commit bd3ade9

3 files changed

Lines changed: 61 additions & 2 deletions

File tree

src/arraytraits.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,17 @@ where
647647
}
648648
}
649649

650+
/// Implementation of `ArrayView::from(ArrayViewMut)`
651+
impl<'a, A, D> From<ArrayViewMut<'a, A, D>> for ArrayView<'a, A, D>
652+
where D: Dimension
653+
{
654+
/// Create a read-only array view from a mutable array view.
655+
fn from(view: ArrayViewMut<'a, A, D>) -> Self
656+
{
657+
view.into_view()
658+
}
659+
}
660+
650661
impl<A, D> From<Array<A, D>> for ArcArray<A, D>
651662
where D: Dimension
652663
{

src/impl_views/conversions.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,11 @@ where D: Dimension
273273
impl<'a, A, D> ArrayViewMut<'a, A, D>
274274
where D: Dimension
275275
{
276-
// Convert into a read-only view
277-
pub(crate) fn into_view(self) -> ArrayView<'a, A, D>
276+
/// Convert into a read-only view.
277+
///
278+
/// This method consumes the mutable view and returns an `ArrayView` that
279+
/// preserves the original lifetime `'a` of the data.
280+
pub fn into_view(self) -> ArrayView<'a, A, D>
278281
{
279282
unsafe { ArrayView::new(self.parts.ptr, self.parts.dim, self.parts.strides) }
280283
}

tests/views.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,48 @@ fn cell_view()
1515
}
1616
assert_eq!(a, answer);
1717
}
18+
19+
#[test]
20+
fn test_view_conversion()
21+
{
22+
let mut a = Array2::<f32>::zeros((4, 4));
23+
let view_mut = a.view_mut();
24+
let view = view_mut.into_view();
25+
assert_eq!(view.shape(), &[4, 4]);
26+
27+
let view_mut = a.view_mut();
28+
let view: ArrayView2<'_, f32> = view_mut.into();
29+
assert_eq!(view.shape(), &[4, 4]);
30+
}
31+
32+
#[test]
33+
fn test_view_conversion_lifetime()
34+
{
35+
// Regression test for #1595
36+
struct Foo<'a>
37+
{
38+
data: ArrayViewMut2<'a, f32>,
39+
}
40+
41+
impl<'a> Foo<'a>
42+
{
43+
fn into_shared(self) -> ArrayView2<'a, f32>
44+
{
45+
self.data.into_view()
46+
}
47+
48+
fn into_shared_from(self) -> ArrayView2<'a, f32>
49+
{
50+
self.data.into()
51+
}
52+
}
53+
54+
let mut a = Array2::<f32>::zeros((4, 4));
55+
let foo = Foo { data: a.view_mut() };
56+
let shared = foo.into_shared();
57+
assert_eq!(shared.shape(), &[4, 4]);
58+
59+
let foo = Foo { data: a.view_mut() };
60+
let shared = foo.into_shared_from();
61+
assert_eq!(shared.shape(), &[4, 4]);
62+
}

0 commit comments

Comments
 (0)