mavlink_core/
utils.rs

1/// Removes the trailing zeroes in the payload
2///
3/// # Note:
4///
5/// There must always be at least one remaining byte even if it is a
6/// zero byte.
7pub fn remove_trailing_zeroes(data: &[u8]) -> usize {
8    let mut len = data.len();
9
10    for b in data[1..].iter().rev() {
11        if *b != 0 {
12            break;
13        }
14
15        len -= 1;
16    }
17
18    len
19}
20
21/// A trait very similar to `Default` but is only implemented for the equivalent Rust types to
22/// `MavType`s.
23///
24/// This is only needed because rust doesn't currently implement `Default` for arrays
25/// of all sizes. In particular this trait is only ever used when the "serde" feature is enabled.
26/// For more information, check out [this issue](https://users.rust-lang.org/t/issue-for-derives-for-arrays-greater-than-size-32/59055/3).
27pub trait RustDefault: Copy {
28    fn rust_default() -> Self;
29}
30
31impl<T: RustDefault, const N: usize> RustDefault for [T; N] {
32    #[inline(always)]
33    fn rust_default() -> Self {
34        let val: T = RustDefault::rust_default();
35        [val; N]
36    }
37}
38
39impl RustDefault for u8 {
40    #[inline(always)]
41    fn rust_default() -> Self {
42        0
43    }
44}
45
46impl RustDefault for i8 {
47    #[inline(always)]
48    fn rust_default() -> Self {
49        0
50    }
51}
52
53impl RustDefault for u16 {
54    #[inline(always)]
55    fn rust_default() -> Self {
56        0
57    }
58}
59
60impl RustDefault for i16 {
61    #[inline(always)]
62    fn rust_default() -> Self {
63        0
64    }
65}
66
67impl RustDefault for u32 {
68    #[inline(always)]
69    fn rust_default() -> Self {
70        0
71    }
72}
73
74impl RustDefault for i32 {
75    #[inline(always)]
76    fn rust_default() -> Self {
77        0
78    }
79}
80
81impl RustDefault for u64 {
82    #[inline(always)]
83    fn rust_default() -> Self {
84        0
85    }
86}
87
88impl RustDefault for i64 {
89    #[inline(always)]
90    fn rust_default() -> Self {
91        0
92    }
93}
94
95impl RustDefault for char {
96    #[inline(always)]
97    fn rust_default() -> Self {
98        '\0'
99    }
100}
101
102impl RustDefault for f32 {
103    #[inline(always)]
104    fn rust_default() -> Self {
105        0.0
106    }
107}
108
109impl RustDefault for f64 {
110    #[inline(always)]
111    fn rust_default() -> Self {
112        0.0
113    }
114}