Skip to content

Commit 1ea9009

Browse files
xgroleaureitermarkus
authored andcommitted
Added support for Bytes
1 parent 53a0f54 commit 1ea9009

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ mpmc_large = []
4242
nightly = []
4343

4444
[dependencies]
45+
bytes = { version = "1", default-features = false, optional = true }
4546
portable-atomic = { version = "1.0", optional = true }
4647
hash32 = "0.3.0"
4748
serde = { version = "1", optional = true, default-features = false }
@@ -58,6 +59,7 @@ static_assertions = "1.1.0"
5859

5960
[package.metadata.docs.rs]
6061
features = [
62+
"bytes",
6163
"ufmt",
6264
"serde",
6365
"defmt",

src/bytes.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
//! Bytes implementations for heapless types
2+
3+
use crate::Vec;
4+
use bytes::buf::UninitSlice;
5+
use bytes::BufMut;
6+
7+
unsafe impl<const N: usize> BufMut for Vec<u8, N> {
8+
#[inline]
9+
fn remaining_mut(&self) -> usize {
10+
N - self.len()
11+
}
12+
13+
#[inline]
14+
unsafe fn advance_mut(&mut self, cnt: usize) {
15+
let len = self.len();
16+
let pos = len + cnt;
17+
if pos >= N {
18+
panic!("Advance out of range");
19+
}
20+
self.set_len(pos);
21+
}
22+
23+
#[inline]
24+
fn chunk_mut(&mut self) -> &mut UninitSlice {
25+
let len = self.len();
26+
let ptr = self.as_mut_ptr();
27+
unsafe { &mut UninitSlice::from_raw_parts_mut(ptr, N)[len..] }
28+
}
29+
}
30+
31+
#[cfg(test)]
32+
mod tests {
33+
use crate::Vec;
34+
use bytes::BufMut;
35+
36+
#[test]
37+
#[should_panic]
38+
fn advance_out_of_bound() {
39+
let mut vec: Vec<u8, 8> = Vec::new();
40+
unsafe { vec.advance_mut(9) };
41+
}
42+
43+
#[test]
44+
fn remaining_mut() {
45+
let mut vec: Vec<u8, 8> = Vec::new();
46+
assert_eq!(vec.remaining_mut(), 8);
47+
vec.push(42).unwrap();
48+
assert_eq!(vec.remaining_mut(), 7);
49+
}
50+
51+
#[test]
52+
fn chunk_mut() {
53+
let mut vec: Vec<u8, 8> = Vec::new();
54+
assert_eq!(vec.chunk_mut().len(), 8);
55+
unsafe { vec.advance_mut(1) };
56+
assert_eq!(vec.chunk_mut().len(), 7);
57+
}
58+
}

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ mod de;
192192
mod ser;
193193

194194
pub mod binary_heap;
195+
#[cfg(feature = "bytes")]
196+
mod bytes;
195197
#[cfg(feature = "defmt")]
196198
mod defmt;
197199
#[cfg(any(

0 commit comments

Comments
 (0)