#![no_std]
pub trait Counter<T> {
fn count(&mut self, input: &[u8]);
fn output(&self, collector: &mut T);
}
impl<T> Counter<T> for () {
fn count(&mut self, _: &[u8]) {}
fn output(&self, _: &mut T) {}
}
#[macro_export]
macro_rules! gen_collector_trait {
( $($name:tt), * ) => {
$(
pub trait $name {
fn collect(&mut self, count: usize);
}
)*
};
}
#[macro_export]
macro_rules! impl_collector_usize {
( $($name:ty), *) => {
$(
impl $name for usize {
fn collect(&mut self, count: usize) {
*self = count;
}
}
)*
};
}
gen_collector_trait!(
BytesCollector,
CharsCollector,
LinesCollector,
WordsCollector,
MaxLineLengthCollector
);
impl_collector_usize!(
BytesCollector,
CharsCollector,
LinesCollector,
WordsCollector,
MaxLineLengthCollector
);