mirror of
https://github.com/salsa-rs/salsa.git
synced 2024-11-24 20:20:26 +00:00
fad97eeb6a
This had two unexpected consequences, one unfortunate, one "medium": * All `salsa::Database` must be `'static`. This falls out from `Q::DynDb` not having access to any lifetimes, but also the defaulting rules for `dyn QueryGroup` that make it `dyn QueryGroup + 'static`. We don't really support generic databases anyway yet so this isn't a big deal, and we can add workarounds later (ideally via GATs). * It is now statically impossible to invoke `snapshot` from a query, and so we don't need to test that it panics. This is because the signature of `snapshot` returns a `Snapshot<Self>` and that is not accessible to a `dyn QueryGroup` type. Similarly, invoking `Runtime::snapshot` directly is not possible becaues it is crate-private. So I removed the test. This seems ok, but eventually I would like to expose ways for queries to do parallel execution (matklad and I had talked about a "speculation" primitive for enabling that). * This commit is 99% boilerplate I did with search-and-replace. I also rolled in a few other changes I might have preferred to factor out, most notably removing the `GetQueryTable` plumbing trait in favor of free-methods, but it was awkward to factor them out and get all the generics right (so much simpler in this version).
39 lines
800 B
Rust
39 lines
800 B
Rust
//! Test that transparent (uncached) queries work
|
|
|
|
#[salsa::query_group(QueryGroupStorage)]
|
|
trait QueryGroup {
|
|
#[salsa::input]
|
|
fn input(&self, x: u32) -> u32;
|
|
#[salsa::transparent]
|
|
fn wrap(&self, x: u32) -> u32;
|
|
fn get(&self, x: u32) -> u32;
|
|
}
|
|
|
|
fn wrap(db: &dyn QueryGroup, x: u32) -> u32 {
|
|
db.input(x)
|
|
}
|
|
|
|
fn get(db: &dyn QueryGroup, x: u32) -> u32 {
|
|
db.wrap(x)
|
|
}
|
|
|
|
#[salsa::database(QueryGroupStorage)]
|
|
#[derive(Default)]
|
|
struct Database {
|
|
storage: salsa::Storage<Self>,
|
|
}
|
|
|
|
impl salsa::Database for Database {}
|
|
|
|
#[test]
|
|
fn transparent_queries_work() {
|
|
let mut db = Database::default();
|
|
|
|
db.set_input(1, 10);
|
|
assert_eq!(db.get(1), 10);
|
|
assert_eq!(db.get(1), 10);
|
|
|
|
db.set_input(1, 92);
|
|
assert_eq!(db.get(1), 92);
|
|
assert_eq!(db.get(1), 92);
|
|
}
|