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 &[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 {
self.as_ref().map_or(0, Length::len)
}
}
impl<T> Length for std::vec::IntoIter<T> {
fn len(&self) -> usize {
ExactSizeIterator::len(self)
}
}
impl<T> Length for std::slice::Iter<'_, T> {
fn len(&self) -> usize {
ExactSizeIterator::len(self)
}
}