mirror of
https://github.com/rust-embedded/heapless.git
synced 2025-09-27 04:20:24 +00:00
Implement bytes
traits for VecInner
.
This commit is contained in:
parent
52afb90219
commit
c8303e8d49
40
src/bytes.rs
40
src/bytes.rs
@ -1,19 +1,22 @@
|
||||
//! Bytes implementations for heapless types
|
||||
//! Implementations of `bytes` traits for `heapless` types.
|
||||
|
||||
use crate::{len_type::LenType, Vec};
|
||||
use crate::{
|
||||
len_type::LenType,
|
||||
vec::{VecInner, VecStorage},
|
||||
};
|
||||
use bytes::{buf::UninitSlice, BufMut};
|
||||
|
||||
unsafe impl<const N: usize, LenT: LenType> BufMut for Vec<u8, N, LenT> {
|
||||
unsafe impl<S: VecStorage<u8> + ?Sized, LenT: LenType> BufMut for VecInner<u8, LenT, S> {
|
||||
#[inline]
|
||||
fn remaining_mut(&self) -> usize {
|
||||
N - self.len()
|
||||
self.capacity() - self.len()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
unsafe fn advance_mut(&mut self, cnt: usize) {
|
||||
let len = self.len();
|
||||
let pos = len + cnt;
|
||||
if pos >= N {
|
||||
if pos >= self.capacity() {
|
||||
panic!("Advance out of range");
|
||||
}
|
||||
self.set_len(pos);
|
||||
@ -23,13 +26,13 @@ unsafe impl<const N: usize, LenT: LenType> BufMut for Vec<u8, N, LenT> {
|
||||
fn chunk_mut(&mut self) -> &mut UninitSlice {
|
||||
let len = self.len();
|
||||
let ptr = self.as_mut_ptr();
|
||||
unsafe { &mut UninitSlice::from_raw_parts_mut(ptr, N)[len..] }
|
||||
unsafe { &mut UninitSlice::from_raw_parts_mut(ptr, self.capacity())[len..] }
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::Vec;
|
||||
use crate::{Vec, VecView};
|
||||
use bytes::BufMut;
|
||||
|
||||
#[test]
|
||||
@ -54,4 +57,27 @@ mod tests {
|
||||
unsafe { vec.advance_mut(1) };
|
||||
assert_eq!(vec.chunk_mut().len(), 7);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn buf_mut_advance_mut_out_of_bounds_view() {
|
||||
let vec: &mut VecView<u8, u8> = &mut Vec::<u8, 8>::new();
|
||||
unsafe { vec.advance_mut(9) };
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn buf_mut_remaining_mut_view() {
|
||||
let vec: &mut VecView<u8, u8> = &mut Vec::<u8, 8>::new();
|
||||
assert_eq!(vec.remaining_mut(), 8);
|
||||
vec.push(42).unwrap();
|
||||
assert_eq!(vec.remaining_mut(), 7);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn buf_mut_chunk_mut_view() {
|
||||
let vec: &mut VecView<u8, u8> = &mut Vec::<u8, 8>::new();
|
||||
assert_eq!(vec.chunk_mut().len(), 8);
|
||||
unsafe { vec.advance_mut(1) };
|
||||
assert_eq!(vec.chunk_mut().len(), 7);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user