1use std::{collections::VecDeque, rc::Rc, sync::Arc};
4
5pub trait Length {
7 fn len(&self) -> usize;
10
11 #[inline]
13 fn is_empty(&self) -> bool {
14 self.len() == 0
15 }
16}
17
18impl<const N: usize, T> Length for [T; N] {
19 fn len(&self) -> usize {
20 N
21 }
22}
23
24impl<T> Length for [T] {
25 #[inline]
26 fn len(&self) -> usize {
27 <[T]>::len(self)
28 }
29}
30
31impl<T> Length for &[T] {
32 #[inline]
33 fn len(&self) -> usize {
34 <[T]>::len(self)
35 }
36}
37
38impl<T> Length for &mut [T] {
39 #[inline]
40 fn len(&self) -> usize {
41 <[T]>::len(self)
42 }
43}
44
45impl<T> Length for Vec<T> {
46 #[inline]
47 fn len(&self) -> usize {
48 Vec::len(self)
49 }
50}
51
52impl<T> Length for Box<[T]> {
53 #[inline]
54 fn len(&self) -> usize {
55 <[T]>::len(self)
56 }
57}
58
59impl<T> Length for Rc<[T]> {
60 #[inline]
61 fn len(&self) -> usize {
62 <[T]>::len(self)
63 }
64}
65
66impl<T> Length for Arc<[T]> {
67 #[inline]
68 fn len(&self) -> usize {
69 <[T]>::len(self)
70 }
71}
72
73impl<T> Length for VecDeque<T> {
74 #[inline]
75 fn len(&self) -> usize {
76 VecDeque::len(self)
77 }
78}
79
80impl Length for &str {
81 fn len(&self) -> usize {
82 str::len(self)
83 }
84}
85
86impl Length for String {
87 fn len(&self) -> usize {
88 String::len(self)
89 }
90}
91
92impl<T: Length> Length for Option<T> {
93 fn len(&self) -> usize {
94 self.as_ref().map_or(0, Length::len)
95 }
96}
97
98impl<T> Length for std::vec::IntoIter<T> {
99 fn len(&self) -> usize {
100 ExactSizeIterator::len(self)
101 }
102}
103
104impl<T> Length for std::slice::Iter<'_, T> {
105 fn len(&self) -> usize {
106 ExactSizeIterator::len(self)
107 }
108}