use std::{collections::VecDeque, rc::Rc, sync::Arc};
pub trait Length {
fn len(&self) -> usize;
#[inline]
fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<const N: usize, T> Length for [T; N] {
fn len(&self) -> usize {
N
}
}
impl<T> Length for &[T] {
#[inline]
fn len(&self) -> usize {
<[T]>::len(self)
}
}
impl<T> Length for &mut [T] {
#[inline]
fn len(&self) -> usize {
<[T]>::len(self)
}
}
impl<T> Length for Vec<T> {
#[inline]
fn len(&self) -> usize {
Vec::len(self)
}
}
impl<T> Length for Box<[T]> {
#[inline]
fn len(&self) -> usize {
<[T]>::len(self)
}
}
impl<T> Length for Rc<[T]> {
#[inline]
fn len(&self) -> usize {
<[T]>::len(self)
}
}
impl<T> Length for Arc<[T]> {
#[inline]
fn len(&self) -> usize {
<[T]>::len(self)
}
}
impl<T> Length for VecDeque<T> {
#[inline]
fn len(&self) -> usize {
VecDeque::len(self)
}
}
impl Length for &str {
fn len(&self) -> usize {
str::len(self)
}
}
impl Length for String {
fn len(&self) -> usize {
String::len(self)
}
}
impl<T: Length> Length for Option<T> {
fn len(&self) -> usize {
match self {
Some(item) => item.len(),
None => 0,
}
}
}