File: raw_views.rs

package info (click to toggle)
rust-ndarray 0.16.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,028 kB
  • sloc: sh: 30; makefile: 2
file content (108 lines) | stat: -rw-r--r-- 2,714 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
use ndarray::prelude::*;
use ndarray::Zip;

use std::cell::Cell;

#[test]
fn raw_view_cast_cell()
{
    // Test .cast() by creating an ArrayView<Cell<f32>>

    let mut a = Array::from_shape_fn((10, 5), |(i, j)| (i * j) as f32);
    let answer = &a + 1.;

    {
        let raw_cell_view = a.raw_view_mut().cast::<Cell<f32>>();
        let cell_view = unsafe { raw_cell_view.deref_into_view() };

        Zip::from(cell_view).for_each(|elt| elt.set(elt.get() + 1.));
    }
    assert_eq!(a, answer);
}

#[test]
fn raw_view_cast_reinterpret()
{
    // Test .cast() by reinterpreting u16 as [u8; 2]
    let a = Array::from_shape_fn((5, 5).f(), |(i, j)| (i as u16) << 8 | j as u16);
    let answer = a.mapv(u16::to_ne_bytes);

    let raw_view = a.raw_view().cast::<[u8; 2]>();
    let view = unsafe { raw_view.deref_into_view() };
    assert_eq!(view, answer);
}

#[test]
fn raw_view_cast_zst()
{
    struct Zst;

    let a = Array::<(), _>::default((250, 250));
    let b: RawArrayView<Zst, _> = a.raw_view().cast::<Zst>();
    assert_eq!(a.shape(), b.shape());
    assert_eq!(a.as_ptr() as *const u8, b.as_ptr() as *const u8);
}

#[test]
#[should_panic]
fn raw_view_invalid_size_cast()
{
    let data = [0i32; 16];
    ArrayView::from(&data[..]).raw_view().cast::<i64>();
}

#[test]
#[should_panic]
fn raw_view_mut_invalid_size_cast()
{
    let mut data = [0i32; 16];
    ArrayViewMut::from(&mut data[..])
        .raw_view_mut()
        .cast::<i64>();
}

#[test]
fn raw_view_misaligned()
{
    let data: [u16; 2] = [0x0011, 0x2233];
    let ptr: *const u16 = data.as_ptr();
    unsafe {
        let misaligned_ptr = (ptr as *const u8).add(1) as *const u16;
        RawArrayView::from_shape_ptr(1, misaligned_ptr);
    }
}

#[test]
#[cfg(debug_assertions)]
#[should_panic = "The pointer must be aligned."]
fn raw_view_deref_into_view_misaligned()
{
    fn misaligned_deref(data: &[u16; 2]) -> ArrayView1<'_, u16>
    {
        let ptr: *const u16 = data.as_ptr();
        unsafe {
            let misaligned_ptr = (ptr as *const u8).add(1) as *const u16;
            let raw_view = RawArrayView::from_shape_ptr(1, misaligned_ptr);
            raw_view.deref_into_view()
        }
    }
    let data: [u16; 2] = [0x0011, 0x2233];
    misaligned_deref(&data);
}

#[test]
#[cfg(debug_assertions)]
#[should_panic = "Unsupported"]
fn raw_view_negative_strides()
{
    fn misaligned_deref(data: &[u16; 2]) -> ArrayView1<'_, u16>
    {
        let ptr: *const u16 = data.as_ptr();
        unsafe {
            let raw_view = RawArrayView::from_shape_ptr(1.strides((-1isize) as usize), ptr);
            raw_view.deref_into_view()
        }
    }
    let data: [u16; 2] = [0x0011, 0x2233];
    misaligned_deref(&data);
}