File: tracked_struct_with_interned_query.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 (54 lines) | stat: -rw-r--r-- 1,446 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
mod common;

use salsa::Setter;

#[salsa::input]
struct MyInput {
    value: usize,
}

#[salsa::tracked]
struct Tracked<'db> {
    value: String,
}

#[salsa::tracked]
fn query_tracked(db: &dyn salsa::Database, input: MyInput) -> Tracked<'_> {
    Tracked::new(db, format!("{value}", value = input.value(db)))
}

#[salsa::tracked]
fn join<'db>(db: &'db dyn salsa::Database, tracked: Tracked<'db>, with: String) -> String {
    format!("{}{}", tracked.value(db), with)
}

#[test]
fn execute() {
    let mut db = salsa::DatabaseImpl::default();
    let input = MyInput::new(&db, 1);

    let tracked = query_tracked(&db, input);
    let joined = join(&db, tracked, "world".to_string());

    assert_eq!(joined, "1world");

    // Create a new revision: This puts the tracked struct created in revision 0
    // into the free list.
    input.set_value(&mut db).to(2);

    let tracked = query_tracked(&db, input);
    let joined = join(&db, tracked, "world".to_string());

    assert_eq!(joined, "2world");

    // Create a new revision: The tracked struct created in revision 0 is now
    // reused, including its id. The argument to `join` will hash and compare
    // equal to the argument used in revision 0 but the return value should be
    // 3world and not 1world.
    input.set_value(&mut db).to(3);

    let tracked = query_tracked(&db, input);
    let joined = join(&db, tracked, "world".to_string());

    assert_eq!(joined, "3world");
}