Struct dyn_cache::local::SharedLocalCache [−][src]
pub struct SharedLocalCache { /* fields omitted */ }
Expand description
Provides shared, synchronized access to a LocalCache
and a function-memoization
API in SharedLocalCache::cache_with
.
For convenience wrappers around SharedLocalCache::cache_with
see
SharedLocalCache::cache
for returned types that implement
Clone
and SharedLocalCache::hold
for values that just need to be stored
without returning a reference.
Example
let storage = dyn_cache::local::SharedLocalCache::default();
let call_count = std::cell::Cell::new(0);
let increment_count = |&to_add: &i32| {
let new_count = call_count.get() + to_add;
call_count.set(new_count);
new_count
};
assert_eq!(call_count.get(), 0, "not called yet");
let with_one = storage.cache_with(&'a', &1, &increment_count, Clone::clone);
assert_eq!(call_count.get(), 1, "called only once");
assert_eq!(call_count.get(), with_one);
let with_one_again = storage.cache_with(&'a', &1, &increment_count, Clone::clone);
assert_eq!(call_count.get(), 1, "still called only once, previous value cached");
assert_eq!(call_count.get(), with_one_again);
let with_two = storage.cache_with(&'a', &2, &increment_count, Clone::clone);
assert_eq!(call_count.get(), 3, "called again with a new, larger increment");
assert_eq!(call_count.get(), with_two);
let with_other_query = storage.cache_with(&'b', &1, &increment_count, Clone::clone);
assert_eq!(call_count.get(), 4, "called again with the same increment, different scope");
assert_eq!(call_count.get(), with_other_query);
let with_two_again = storage.cache_with(&'a', &2, &increment_count, Clone::clone);
assert_eq!(call_count.get(), 4, "cell still has last mutation's value");
assert_eq!(with_two_again, with_two, "cache should still have previous value");
storage.gc(); // won't drop any values, but sets all of the cached values to be dropped
call_count.set(0);
// re-run 'b', marking it live
let reran_other_query = storage.cache_with(&'b', &1, &increment_count, Clone::clone);
assert_eq!(reran_other_query , 4, "returns the cached value");
assert_eq!(call_count.get(), 0, "without running increment_count");
storage.gc(); // query 'a' will be dropped
// re-run 'b', observing cached value
let reran_other_query = storage.cache_with(&'b', &1, &increment_count, Clone::clone);
assert_eq!(reran_other_query , 4, "still returns the cached value");
assert_eq!(call_count.get(), 0, "still without running increment_count");
// run 'a' again, observe no cached value
let with_one_again = storage.cache_with(&'a', &1, &increment_count, Clone::clone);
assert_eq!(call_count.get(), 1, "called without caching");
assert_eq!(call_count.get(), with_one_again);
Implementations
pub fn cache_with<Key, Scope, Arg, Input, Output, Ret>(
&self,
key: &Key,
arg: &Arg,
init: impl FnOnce(&Input) -> Output,
with: impl FnOnce(&Output) -> Ret
) -> Ret where
Key: Eq + Hash + ToOwned<Owned = Scope> + ?Sized,
Scope: 'static + Borrow<Key> + Eq + Hash,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg>,
Output: 'static,
Ret: 'static,
pub fn cache_with<Key, Scope, Arg, Input, Output, Ret>(
&self,
key: &Key,
arg: &Arg,
init: impl FnOnce(&Input) -> Output,
with: impl FnOnce(&Output) -> Ret
) -> Ret where
Key: Eq + Hash + ToOwned<Owned = Scope> + ?Sized,
Scope: 'static + Borrow<Key> + Eq + Hash,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg>,
Output: 'static,
Ret: 'static,
Caches the result of init(arg)
once per key
, re-running it when arg
changes. Always
runs with
on the stored Output
before returning the result.
See SharedLocalCache::cache
for an ergonomic wrapper that requires Output: Clone
.
pub fn cache<Key, Scope, Arg, Input, Output>(
&self,
key: &Key,
arg: &Arg,
init: impl FnOnce(&Input) -> Output
) -> Output where
Key: Eq + Hash + ToOwned<Owned = Scope> + ?Sized,
Scope: 'static + Borrow<Key> + Eq + Hash,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg>,
Output: 'static + Clone,
pub fn cache<Key, Scope, Arg, Input, Output>(
&self,
key: &Key,
arg: &Arg,
init: impl FnOnce(&Input) -> Output
) -> Output where
Key: Eq + Hash + ToOwned<Owned = Scope> + ?Sized,
Scope: 'static + Borrow<Key> + Eq + Hash,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg>,
Output: 'static + Clone,
Caches the result of init(arg)
once per key
, re-running it when arg
changes. Clones
the cached output before returning the result.
See SharedLocalCache::cache_with
for a lower-level version which does not require
Output: Clone
.
pub fn hold<Key, Scope, Arg, Input, Output>(
&self,
key: &Key,
arg: &Arg,
init: impl FnOnce(&Input) -> Output
) where
Key: Eq + Hash + ToOwned<Owned = Scope> + ?Sized,
Scope: 'static + Borrow<Key> + Eq + Hash,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg>,
Output: 'static,
pub fn hold<Key, Scope, Arg, Input, Output>(
&self,
key: &Key,
arg: &Arg,
init: impl FnOnce(&Input) -> Output
) where
Key: Eq + Hash + ToOwned<Owned = Scope> + ?Sized,
Scope: 'static + Borrow<Key> + Eq + Hash,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg>,
Output: 'static,
Caches the result of init(arg)
once per key
, re-running it when arg
changes.
Does not return any reference to the cached value. See SharedLocalCache::cache
for similar functionality that returns a copy of Output
or
SharedLocalCache::cache_with
which allows specifying other pre-return functions.
Forwards to LocalCache::gc
.
Trait Implementations
Returns the “default value” for a type. Read more
Performs the conversion.
This method returns an ordering between self
and other
values if one exists. Read more
This method tests less than (for self
and other
) and is used by the <
operator. Read more
This method tests less than or equal to (for self
and other
) and is used by the <=
operator. Read more
This method tests greater than (for self
and other
) and is used by the >
operator. Read more
Auto Trait Implementations
Blanket Implementations
Mutably borrows from an owned value. Read more
impl<T> Downcast for T where
T: Any,
impl<T> Downcast for T where
T: Any,
Convert Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
. Read more
pub fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
pub fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Convert Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read more
Convert &Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read more
pub fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
pub fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert &mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read more