@@ -59,6 +59,7 @@ pub struct Buffer<T: AsMut<[u8]> + AsRef<[u8]>> {
5959}
6060
6161/// Creates a new [`Buffer`] that is backed by an owned [`u8`] array with size `N`
62+ #[ deprecated]
6263pub fn new_stack_buffer < const N : usize > ( ) -> Buffer < [ u8 ; N ] > {
6364 Buffer :: < [ u8 ; N ] > {
6465 source : [ 0 ; N ] ,
@@ -67,6 +68,49 @@ pub fn new_stack_buffer<const N: usize>() -> Buffer<[u8; N]> {
6768 }
6869}
6970
71+ impl < const N : usize > Buffer < [ u8 ; N ] > {
72+
73+ /// Creates a new [`Buffer`] that is backed by an owned [`u8`] array with size `N`
74+ pub fn new_stack ( ) -> Self {
75+ Self {
76+ source : [ 0 ; N ] ,
77+ read_position : 0 ,
78+ write_position : 0 ,
79+ }
80+ }
81+ }
82+
83+ #[ cfg( feature = "std" ) ]
84+ impl Buffer < Vec < u8 > > {
85+
86+ /// Creates a new [`Buffer`] that is backed by an owned [`Vec<u8>`]
87+ pub fn new_heap ( size : usize ) -> Self {
88+ Self {
89+ source : vec ! [ 0 ; size] ,
90+ read_position : 0 ,
91+ write_position : 0 ,
92+ }
93+ }
94+
95+ /// Grows the buffer capacity by `grow_by` bytes
96+ pub fn grow ( & mut self , grow_by : usize ) {
97+ self . source . extend (
98+ std:: iter:: repeat_n ( 0 , grow_by)
99+ ) ;
100+ }
101+
102+ /// Shrink the buffer capacity by `shrink_by` bytes.
103+ /// If this would remove written data, an [`BufferError::NoCapacity`] is returned.
104+ pub fn shrink ( & mut self , shrink_by : usize ) -> Result < ( ) , BufferError > {
105+ if self . remaining_capacity ( ) < shrink_by {
106+ Err ( BufferError :: NoCapacity )
107+ } else {
108+ self . source . truncate ( self . source . len ( ) . saturating_sub ( shrink_by) ) ;
109+ Ok ( ( ) )
110+ }
111+ }
112+ }
113+
70114#[ cfg( feature = "defmt" ) ]
71115impl < T : AsMut < [ u8 ] > + AsRef < [ u8 ] > > defmt:: Format for Buffer < T > {
72116 fn format ( & self , fmt : defmt:: Formatter ) {
@@ -377,7 +421,7 @@ impl <T: AsMut<[u8]> + AsRef<[u8]> + Clone> Clone for Buffer<T> {
377421#[ cfg( test) ]
378422mod tests {
379423
380- use crate :: { new_stack_buffer , Buffer , BufferError } ;
424+ use crate :: { Buffer , BufferError } ;
381425
382426 #[ test]
383427 fn test_std_write_high_cap ( ) {
@@ -472,10 +516,12 @@ mod tests {
472516 #[ test]
473517 fn test_stack_buffer ( ) {
474518
475- let mut buf = new_stack_buffer :: < 4 > ( ) ;
519+ let mut buf = Buffer :: < [ u8 ; 4 ] > :: new_stack ( ) ;
476520
477521 buf. write_base ( & [ 1 , 2 , 3 , 4 ] ) . unwrap ( ) ;
478522
523+ assert ! ( ! buf. has_remaining_capacity( ) ) ;
524+ assert_eq ! ( buf. remaining_len( ) , 4 ) ;
479525 }
480526
481527 #[ test]
@@ -506,4 +552,37 @@ mod tests {
506552 let res = buf. skip ( 5 ) ;
507553 assert_eq ! ( res, Err ( BufferError :: NoData ) ) ;
508554 }
555+
556+ #[ cfg( feature = "std" ) ]
557+ #[ test]
558+ fn test_vec_source_grow ( ) {
559+ use std:: io:: Write ;
560+
561+ let mut buffer = Buffer :: new_heap ( 8 ) ;
562+ buffer. write_all ( & [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] ) . unwrap ( ) ;
563+
564+ assert ! ( buffer. write_all( & [ 9 ] ) . is_err( ) ) ;
565+
566+ buffer. grow ( 1 ) ;
567+ buffer. write_all ( & [ 9 ] ) . unwrap ( ) ;
568+ assert ! ( buffer. write_all( & [ 10 ] ) . is_err( ) ) ;
569+
570+ }
571+
572+ #[ cfg( feature = "std" ) ]
573+ #[ test]
574+ fn test_vec_source_shrink ( ) {
575+ use std:: io:: Write ;
576+
577+ let mut buffer = Buffer :: new_heap ( 8 ) ;
578+ buffer. write_all ( & [ 1 , 2 , 3 , 4 ] ) . unwrap ( ) ;
579+ assert_eq ! ( buffer. remaining_capacity( ) , 4 ) ;
580+
581+ buffer. shrink ( 4 ) . unwrap ( ) ;
582+ assert_eq ! ( buffer. remaining_capacity( ) , 0 ) ;
583+ assert ! ( buffer. write_all( & [ 5 ] ) . is_err( ) ) ;
584+
585+ assert ! ( buffer. shrink( 1 ) . is_err( ) ) ;
586+
587+ }
509588}
0 commit comments