mavlink_core/
bytes_mut.rs

1pub struct BytesMut<'a> {
2    data: &'a mut [u8],
3    len: usize,
4}
5
6impl<'a> BytesMut<'a> {
7    pub fn new(data: &'a mut [u8]) -> Self {
8        Self { data, len: 0 }
9    }
10
11    #[inline]
12    pub fn len(&self) -> usize {
13        self.len
14    }
15
16    #[inline]
17    pub fn is_empty(&self) -> bool {
18        self.len() == 0
19    }
20
21    #[inline]
22    pub fn remaining(&self) -> usize {
23        self.data.len() - self.len
24    }
25
26    #[inline]
27    fn check_remaining(&self, count: usize) {
28        assert!(
29            self.remaining() >= count,
30            "write buffer overflow; remaining {} bytes, try add {count} bytes",
31            self.remaining(),
32        );
33    }
34
35    #[inline]
36    pub fn put_slice(&mut self, src: &[u8]) {
37        self.check_remaining(src.len());
38
39        unsafe {
40            core::ptr::copy_nonoverlapping(src.as_ptr(), &mut self.data[self.len], src.len());
41        }
42        self.len += src.len();
43    }
44
45    #[inline]
46    pub fn put_u8(&mut self, val: u8) {
47        self.check_remaining(1);
48
49        self.data[self.len] = val;
50        self.len += 1;
51    }
52
53    #[inline]
54    pub fn put_i8(&mut self, val: i8) {
55        self.check_remaining(1);
56
57        self.data[self.len] = val as u8;
58        self.len += 1;
59    }
60
61    #[inline]
62    pub fn put_u16_le(&mut self, val: u16) {
63        const SIZE: usize = core::mem::size_of::<u16>();
64        self.check_remaining(SIZE);
65
66        let src = val.to_le_bytes();
67        self.data[self.len..self.len + SIZE].copy_from_slice(&src[..]);
68        self.len += SIZE;
69    }
70
71    #[inline]
72    pub fn put_i16_le(&mut self, val: i16) {
73        const SIZE: usize = core::mem::size_of::<i16>();
74        self.check_remaining(SIZE);
75
76        let src = val.to_le_bytes();
77        self.data[self.len..self.len + SIZE].copy_from_slice(&src[..]);
78        self.len += SIZE;
79    }
80
81    #[inline]
82    pub fn put_u24_le(&mut self, val: u32) {
83        const SIZE: usize = 3;
84        const MAX: u32 = 2u32.pow(24) - 1;
85
86        assert!(
87            val <= MAX,
88            "Attempted to put value that is too large for 24 bits, \
89	     attempted to push: {val}, max allowed: {MAX}",
90        );
91
92        let src = val.to_le_bytes();
93        self.data[self.len..self.len + SIZE].copy_from_slice(&src[..3]);
94        self.len += SIZE;
95    }
96
97    #[inline]
98    pub fn put_i24_le(&mut self, val: i32) {
99        const SIZE: usize = 3;
100        const MIN: i32 = 2i32.pow(23);
101        const MAX: i32 = 2i32.pow(23) - 1;
102
103        assert!(
104            val <= MAX,
105            "Attempted to put value that is too large for 24 bits, \
106	     attempted to push: {val}, max allowed: {MAX}",
107        );
108        assert!(
109            val >= MIN,
110            "Attempted to put value that is too negative for 24 bits, \
111	     attempted to push: {val}, min allowed: {MIN}",
112        );
113
114        let src = val.to_le_bytes();
115        self.data[self.len..self.len + SIZE].copy_from_slice(&src[..3]);
116        self.len += SIZE;
117    }
118
119    #[inline]
120    pub fn put_u32_le(&mut self, val: u32) {
121        const SIZE: usize = core::mem::size_of::<u32>();
122        self.check_remaining(SIZE);
123
124        let src = val.to_le_bytes();
125        self.data[self.len..self.len + SIZE].copy_from_slice(&src[..]);
126        self.len += SIZE;
127    }
128
129    #[inline]
130    pub fn put_i32_le(&mut self, val: i32) {
131        const SIZE: usize = core::mem::size_of::<i32>();
132        self.check_remaining(SIZE);
133
134        let src = val.to_le_bytes();
135        self.data[self.len..self.len + SIZE].copy_from_slice(&src[..]);
136        self.len += SIZE;
137    }
138
139    #[inline]
140    pub fn put_u64_le(&mut self, val: u64) {
141        const SIZE: usize = core::mem::size_of::<u64>();
142        self.check_remaining(SIZE);
143
144        let src = val.to_le_bytes();
145        self.data[self.len..self.len + SIZE].copy_from_slice(&src[..]);
146        self.len += SIZE;
147    }
148
149    #[inline]
150    pub fn put_i64_le(&mut self, val: i64) {
151        const SIZE: usize = core::mem::size_of::<i64>();
152        self.check_remaining(SIZE);
153
154        let src = val.to_le_bytes();
155        self.data[self.len..self.len + SIZE].copy_from_slice(&src[..]);
156        self.len += SIZE;
157    }
158
159    #[inline]
160    pub fn put_f32_le(&mut self, val: f32) {
161        const SIZE: usize = core::mem::size_of::<f32>();
162        self.check_remaining(SIZE);
163
164        let src = val.to_le_bytes();
165        self.data[self.len..self.len + SIZE].copy_from_slice(&src[..]);
166        self.len += SIZE;
167    }
168
169    #[inline]
170    pub fn put_f64_le(&mut self, val: f64) {
171        const SIZE: usize = core::mem::size_of::<f64>();
172        self.check_remaining(SIZE);
173
174        let src = val.to_le_bytes();
175        self.data[self.len..self.len + SIZE].copy_from_slice(&src[..]);
176        self.len += SIZE;
177    }
178}