File: cycle_regression_455.rs

package info (click to toggle)
rust-salsa 0.23.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,424 kB
  • sloc: sh: 12; makefile: 2; javascript: 1
file content (55 lines) | stat: -rw-r--r-- 1,206 bytes parent folder | download | duplicates (9)
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
use salsa::{Database, Setter};

#[salsa::tracked]
fn memoized(db: &dyn Database, input: MyInput) -> u32 {
    memoized_a(db, MyTracked::new(db, input.field(db)))
}

#[salsa::tracked(cycle_fn=cycle_fn, cycle_initial=cycle_initial)]
fn memoized_a<'db>(db: &'db dyn Database, tracked: MyTracked<'db>) -> u32 {
    MyTracked::new(db, 0);
    memoized_b(db, tracked)
}

fn cycle_fn<'db>(
    _db: &'db dyn Database,
    _value: &u32,
    _count: u32,
    _input: MyTracked<'db>,
) -> salsa::CycleRecoveryAction<u32> {
    salsa::CycleRecoveryAction::Iterate
}

fn cycle_initial(_db: &dyn Database, _input: MyTracked) -> u32 {
    0
}

#[salsa::tracked]
fn memoized_b<'db>(db: &'db dyn Database, tracked: MyTracked<'db>) -> u32 {
    let incr = tracked.field(db);
    let a = memoized_a(db, tracked);
    if a > 8 {
        a
    } else {
        a + incr
    }
}

#[salsa::input]
struct MyInput {
    field: u32,
}

#[salsa::tracked]
struct MyTracked<'db> {
    field: u32,
}

#[test]
fn cycle_memoized() {
    let mut db = salsa::DatabaseImpl::new();
    let input = MyInput::new(&db, 2);
    assert_eq!(memoized(&db, input), 10);
    input.set_field(&mut db).to(3);
    assert_eq!(memoized(&db, input), 9);
}