cdr_encoding_size/
lib.rs

1use core::ops::{Add, Mul};
2
3pub use cdr_encoding_size_derive::*;
4
5/// This type is used to count maximum size of a Key when serialized
6/// according to CDR but without field alignment.
7/// The purpose is to find out if the (key) type always fits into 16 bytes or
8/// not.
9#[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
40// -------------------------------------------
41// -------------------------------------------
42
43/// Trait used to statically gauge the size of serialized instance keys.
44///
45/// This is necessary to transmit instance keys. (RTPS spec v2.5, Section
46/// "9.6.4.8 KeyHash", Step 5.2)
47pub trait CdrEncodingSize {
48  fn cdr_encoding_max_size() -> CdrEncodingMaxSize;
49}
50
51// -------------------------------------------
52// -------------------------------------------
53
54impl 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);
84//prim_cdr_encoding_size!(usize); // size is platform-dependent, do not use in
85// serializable data prim_cdr_encoding_size!(isize);
86
87impl 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}