update at 2020-08-25 18:10:17 by ehlxr
parent
86488c2534
commit
182c439d7a
75
src/main.rs
75
src/main.rs
|
@ -1483,39 +1483,79 @@ fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Cacher<T, D, F>
|
// struct Cacher<T>
|
||||||
|
// where
|
||||||
|
// T: Fn(u32) -> u32,
|
||||||
|
// {
|
||||||
|
// calculation: T,
|
||||||
|
// value: Option<u32>,
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// impl<T> Cacher<T>
|
||||||
|
// where
|
||||||
|
// T: Fn(u32) -> u32,
|
||||||
|
// {
|
||||||
|
// fn new(calculation: T) -> Cacher<T> {
|
||||||
|
// Self {
|
||||||
|
// calculation,
|
||||||
|
// value: None,
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// fn value(&mut self, args: u32) -> u32 {
|
||||||
|
// match self.value {
|
||||||
|
// Some(&v) => v,
|
||||||
|
// None => {
|
||||||
|
// let v = (self.calculation)(args);
|
||||||
|
// v
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
struct Cacher<T, K, V>
|
||||||
where
|
where
|
||||||
T: Fn(&D) -> F,
|
T: Fn(&K) -> V,
|
||||||
{
|
{
|
||||||
calculation: T,
|
calculation: T,
|
||||||
value: HashMap<D, F>,
|
value: HashMap<K, V>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, D, F> Cacher<T, D, F>
|
impl<T, K, V> Cacher<T, K, V>
|
||||||
where
|
where
|
||||||
D: Hash + Eq,
|
V: Copy,
|
||||||
F: Copy,
|
K: Hash + Eq,
|
||||||
T: Fn(&D) -> F,
|
T: Fn(&K) -> V,
|
||||||
{
|
{
|
||||||
fn new(calculation: T) -> Cacher<T, D, F> {
|
fn new(calculation: T) -> Cacher<T, K, V> {
|
||||||
Self {
|
Self {
|
||||||
calculation,
|
calculation,
|
||||||
value: HashMap::<D, F>::new(),
|
value: HashMap::<K, V>::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn value(&mut self, args: D) -> F {
|
fn value(&mut self, args: K) -> V {
|
||||||
match self.value.get(&args) {
|
let value = &mut self.value;
|
||||||
|
|
||||||
|
match value.get(&args) {
|
||||||
Some(&v) => v,
|
Some(&v) => v,
|
||||||
None => {
|
None => {
|
||||||
let v = (self.calculation)(&args);
|
let x = (self.calculation)(&args);
|
||||||
let v1 = v.clone();
|
let x1 = x.clone();
|
||||||
|
value.insert(args, x);
|
||||||
self.value.insert(args, v);
|
x1
|
||||||
|
|
||||||
v1
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// match self.value.get(&args) {
|
||||||
|
// Some(&v) => v,
|
||||||
|
// None => {
|
||||||
|
// let x = (self.calculation)(&args);
|
||||||
|
// let x1 = x.clone();
|
||||||
|
// self.value.insert(args, x);
|
||||||
|
// x1
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1617,6 +1657,7 @@ mod tests {
|
||||||
});
|
});
|
||||||
|
|
||||||
let v = c.value("tetsss");
|
let v = c.value("tetsss");
|
||||||
|
let v = c.value("s");
|
||||||
assert_eq!(v, 7);
|
assert_eq!(v, 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue