use std::borrow::Borrow;
use super::Meter;
pub struct Count;
impl<K, V> Meter<K, V> for Count {
type Measure = ();
fn measure<Q: ?Sized>(&self, _: &Q, _: &V)
where
K: Borrow<Q>,
{
}
}
pub trait CountableMeter<K, V>: Meter<K, V> {
fn add(&self, current: Self::Measure, amount: Self::Measure) -> Self::Measure;
fn sub(&self, current: Self::Measure, amount: Self::Measure) -> Self::Measure;
fn size(&self, current: Self::Measure) -> Option<u64>;
}
impl<K, V, T: Meter<K, V>> CountableMeter<K, V> for T
where
T: CountableMeterWithMeasure<K, V, <T as Meter<K, V>>::Measure>,
{
fn add(&self, current: Self::Measure, amount: Self::Measure) -> Self::Measure {
CountableMeterWithMeasure::meter_add(self, current, amount)
}
fn sub(&self, current: Self::Measure, amount: Self::Measure) -> Self::Measure {
CountableMeterWithMeasure::meter_sub(self, current, amount)
}
fn size(&self, current: Self::Measure) -> Option<u64> {
CountableMeterWithMeasure::meter_size(self, current)
}
}
pub trait CountableMeterWithMeasure<K, V, M> {
fn meter_add(&self, current: M, amount: M) -> M;
fn meter_sub(&self, current: M, amount: M) -> M;
fn meter_size(&self, current: M) -> Option<u64>;
}
impl<K, V, T> CountableMeterWithMeasure<K, V, usize> for T
where
T: Meter<K, V>,
{
fn meter_add(&self, current: usize, amount: usize) -> usize {
current + amount
}
fn meter_sub(&self, current: usize, amount: usize) -> usize {
current - amount
}
fn meter_size(&self, current: usize) -> Option<u64> {
Some(current as u64)
}
}
impl<K, V> CountableMeterWithMeasure<K, V, ()> for Count {
fn meter_add(&self, _current: (), _amount: ()) {}
fn meter_sub(&self, _current: (), _amount: ()) {}
fn meter_size(&self, _current: ()) -> Option<u64> {
None
}
}