pub trait StaticSize {
const MAX_SIZE: usize;
}
impl StaticSize for bool {
const MAX_SIZE: usize = 1;
}
impl StaticSize for u8 {
const MAX_SIZE: usize = 1;
}
impl StaticSize for i8 {
const MAX_SIZE: usize = 1;
}
impl StaticSize for u16 {
const MAX_SIZE: usize = 3;
}
impl StaticSize for i16 {
const MAX_SIZE: usize = 3;
}
impl StaticSize for u32 {
const MAX_SIZE: usize = 5;
}
impl StaticSize for i32 {
const MAX_SIZE: usize = 5;
}
impl StaticSize for u64 {
const MAX_SIZE: usize = 9;
}
impl StaticSize for i64 {
const MAX_SIZE: usize = 9;
}
impl StaticSize for u128 {
const MAX_SIZE: usize = 17;
}
impl StaticSize for i128 {
const MAX_SIZE: usize = 17;
}
impl StaticSize for usize {
const MAX_SIZE: Self = 9;
}
impl StaticSize for isize {
const MAX_SIZE: usize = 9;
}
impl StaticSize for f32 {
const MAX_SIZE: usize = 4;
}
impl StaticSize for f64 {
const MAX_SIZE: usize = 8;
}
impl StaticSize for char {
const MAX_SIZE: usize = 4;
}
impl StaticSize for () {
const MAX_SIZE: usize = 0;
}
impl<T> StaticSize for core::marker::PhantomData<T> {
const MAX_SIZE: usize = 0;
}
impl<T: StaticSize, const N: usize> StaticSize for [T; N] {
const MAX_SIZE: usize = T::MAX_SIZE * N;
}
impl<T: StaticSize> StaticSize for Option<T> {
const MAX_SIZE: usize = 1 + T::MAX_SIZE;
}
impl<T: StaticSize, E: StaticSize> StaticSize for Result<T, E> {
const MAX_SIZE: usize = 5
+ (if T::MAX_SIZE > E::MAX_SIZE {
T::MAX_SIZE
} else {
E::MAX_SIZE
});
}
macro_rules! impl_static_size_tuple {
($($name:ident),*) => {
impl<$($name: StaticSize),*> StaticSize for ($($name,)*) {
const MAX_SIZE: usize = 0 $(+ $name::MAX_SIZE)*;
}
}
}
impl_static_size_tuple!(A);
impl_static_size_tuple!(A, B);
impl_static_size_tuple!(A, B, C);
impl_static_size_tuple!(A, B, C, D);
impl_static_size_tuple!(A, B, C, D, E);
impl_static_size_tuple!(A, B, C, D, E, F);
impl_static_size_tuple!(A, B, C, D, E, F, G);
impl_static_size_tuple!(A, B, C, D, E, F, G, H);
impl_static_size_tuple!(A, B, C, D, E, F, G, H, I);
impl_static_size_tuple!(A, B, C, D, E, F, G, H, I, J);
impl_static_size_tuple!(A, B, C, D, E, F, G, H, I, J, K);
impl_static_size_tuple!(A, B, C, D, E, F, G, H, I, J, K, L);
#[doc(hidden)]
pub mod helpers {
pub const VARINT_MAX_64: usize = 9;
pub const VARINT_MAX_32: usize = 5;
}