@@ -385,26 +385,7 @@ impl<T, A: Alloc> RawVec<T, A> {
385385 }
386386 }
387387
388- /// Ensures that the buffer contains at least enough space to hold
389- /// `used_cap + needed_extra_cap` elements. If it doesn't already,
390- /// will reallocate the minimum possible amount of memory necessary.
391- /// Generally this will be exactly the amount of memory necessary,
392- /// but in principle the allocator is free to give back more than
393- /// we asked for.
394- ///
395- /// If `used_cap` exceeds `self.cap()`, this may fail to actually allocate
396- /// the requested space. This is not really unsafe, but the unsafe
397- /// code *you* write that relies on the behavior of this function may break.
398- ///
399- /// # Panics
400- ///
401- /// * Panics if the requested capacity exceeds `usize::MAX` bytes.
402- /// * Panics on 32-bit platforms if the requested capacity exceeds
403- /// `isize::MAX` bytes.
404- ///
405- /// # Aborts
406- ///
407- /// Aborts on OOM
388+ /// The same as `reserve_exact`, but returns on errors instead of panicking or aborting.
408389 pub fn try_reserve_exact ( & mut self , used_cap : usize , needed_extra_cap : usize )
409390 -> Result < ( ) , CollectionAllocErr > {
410391
@@ -441,6 +422,26 @@ impl<T, A: Alloc> RawVec<T, A> {
441422 }
442423 }
443424
425+ /// Ensures that the buffer contains at least enough space to hold
426+ /// `used_cap + needed_extra_cap` elements. If it doesn't already,
427+ /// will reallocate the minimum possible amount of memory necessary.
428+ /// Generally this will be exactly the amount of memory necessary,
429+ /// but in principle the allocator is free to give back more than
430+ /// we asked for.
431+ ///
432+ /// If `used_cap` exceeds `self.cap()`, this may fail to actually allocate
433+ /// the requested space. This is not really unsafe, but the unsafe
434+ /// code *you* write that relies on the behavior of this function may break.
435+ ///
436+ /// # Panics
437+ ///
438+ /// * Panics if the requested capacity exceeds `usize::MAX` bytes.
439+ /// * Panics on 32-bit platforms if the requested capacity exceeds
440+ /// `isize::MAX` bytes.
441+ ///
442+ /// # Aborts
443+ ///
444+ /// Aborts on OOM
444445 pub fn reserve_exact ( & mut self , used_cap : usize , needed_extra_cap : usize ) {
445446 match self . try_reserve_exact ( used_cap, needed_extra_cap) {
446447 Err ( CapacityOverflow ) => capacity_overflow ( ) ,
@@ -463,6 +464,42 @@ impl<T, A: Alloc> RawVec<T, A> {
463464 Ok ( cmp:: max ( double_cap, required_cap) )
464465 }
465466
467+ /// The same as `reserve`, but returns on errors instead of panicking or aborting.
468+ pub fn try_reserve ( & mut self , used_cap : usize , needed_extra_cap : usize )
469+ -> Result < ( ) , CollectionAllocErr > {
470+ unsafe {
471+ // NOTE: we don't early branch on ZSTs here because we want this
472+ // to actually catch "asking for more than usize::MAX" in that case.
473+ // If we make it past the first branch then we are guaranteed to
474+ // panic.
475+
476+ // Don't actually need any more capacity.
477+ // Wrapping in case they give a bad `used_cap`
478+ if self . cap ( ) . wrapping_sub ( used_cap) >= needed_extra_cap {
479+ return Ok ( ( ) ) ;
480+ }
481+
482+ let new_cap = self . amortized_new_size ( used_cap, needed_extra_cap) ?;
483+ let new_layout = Layout :: array :: < T > ( new_cap) . map_err ( |_| CapacityOverflow ) ?;
484+
485+ // FIXME: may crash and burn on over-reserve
486+ alloc_guard ( new_layout. size ( ) ) ?;
487+
488+ let res = match self . current_layout ( ) {
489+ Some ( layout) => {
490+ debug_assert ! ( new_layout. align( ) == layout. align( ) ) ;
491+ self . a . realloc ( NonNull :: from ( self . ptr ) . as_opaque ( ) , layout, new_layout. size ( ) )
492+ }
493+ None => self . a . alloc ( new_layout) ,
494+ } ;
495+
496+ self . ptr = res?. cast ( ) . into ( ) ;
497+ self . cap = new_cap;
498+
499+ Ok ( ( ) )
500+ }
501+ }
502+
466503 /// Ensures that the buffer contains at least enough space to hold
467504 /// `used_cap + needed_extra_cap` elements. If it doesn't already have
468505 /// enough capacity, will reallocate enough space plus comfortable slack
@@ -515,42 +552,6 @@ impl<T, A: Alloc> RawVec<T, A> {
515552 /// # vector.push_all(&[1, 3, 5, 7, 9]);
516553 /// # }
517554 /// ```
518- pub fn try_reserve ( & mut self , used_cap : usize , needed_extra_cap : usize )
519- -> Result < ( ) , CollectionAllocErr > {
520- unsafe {
521- // NOTE: we don't early branch on ZSTs here because we want this
522- // to actually catch "asking for more than usize::MAX" in that case.
523- // If we make it past the first branch then we are guaranteed to
524- // panic.
525-
526- // Don't actually need any more capacity.
527- // Wrapping in case they give a bad `used_cap`
528- if self . cap ( ) . wrapping_sub ( used_cap) >= needed_extra_cap {
529- return Ok ( ( ) ) ;
530- }
531-
532- let new_cap = self . amortized_new_size ( used_cap, needed_extra_cap) ?;
533- let new_layout = Layout :: array :: < T > ( new_cap) . map_err ( |_| CapacityOverflow ) ?;
534-
535- // FIXME: may crash and burn on over-reserve
536- alloc_guard ( new_layout. size ( ) ) ?;
537-
538- let res = match self . current_layout ( ) {
539- Some ( layout) => {
540- debug_assert ! ( new_layout. align( ) == layout. align( ) ) ;
541- self . a . realloc ( NonNull :: from ( self . ptr ) . as_opaque ( ) , layout, new_layout. size ( ) )
542- }
543- None => self . a . alloc ( new_layout) ,
544- } ;
545-
546- self . ptr = res?. cast ( ) . into ( ) ;
547- self . cap = new_cap;
548-
549- Ok ( ( ) )
550- }
551- }
552-
553- /// The same as try_reserve, but errors are lowered to a call to oom().
554555 pub fn reserve ( & mut self , used_cap : usize , needed_extra_cap : usize ) {
555556 match self . try_reserve ( used_cap, needed_extra_cap) {
556557 Err ( CapacityOverflow ) => capacity_overflow ( ) ,
0 commit comments