]> git.proxmox.com Git - rustc.git/blob - vendor/salsa/tests/interned.rs
New upstream version 1.48.0+dfsg1
[rustc.git] / vendor / salsa / tests / interned.rs
1 //! Test that you can implement a query using a `dyn Trait` setup.
2
3 use salsa::InternId;
4
5 #[salsa::database(InternStorage)]
6 #[derive(Default)]
7 struct Database {
8 storage: salsa::Storage<Self>,
9 }
10
11 impl salsa::Database for Database {}
12
13 impl salsa::ParallelDatabase for Database {
14 fn snapshot(&self) -> salsa::Snapshot<Self> {
15 salsa::Snapshot::new(Database {
16 storage: self.storage.snapshot(),
17 })
18 }
19 }
20
21 #[salsa::query_group(InternStorage)]
22 trait Intern {
23 #[salsa::interned]
24 fn intern1(&self, x: String) -> InternId;
25
26 #[salsa::interned]
27 fn intern2(&self, x: String, y: String) -> InternId;
28
29 #[salsa::interned]
30 fn intern_key(&self, x: String) -> InternKey;
31 }
32
33 #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
34 pub struct InternKey(InternId);
35
36 impl salsa::InternKey for InternKey {
37 fn from_intern_id(v: InternId) -> Self {
38 InternKey(v)
39 }
40
41 fn as_intern_id(&self) -> InternId {
42 self.0
43 }
44 }
45
46 #[test]
47 fn test_intern1() {
48 let db = Database::default();
49 let foo0 = db.intern1(format!("foo"));
50 let bar0 = db.intern1(format!("bar"));
51 let foo1 = db.intern1(format!("foo"));
52 let bar1 = db.intern1(format!("bar"));
53
54 assert_eq!(foo0, foo1);
55 assert_eq!(bar0, bar1);
56 assert_ne!(foo0, bar0);
57
58 assert_eq!(format!("foo"), db.lookup_intern1(foo0));
59 assert_eq!(format!("bar"), db.lookup_intern1(bar0));
60 }
61
62 #[test]
63 fn test_intern2() {
64 let db = Database::default();
65 let foo0 = db.intern2(format!("x"), format!("foo"));
66 let bar0 = db.intern2(format!("x"), format!("bar"));
67 let foo1 = db.intern2(format!("x"), format!("foo"));
68 let bar1 = db.intern2(format!("x"), format!("bar"));
69
70 assert_eq!(foo0, foo1);
71 assert_eq!(bar0, bar1);
72 assert_ne!(foo0, bar0);
73
74 assert_eq!((format!("x"), format!("foo")), db.lookup_intern2(foo0));
75 assert_eq!((format!("x"), format!("bar")), db.lookup_intern2(bar0));
76 }
77
78 #[test]
79 fn test_intern_key() {
80 let db = Database::default();
81 let foo0 = db.intern_key(format!("foo"));
82 let bar0 = db.intern_key(format!("bar"));
83 let foo1 = db.intern_key(format!("foo"));
84 let bar1 = db.intern_key(format!("bar"));
85
86 assert_eq!(foo0, foo1);
87 assert_eq!(bar0, bar1);
88 assert_ne!(foo0, bar0);
89
90 assert_eq!(format!("foo"), db.lookup_intern_key(foo0));
91 assert_eq!(format!("bar"), db.lookup_intern_key(bar0));
92 }