1use core::ops::{Add, Mul};
2
3pub use cdr_encoding_size_derive::*;
4
5#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
10pub enum CdrEncodingMaxSize {
11 Bytes(usize),
12 Unbounded,
13}
14
15impl Add for CdrEncodingMaxSize {
16 type Output = Self;
17
18 fn add(self, other: Self) -> Self::Output {
19 use CdrEncodingMaxSize::*;
20 match (self, other) {
21 (Bytes(s), Bytes(o)) => Bytes(s + o),
22 (Unbounded, _) => Unbounded,
23 (_, Unbounded) => Unbounded,
24 }
25 }
26}
27
28impl Mul<usize> for CdrEncodingMaxSize {
29 type Output = Self;
30
31 fn mul(self, rhs: usize) -> Self::Output {
32 use CdrEncodingMaxSize::*;
33 match self {
34 Unbounded => Unbounded,
35 Bytes(b) => Bytes(b * rhs),
36 }
37 }
38}
39
40pub trait CdrEncodingSize {
48 fn cdr_encoding_max_size() -> CdrEncodingMaxSize;
49}
50
51impl CdrEncodingSize for () {
55 fn cdr_encoding_max_size() -> CdrEncodingMaxSize {
56 CdrEncodingMaxSize::Bytes(0)
57 }
58}
59
60macro_rules! prim_cdr_encoding_size {
61 ($t:ty) => {
62 impl CdrEncodingSize for $t {
63 #[inline]
64 fn cdr_encoding_max_size() -> CdrEncodingMaxSize {
65 CdrEncodingMaxSize::Bytes(std::mem::size_of::<$t>())
66 }
67 }
68 };
69}
70
71prim_cdr_encoding_size!(u8);
72prim_cdr_encoding_size!(u16);
73prim_cdr_encoding_size!(u32);
74prim_cdr_encoding_size!(u64);
75prim_cdr_encoding_size!(u128);
76
77prim_cdr_encoding_size!(i8);
78prim_cdr_encoding_size!(i16);
79prim_cdr_encoding_size!(i32);
80prim_cdr_encoding_size!(i64);
81prim_cdr_encoding_size!(i128);
82
83prim_cdr_encoding_size!(char);
84impl CdrEncodingSize for bool {
88 fn cdr_encoding_max_size() -> CdrEncodingMaxSize {
89 CdrEncodingMaxSize::Bytes(1)
90 }
91}
92
93impl<T: CdrEncodingSize> CdrEncodingSize for Vec<T> {
94 fn cdr_encoding_max_size() -> CdrEncodingMaxSize {
95 CdrEncodingMaxSize::Unbounded
96 }
97}
98
99impl CdrEncodingSize for String {
100 fn cdr_encoding_max_size() -> CdrEncodingMaxSize {
101 CdrEncodingMaxSize::Unbounded
102 }
103}
104
105impl<T: CdrEncodingSize> CdrEncodingSize for Box<T> {
106 fn cdr_encoding_max_size() -> CdrEncodingMaxSize {
107 T::cdr_encoding_max_size()
108 }
109}
110
111impl<T: CdrEncodingSize, const N: usize> CdrEncodingSize for [T; N] {
112 fn cdr_encoding_max_size() -> CdrEncodingMaxSize {
113 T::cdr_encoding_max_size() * N
114 }
115}