ritecache/meter/
count_meter.rs1use std::borrow::Borrow;
2
3use super::Meter;
4
5pub struct Count;
7
8impl<K, V> Meter<K, V> for Count {
9 type Measure = ();
11
12 fn measure<Q: ?Sized>(&self, _: &Q, _: &V)
14 where
15 K: Borrow<Q>,
16 {
17 }
18}
19
20pub trait CountableMeter<K, V>: Meter<K, V> {
23 fn add(&self, current: Self::Measure, amount: Self::Measure) -> Self::Measure;
25 fn sub(&self, current: Self::Measure, amount: Self::Measure) -> Self::Measure;
27 fn size(&self, current: Self::Measure) -> Option<u64>;
32}
33
34impl<K, V, T: Meter<K, V>> CountableMeter<K, V> for T
36where
37 T: CountableMeterWithMeasure<K, V, <T as Meter<K, V>>::Measure>,
38{
39 fn add(&self, current: Self::Measure, amount: Self::Measure) -> Self::Measure {
40 CountableMeterWithMeasure::meter_add(self, current, amount)
41 }
42 fn sub(&self, current: Self::Measure, amount: Self::Measure) -> Self::Measure {
43 CountableMeterWithMeasure::meter_sub(self, current, amount)
44 }
45 fn size(&self, current: Self::Measure) -> Option<u64> {
46 CountableMeterWithMeasure::meter_size(self, current)
47 }
48}
49
50pub trait CountableMeterWithMeasure<K, V, M> {
51 fn meter_add(&self, current: M, amount: M) -> M;
53 fn meter_sub(&self, current: M, amount: M) -> M;
55 fn meter_size(&self, current: M) -> Option<u64>;
60}
61
62impl<K, V, T> CountableMeterWithMeasure<K, V, usize> for T
64where
65 T: Meter<K, V>,
66{
67 fn meter_add(&self, current: usize, amount: usize) -> usize {
68 current + amount
69 }
70 fn meter_sub(&self, current: usize, amount: usize) -> usize {
71 current - amount
72 }
73 fn meter_size(&self, current: usize) -> Option<u64> {
74 Some(current as u64)
75 }
76}
77
78impl<K, V> CountableMeterWithMeasure<K, V, ()> for Count {
79 fn meter_add(&self, _current: (), _amount: ()) {}
80 fn meter_sub(&self, _current: (), _amount: ()) {}
81 fn meter_size(&self, _current: ()) -> Option<u64> {
82 None
83 }
84}