File: generics.rs

package info (click to toggle)
rust-multiversion 0.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 168 kB
  • sloc: makefile: 2
file content (49 lines) | stat: -rw-r--r-- 1,051 bytes parent folder | download | duplicates (2)
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
#![allow(clippy::needless_lifetimes)]

#[rustversion::since(1.51)]
#[multiversion::multiversion(targets(
    "x86_64+avx2+avx",
    "x86_64+avx",
    "x86+avx2+avx",
    "x86+avx",
    "x86+sse"
))]
fn pass<'a>(x: &'a i32) -> &'a i32 {
    x
}

#[rustversion::since(1.51)]
#[multiversion::multiversion(targets(
    "x86_64+avx2+avx",
    "x86_64+avx",
    "x86+avx2+avx",
    "x86+avx",
    "x86+sse"
))]
fn double<'a, T: Copy + std::ops::AddAssign, const N: usize>(x: &'a mut [T; N]) -> &'a mut T {
    assert!(!x.is_empty());
    for v in x.iter_mut() {
        *v += *v;
    }
    &mut x[0]
}

mod test {
    #[rustversion::since(1.51)]
    #[test]
    fn generics() {
        let mut x = [0u32, 2u32, 4u32];
        let mut y = [0u64, 2u64, 4u64];
        *super::double(&mut x) = 1;
        *super::double(&mut y) = 2;
        assert_eq!(x, [1u32, 4u32, 8u32]);
        assert_eq!(y, [2u64, 4u64, 8u64]);
    }

    #[rustversion::since(1.51)]
    #[test]
    fn lifetimes() {
        let a = 42;
        assert_eq!(super::pass(&a), &a);
    }
}