cl_aux/traits/
capacity_upper_bound.rs1use crate::SingleItemStorage;
2#[cfg(feature = "alloc")]
3use alloc::{string::String, vec::Vec};
4
5pub trait CapacityUpperBound {
7 const CAPACITY_UPPER_BOUND: usize;
9
10 #[inline]
12 fn capacity_upper_bound(&self) -> usize {
13 Self::CAPACITY_UPPER_BOUND
14 }
15}
16
17impl<T> CapacityUpperBound for &T
18where
19 T: CapacityUpperBound,
20{
21 const CAPACITY_UPPER_BOUND: usize = T::CAPACITY_UPPER_BOUND;
22
23 #[inline]
24 fn capacity_upper_bound(&self) -> usize {
25 (*self).capacity_upper_bound()
26 }
27}
28
29impl CapacityUpperBound for () {
33 const CAPACITY_UPPER_BOUND: usize = 0;
34}
35
36impl<T> CapacityUpperBound for Option<T> {
40 const CAPACITY_UPPER_BOUND: usize = 1;
41}
42
43impl<T> CapacityUpperBound for SingleItemStorage<T> {
48 const CAPACITY_UPPER_BOUND: usize = 1;
49}
50
51impl<T, const N: usize> CapacityUpperBound for [T; N] {
56 const CAPACITY_UPPER_BOUND: usize = N;
57}
58
59impl<T> CapacityUpperBound for &'_ [T] {
64 const CAPACITY_UPPER_BOUND: usize = capacity_upper_bound_of_type::<T>();
65}
66
67impl<T> CapacityUpperBound for &'_ mut [T] {
72 const CAPACITY_UPPER_BOUND: usize = capacity_upper_bound_of_type::<T>();
73}
74
75#[cfg(feature = "alloc")]
80impl CapacityUpperBound for String {
81 const CAPACITY_UPPER_BOUND: usize = capacity_upper_bound_of_type::<u8>();
82}
83
84#[cfg(feature = "alloc")]
89impl<T> CapacityUpperBound for Vec<T> {
90 const CAPACITY_UPPER_BOUND: usize = capacity_upper_bound_of_type::<T>();
91}
92
93#[cfg(feature = "arrayvec")]
98impl<const N: usize> CapacityUpperBound for arrayvec::ArrayString<N> {
99 const CAPACITY_UPPER_BOUND: usize = N;
100}
101
102#[cfg(feature = "arrayvec")]
107impl<T, const N: usize> CapacityUpperBound for arrayvec::ArrayVec<T, N> {
108 const CAPACITY_UPPER_BOUND: usize = N;
109}
110
111#[cfg(feature = "smallvec")]
116impl<A> CapacityUpperBound for smallvec::SmallVec<A>
117where
118 A: smallvec::Array,
119{
120 const CAPACITY_UPPER_BOUND: usize = capacity_upper_bound_of_type::<A::Item>();
121}
122
123#[cfg(feature = "tinyvec")]
128impl<A> CapacityUpperBound for tinyvec::ArrayVec<A>
129where
130 A: tinyvec::Array,
131 A::Item: Default,
132{
133 const CAPACITY_UPPER_BOUND: usize = A::CAPACITY;
134}
135
136#[cfg(all(feature = "alloc", feature = "tinyvec"))]
141impl<A> CapacityUpperBound for tinyvec::TinyVec<A>
142where
143 A: tinyvec::Array,
144 A::Item: Default,
145{
146 const CAPACITY_UPPER_BOUND: usize = capacity_upper_bound_of_type::<A::Item>();
147}
148
149#[inline]
150const fn capacity_upper_bound_of_type<T>() -> usize {
151 let isize_max_usize = isize::MAX.unsigned_abs();
152 if let Some(elem) = isize_max_usize.checked_div(size_of::<T>()) {
153 elem
154 } else {
155 0
156 }
157}