Struct dyn_cache::sync::SharedSendCache [−][src]
pub struct SharedSendCache { /* fields omitted */ }Expand description
Provides shared, synchronized access to a SendCache and a function-memoization
API in SharedSendCache::cache_with.
For convenience wrappers around SharedSendCache::cache_with see
SharedSendCache::cache for returned types that implement
Clone and SharedSendCache::hold for values that just need to be stored
without returning a reference.
Example
let storage = dyn_cache::sync::SharedSendCache::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 + Send,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg> + Send,
Output: 'static + Send,
Ret: 'static + Send,
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 + Send,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg> + Send,
Output: 'static + Send,
Ret: 'static + Send,
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 SharedSendCache::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 + Send,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg> + Send,
Output: 'static + Clone + Send,
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 + Send,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg> + Send,
Output: 'static + Clone + Send,
Caches the result of init(arg) once per key, re-running it when arg changes. Clones
the cached output before returning the result.
See SharedSendCache::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 + Send,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg> + Send,
Output: 'static + Send,
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 + Send,
Arg: PartialEq<Input> + ToOwned<Owned = Input> + ?Sized,
Input: 'static + Borrow<Arg> + Send,
Output: 'static + Send,
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 SharedSendCache::cache
for similar functionality that returns a copy of Output or
SharedSendCache::cache_with which allows specifying other pre-return functions.
Forwards to SendCache::gc.
Trait Implementations
Returns the “default value” for a type. Read more
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