File: tracked_fn_on_interned_enum.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 (93 lines) | stat: -rw-r--r-- 2,557 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
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
//! Test that a `tracked` fn on a `salsa::interned`
//! compiles and executes successfully.

#[salsa::interned(no_lifetime, debug)]
struct Name {
    name: String,
}

#[salsa::interned(debug)]
struct NameAndAge<'db> {
    name_and_age: String,
}

#[salsa::interned(no_lifetime, debug)]
struct Age {
    age: u32,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, salsa::Supertype)]
enum Enum<'db> {
    Name(Name),
    NameAndAge(NameAndAge<'db>),
    Age(Age),
}

#[salsa::input(debug)]
struct Input {
    value: String,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, salsa::Supertype)]
enum EnumOfEnum<'db> {
    Enum(Enum<'db>),
    Input(Input),
}

#[salsa::tracked]
fn tracked_fn<'db>(db: &'db dyn salsa::Database, enum_: Enum<'db>) -> String {
    match enum_ {
        Enum::Name(name) => name.name(db),
        Enum::NameAndAge(name_and_age) => name_and_age.name_and_age(db),
        Enum::Age(age) => age.age(db).to_string(),
    }
}

#[salsa::tracked]
fn tracked_fn2<'db>(db: &'db dyn salsa::Database, enum_: EnumOfEnum<'db>) -> String {
    match enum_ {
        EnumOfEnum::Enum(enum_) => tracked_fn(db, enum_),
        EnumOfEnum::Input(input) => input.value(db),
    }
}

#[test]
fn execute() {
    let db = salsa::DatabaseImpl::new();
    let name = Name::new(&db, "Salsa".to_string());
    let name_and_age = NameAndAge::new(&db, "Salsa 3".to_string());
    let age = Age::new(&db, 123);

    assert_eq!(tracked_fn(&db, Enum::Name(name)), "Salsa");
    assert_eq!(tracked_fn(&db, Enum::NameAndAge(name_and_age)), "Salsa 3");
    assert_eq!(tracked_fn(&db, Enum::Age(age)), "123");
    assert_eq!(tracked_fn(&db, Enum::Name(name)), "Salsa");
    assert_eq!(tracked_fn(&db, Enum::NameAndAge(name_and_age)), "Salsa 3");
    assert_eq!(tracked_fn(&db, Enum::Age(age)), "123");

    assert_eq!(
        tracked_fn2(&db, EnumOfEnum::Enum(Enum::Name(name))),
        "Salsa"
    );
    assert_eq!(
        tracked_fn2(&db, EnumOfEnum::Enum(Enum::NameAndAge(name_and_age))),
        "Salsa 3"
    );
    assert_eq!(tracked_fn2(&db, EnumOfEnum::Enum(Enum::Age(age))), "123");
    assert_eq!(
        tracked_fn2(&db, EnumOfEnum::Enum(Enum::Name(name))),
        "Salsa"
    );
    assert_eq!(
        tracked_fn2(&db, EnumOfEnum::Enum(Enum::NameAndAge(name_and_age))),
        "Salsa 3"
    );
    assert_eq!(tracked_fn2(&db, EnumOfEnum::Enum(Enum::Age(age))), "123");
    assert_eq!(
        tracked_fn2(
            &db,
            EnumOfEnum::Input(Input::new(&db, "Hello world!".to_string()))
        ),
        "Hello world!"
    );
}