File: bindings.rs

package info (click to toggle)
rustc 1.88.0%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 934,128 kB
  • sloc: xml: 158,127; python: 36,062; javascript: 19,855; sh: 19,700; cpp: 18,947; ansic: 12,993; asm: 4,792; makefile: 690; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (119 lines) | stat: -rw-r--r-- 2,692 bytes parent folder | download | duplicates (7)
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
109
110
111
112
113
114
115
116
117
118
119
//@ revisions: explicit implicit
//@ run-pass
#![feature(deref_patterns)]
#![allow(incomplete_features)]

use std::rc::Rc;

#[cfg(explicit)]
fn simple_vec(vec: Vec<u32>) -> u32 {
    match vec {
        deref!([]) => 100,
        deref!([x]) if x == 4 => x + 4,
        deref!([x]) => x,
        deref!([1, x]) => x + 200,
        deref!(ref slice) => slice.iter().sum(),
    }
}

#[cfg(implicit)]
fn simple_vec(vec: Vec<u32>) -> u32 {
    match vec {
        [] => 100,
        [x] if x == 4 => x + 4,
        [x] => x,
        [1, x] => x + 200,
        deref!(ref slice) => slice.iter().sum(),
    }
}

#[cfg(explicit)]
fn nested_vec(vecvec: Vec<Vec<u32>>) -> u32 {
    match vecvec {
        deref!([]) => 0,
        deref!([deref!([x])]) => x,
        deref!([deref!([0, x]) | deref!([1, x])]) => x,
        deref!([ref x]) => x.iter().sum(),
        deref!([deref!([]), deref!([1, x, y])]) => y - x,
        _ => 2000,
    }
}

#[cfg(implicit)]
fn nested_vec(vecvec: Vec<Vec<u32>>) -> u32 {
    match vecvec {
        [] => 0,
        [[x]] => x,
        [[0, x] | [1, x]] => x,
        [ref x] => x.iter().sum(),
        [[], [1, x, y]] => y - x,
        _ => 2000,
    }
}

#[cfg(explicit)]
fn ref_mut(val: u32) -> u32 {
    let mut b = vec![0u32];
    match &mut b {
        deref!([_x]) if false => unreachable!(),
        deref!([x]) => {
            *x = val;
        }
        _ => unreachable!(),
    }
    let deref!([x]) = &b else { unreachable!() };
    *x
}

#[cfg(implicit)]
fn ref_mut(val: u32) -> u32 {
    let mut b = vec![0u32];
    match &mut b {
        [_x] if false => unreachable!(),
        [x] => {
            *x = val;
        }
        _ => unreachable!(),
    }
    let [x] = &b else { unreachable!() };
    *x
}

#[cfg(explicit)]
#[rustfmt::skip]
fn or_and_guard(tuple: (u32, u32)) -> u32 {
    let mut sum = 0;
    let b = Rc::new(tuple);
    match b {
        deref!((x, _) | (_, x)) if { sum += x; false } => {},
        _ => {},
    }
    sum
}

#[cfg(implicit)]
#[rustfmt::skip]
fn or_and_guard(tuple: (u32, u32)) -> u32 {
    let mut sum = 0;
    let b = Rc::new(tuple);
    match b {
        (x, _) | (_, x) if { sum += x; false } => {},
        _ => {},
    }
    sum
}

fn main() {
    assert_eq!(simple_vec(vec![1]), 1);
    assert_eq!(simple_vec(vec![1, 2]), 202);
    assert_eq!(simple_vec(vec![1, 2, 3]), 6);
    assert_eq!(simple_vec(vec![4]), 8);

    assert_eq!(nested_vec(vec![vec![0, 42]]), 42);
    assert_eq!(nested_vec(vec![vec![1, 42]]), 42);
    assert_eq!(nested_vec(vec![vec![1, 2, 3]]), 6);
    assert_eq!(nested_vec(vec![vec![], vec![1, 2, 3]]), 1);

    assert_eq!(ref_mut(42), 42);
    assert_eq!(or_and_guard((10, 32)), 42);
}