File tree Expand file tree Collapse file tree 3 files changed +62
-0
lines changed Expand file tree Collapse file tree 3 files changed +62
-0
lines changed Original file line number Diff line number Diff line change @@ -42,6 +42,7 @@ mpmc_large = []
4242nightly = []
4343
4444[dependencies ]
45+ bytes = { version = " 1" , default-features = false , optional = true }
4546portable-atomic = { version = " 1.0" , optional = true }
4647hash32 = " 0.3.0"
4748serde = { version = " 1" , optional = true , default-features = false }
@@ -58,6 +59,7 @@ static_assertions = "1.1.0"
5859
5960[package .metadata .docs .rs ]
6061features = [
62+ " bytes" ,
6163 " ufmt" ,
6264 " serde" ,
6365 " defmt" ,
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change @@ -192,6 +192,8 @@ mod de;
192192mod ser;
193193
194194pub mod binary_heap;
195+ #[ cfg( feature = "bytes" ) ]
196+ mod bytes;
195197#[ cfg( feature = "defmt" ) ]
196198mod defmt;
197199#[ cfg( any(
You can’t perform that action at this time.
0 commit comments