]> git.proxmox.com Git - rustc.git/blob - vendor/salsa/tests/requires.rs
New upstream version 1.46.0~beta.2+dfsg1
[rustc.git] / vendor / salsa / tests / requires.rs
1 //! Test `salsa::requires` attribute for private query dependencies
2 //! https://github.com/salsa-rs/salsa-rfcs/pull/3
3
4 mod queries {
5 #[salsa::query_group(InputGroupStorage)]
6 pub trait InputGroup {
7 #[salsa::input]
8 fn input(&self, x: u32) -> u32;
9 }
10
11 #[salsa::query_group(PrivGroupAStorage)]
12 pub trait PrivGroupA: InputGroup {
13 fn private_a(&self, x: u32) -> u32;
14 }
15
16 fn private_a(db: &impl PrivGroupA, x: u32) -> u32 {
17 db.input(x)
18 }
19
20 #[salsa::query_group(PrivGroupBStorage)]
21 pub trait PrivGroupB: InputGroup {
22 fn private_b(&self, x: u32) -> u32;
23 }
24
25 fn private_b(db: &impl PrivGroupB, x: u32) -> u32 {
26 db.input(x)
27 }
28
29 #[salsa::query_group(PubGroupStorage)]
30 #[salsa::requires(PrivGroupA)]
31 #[salsa::requires(PrivGroupB)]
32 pub trait PubGroup: InputGroup {
33 fn public(&self, x: u32) -> u32;
34 }
35
36 fn public(db: &(impl PubGroup + PrivGroupA + PrivGroupB), x: u32) -> u32 {
37 db.private_a(x) + db.private_b(x)
38 }
39 }
40
41 #[salsa::database(
42 queries::InputGroupStorage,
43 queries::PrivGroupAStorage,
44 queries::PrivGroupBStorage,
45 queries::PubGroupStorage
46 )]
47 #[derive(Default)]
48 struct Database {
49 runtime: salsa::Runtime<Database>,
50 }
51
52 impl salsa::Database for Database {
53 fn salsa_runtime(&self) -> &salsa::Runtime<Self> {
54 &self.runtime
55 }
56
57 fn salsa_runtime_mut(&mut self) -> &mut salsa::Runtime<Self> {
58 &mut self.runtime
59 }
60 }
61
62 #[test]
63 fn require_clauses_work() {
64 use queries::{InputGroup, PubGroup};
65 let mut db = Database::default();
66
67 db.set_input(1, 10);
68 assert_eq!(db.public(1), 20);
69 }