@@ -327,7 +327,7 @@ impl<T> Arc<T> {
327
327
/// // Deferred initialization:
328
328
/// Arc::get_mut_unchecked(&mut five).as_mut_ptr().write(5);
329
329
///
330
- /// Arc:: assume_init(five )
330
+ /// five. assume_init()
331
331
/// };
332
332
///
333
333
/// assert_eq!(*five, 5)
@@ -348,6 +348,50 @@ impl<T> Arc<T> {
348
348
}
349
349
}
350
350
351
+ /// Construct a new reference-counted slice with uninitialized contents.
352
+ ///
353
+ /// # Examples
354
+ ///
355
+ /// ```
356
+ /// #![feature(new_uninit)]
357
+ /// #![feature(get_mut_unchecked)]
358
+ ///
359
+ /// use std::sync::Arc;
360
+ ///
361
+ /// let mut values = Arc::<u32>::new_uninit_slice(3);
362
+ ///
363
+ /// let values = unsafe {
364
+ /// // Deferred initialization:
365
+ /// Arc::get_mut_unchecked(&mut values)[0].as_mut_ptr().write(1);
366
+ /// Arc::get_mut_unchecked(&mut values)[1].as_mut_ptr().write(2);
367
+ /// Arc::get_mut_unchecked(&mut values)[2].as_mut_ptr().write(3);
368
+ ///
369
+ /// values.assume_init()
370
+ /// };
371
+ ///
372
+ /// assert_eq!(*values, [1, 2, 3])
373
+ /// ```
374
+ #[ unstable( feature = "new_uninit" , issue = "0" ) ]
375
+ pub fn new_uninit_slice ( len : usize ) -> Arc < [ mem:: MaybeUninit < T > ] > {
376
+ let data_layout = Layout :: array :: < mem:: MaybeUninit < T > > ( len) . unwrap ( ) ;
377
+ let ( layout, offset) = Layout :: new :: < ArcInner < ( ) > > ( ) . extend ( data_layout) . unwrap ( ) ;
378
+ unsafe {
379
+ let allocated_ptr = Global . alloc ( layout)
380
+ . unwrap_or_else ( |_| handle_alloc_error ( layout) )
381
+ . as_ptr ( ) ;
382
+ let data_ptr = allocated_ptr. add ( offset) as * mut mem:: MaybeUninit < T > ;
383
+ let slice: * mut [ mem:: MaybeUninit < T > ] = from_raw_parts_mut ( data_ptr, len) ;
384
+ let wide_ptr = slice as * mut ArcInner < [ mem:: MaybeUninit < T > ] > ;
385
+ let wide_ptr = set_data_ptr ( wide_ptr, allocated_ptr) ;
386
+ ptr:: write ( & mut ( * wide_ptr) . strong , atomic:: AtomicUsize :: new ( 1 ) ) ;
387
+ ptr:: write ( & mut ( * wide_ptr) . weak , atomic:: AtomicUsize :: new ( 1 ) ) ;
388
+ Arc {
389
+ ptr : NonNull :: new_unchecked ( wide_ptr) ,
390
+ phantom : PhantomData ,
391
+ }
392
+ }
393
+ }
394
+
351
395
/// Constructs a new `Pin<Arc<T>>`. If `T` does not implement `Unpin`, then
352
396
/// `data` will be pinned in memory and unable to be moved.
353
397
#[ stable( feature = "pin" , since = "1.33.0" ) ]
@@ -423,16 +467,60 @@ impl<T> Arc<mem::MaybeUninit<T>> {
423
467
/// // Deferred initialization:
424
468
/// Arc::get_mut_unchecked(&mut five).as_mut_ptr().write(5);
425
469
///
426
- /// Arc:: assume_init(five )
470
+ /// five. assume_init()
427
471
/// };
428
472
///
429
473
/// assert_eq!(*five, 5)
430
474
/// ```
431
475
#[ unstable( feature = "new_uninit" , issue = "0" ) ]
432
476
#[ inline]
433
- pub unsafe fn assume_init ( this : Self ) -> Arc < T > {
434
- let ptr = this. ptr . cast ( ) ;
435
- mem:: forget ( this) ;
477
+ pub unsafe fn assume_init ( self ) -> Arc < T > {
478
+ let ptr = self . ptr . cast ( ) ;
479
+ mem:: forget ( self ) ;
480
+ Arc {
481
+ ptr,
482
+ phantom : PhantomData ,
483
+ }
484
+ }
485
+ }
486
+
487
+ impl < T > Arc < [ mem:: MaybeUninit < T > ] > {
488
+ /// Convert to `Arc<[T]>`.
489
+ ///
490
+ /// # Safety
491
+ ///
492
+ /// As with [`MaybeUninit::assume_init`],
493
+ /// it is up to the caller to guarantee that the value
494
+ /// really is in an initialized state.
495
+ /// Calling this when the content is not yet fully initialized
496
+ /// causes immediate undefined behavior.
497
+ ///
498
+ /// # Examples
499
+ ///
500
+ /// ```
501
+ /// #![feature(new_uninit)]
502
+ /// #![feature(get_mut_unchecked)]
503
+ ///
504
+ /// use std::sync::Arc;
505
+ ///
506
+ /// let mut values = Arc::<u32>::new_uninit_slice(3);
507
+ ///
508
+ /// let values = unsafe {
509
+ /// // Deferred initialization:
510
+ /// Arc::get_mut_unchecked(&mut values)[0].as_mut_ptr().write(1);
511
+ /// Arc::get_mut_unchecked(&mut values)[1].as_mut_ptr().write(2);
512
+ /// Arc::get_mut_unchecked(&mut values)[2].as_mut_ptr().write(3);
513
+ ///
514
+ /// values.assume_init()
515
+ /// };
516
+ ///
517
+ /// assert_eq!(*values, [1, 2, 3])
518
+ /// ```
519
+ #[ unstable( feature = "new_uninit" , issue = "0" ) ]
520
+ #[ inline]
521
+ pub unsafe fn assume_init ( self ) -> Arc < [ T ] > {
522
+ let ptr = NonNull :: new_unchecked ( self . ptr . as_ptr ( ) as _ ) ;
523
+ mem:: forget ( self ) ;
436
524
Arc {
437
525
ptr,
438
526
phantom : PhantomData ,
0 commit comments