@@ -385,26 +385,7 @@ impl<T, A: Alloc> RawVec<T, A> {
385
385
}
386
386
}
387
387
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.
408
389
pub fn try_reserve_exact ( & mut self , used_cap : usize , needed_extra_cap : usize )
409
390
-> Result < ( ) , CollectionAllocErr > {
410
391
@@ -441,6 +422,26 @@ impl<T, A: Alloc> RawVec<T, A> {
441
422
}
442
423
}
443
424
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
444
445
pub fn reserve_exact ( & mut self , used_cap : usize , needed_extra_cap : usize ) {
445
446
match self . try_reserve_exact ( used_cap, needed_extra_cap) {
446
447
Err ( CapacityOverflow ) => capacity_overflow ( ) ,
@@ -463,6 +464,42 @@ impl<T, A: Alloc> RawVec<T, A> {
463
464
Ok ( cmp:: max ( double_cap, required_cap) )
464
465
}
465
466
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
+
466
503
/// Ensures that the buffer contains at least enough space to hold
467
504
/// `used_cap + needed_extra_cap` elements. If it doesn't already have
468
505
/// enough capacity, will reallocate enough space plus comfortable slack
@@ -515,42 +552,6 @@ impl<T, A: Alloc> RawVec<T, A> {
515
552
/// # vector.push_all(&[1, 3, 5, 7, 9]);
516
553
/// # }
517
554
/// ```
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().
554
555
pub fn reserve ( & mut self , used_cap : usize , needed_extra_cap : usize ) {
555
556
match self . try_reserve ( used_cap, needed_extra_cap) {
556
557
Err ( CapacityOverflow ) => capacity_overflow ( ) ,
0 commit comments