1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
//! Core traits for [wz]
//!
//! [wz]: https://crates.io/crates/wz
#![no_std]
/// Abstraction for [wz]'s stateful counters
///
/// This trait's identity is the unit (`()`) type
///
/// [wz]: https://crates.io/crates/wz
pub trait Counter<T> {
fn count(&mut self, input: &[u8]);
fn output(&self, collector: &mut T);
}
// Identity
impl<T> Counter<T> for () {
fn count(&mut self, _: &[u8]) {}
fn output(&self, _: &mut T) {}
}
/// Generates a collector trait with a given name
///
/// ```
/// // gen_collector_trait!(FooCollector);
/// // generates the following trait
/// pub trait FooCollector {
/// fn collect(&mut self, count: usize);
/// }
/// ```
#[macro_export]
macro_rules! gen_collector_trait {
( $($name:tt), * ) => {
$(
pub trait $name {
fn collect(&mut self, count: usize);
}
)*
};
}
/// Implements a collector trait for usize
///
/// ```
/// pub trait FooCollector {
/// fn collect(&mut self, count: usize);
/// }
/// // impl_collector_usize(FooCollector);
/// // generates the following impl block
/// impl FooCollector for usize {
/// fn collect(&mut self, count: usize) {
/// *self = count;
/// }
/// }
/// ```
#[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
);