File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 11use crate :: alloc:: { TryClone , try_realloc} ;
22use crate :: error:: OutOfMemory ;
3+ use core:: cmp:: Ordering ;
34use core:: marker:: PhantomData ;
45use core:: {
56 fmt, mem,
@@ -108,6 +109,34 @@ impl<T> Vec<T> {
108109 self . inner . pop ( )
109110 }
110111
112+ /// Same as [`std::vec::Vec::truncate`].
113+ pub fn truncate ( & mut self , len : usize ) {
114+ self . inner . truncate ( len) ;
115+ }
116+
117+ /// Same as [`std::vec::Vec::resize`] but returns an error on allocation
118+ /// failure.
119+ pub fn resize ( & mut self , new_len : usize , value : T ) -> Result < ( ) , OutOfMemory >
120+ where
121+ T : TryClone ,
122+ {
123+ match new_len. cmp ( & self . len ( ) ) {
124+ Ordering :: Less => self . truncate ( new_len) ,
125+ Ordering :: Equal => { }
126+ Ordering :: Greater => {
127+ let delta = new_len - self . len ( ) ;
128+ self . reserve ( delta) ?;
129+ // Minimize `try_clone` calls by always pushing `value` directly
130+ // as the last element.
131+ for _ in 0 ..delta - 1 {
132+ self . push ( value. try_clone ( ) ?) ?;
133+ }
134+ self . push ( value) ?;
135+ }
136+ }
137+ Ok ( ( ) )
138+ }
139+
111140 /// Same as [`std::vec::Vec::into_raw_parts`].
112141 pub fn into_raw_parts ( mut self ) -> ( * mut T , usize , usize ) {
113142 // NB: Can't use `Vec::into_raw_parts` until our MSRV is >= 1.93.
Original file line number Diff line number Diff line change @@ -708,6 +708,19 @@ fn vec_shrink_to_fit() -> Result<()> {
708708 Ok ( ( ) )
709709}
710710
711+ #[ test]
712+ fn vec_resize ( ) -> Result < ( ) > {
713+ OomTest :: new ( ) . test ( || {
714+ let mut v = Vec :: new ( ) ;
715+ v. resize ( 10 , 'a' ) ?; // Grow.
716+ v. resize ( 1 , 'b' ) ?; // Truncate.
717+ v. resize ( 1 , 'c' ) ?; // Same length.
718+ v. resize ( 3 , 'd' ) ?; // Grow again.
719+ assert_eq ! ( & * v, & [ 'a' , 'd' , 'd' ] ) ;
720+ Ok ( ( ) )
721+ } )
722+ }
723+
711724#[ test]
712725fn vec_try_collect ( ) -> Result < ( ) > {
713726 OomTest :: new ( ) . test ( || {
You can’t perform that action at this time.
0 commit comments