pub trait HasLength {
fn len(&self) -> usize;
}
impl<T> HasLength for [T] {
fn len(&self) -> usize {
self.len()
}
}
impl<T> HasLength for Vec<T> {
fn len(&self) -> usize {
self.len()
}
}
impl HasLength for str {
fn len(&self) -> usize {
self.len()
}
}
impl HasLength for String {
fn len(&self) -> usize {
self.len()
}
}
macro_rules! impl_for_arr {
($n:expr) => {
impl<T> HasLength for [T; $n] {
fn len(&self) -> usize {
$n
}
}
}
}
impl_for_arr!(0);
impl_for_arr!(1);
impl_for_arr!(2);
impl_for_arr!(3);
impl_for_arr!(4);
impl_for_arr!(5);
impl_for_arr!(6);
impl_for_arr!(7);
impl_for_arr!(8);
impl_for_arr!(9);
impl_for_arr!(10);
impl_for_arr!(11);
impl_for_arr!(12);
impl_for_arr!(13);
impl_for_arr!(14);
impl_for_arr!(15);
impl_for_arr!(16);
impl_for_arr!(17);
impl_for_arr!(18);
impl_for_arr!(19);
impl_for_arr!(20);
impl_for_arr!(21);
impl_for_arr!(22);
impl_for_arr!(23);
impl_for_arr!(24);
impl_for_arr!(25);
impl_for_arr!(26);
impl_for_arr!(27);
impl_for_arr!(28);
impl_for_arr!(29);
impl_for_arr!(30);
impl_for_arr!(31);
impl_for_arr!(32);
impl<'a, T: ?Sized> HasLength for &'a T
where T: HasLength
{
fn len(&self) -> usize {
(*self).len()
}
}
#[cfg(test)]
mod tests {
use super::*;
fn implemented_for<T: HasLength>(_t: T) {}
#[test]
fn test() {
implemented_for("");
implemented_for(String::from(""));
}
}