@@ -348,50 +348,6 @@ 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
-
395
351
/// Constructs a new `Pin<Arc<T>>`. If `T` does not implement `Unpin`, then
396
352
/// `data` will be pinned in memory and unable to be moved.
397
353
#[ stable( feature = "pin" , since = "1.33.0" ) ]
@@ -442,6 +398,52 @@ impl<T> Arc<T> {
442
398
}
443
399
}
444
400
401
+ impl < T > Arc < [ T ] > {
402
+ /// Construct a new reference-counted slice with uninitialized contents.
403
+ ///
404
+ /// # Examples
405
+ ///
406
+ /// ```
407
+ /// #![feature(new_uninit)]
408
+ /// #![feature(get_mut_unchecked)]
409
+ ///
410
+ /// use std::sync::Arc;
411
+ ///
412
+ /// let mut values = Arc::<[u32]>::new_uninit_slice(3);
413
+ ///
414
+ /// let values = unsafe {
415
+ /// // Deferred initialization:
416
+ /// Arc::get_mut_unchecked(&mut values)[0].as_mut_ptr().write(1);
417
+ /// Arc::get_mut_unchecked(&mut values)[1].as_mut_ptr().write(2);
418
+ /// Arc::get_mut_unchecked(&mut values)[2].as_mut_ptr().write(3);
419
+ ///
420
+ /// values.assume_init()
421
+ /// };
422
+ ///
423
+ /// assert_eq!(*values, [1, 2, 3])
424
+ /// ```
425
+ #[ unstable( feature = "new_uninit" , issue = "0" ) ]
426
+ pub fn new_uninit_slice ( len : usize ) -> Arc < [ mem:: MaybeUninit < T > ] > {
427
+ let data_layout = Layout :: array :: < mem:: MaybeUninit < T > > ( len) . unwrap ( ) ;
428
+ let ( layout, offset) = Layout :: new :: < ArcInner < ( ) > > ( ) . extend ( data_layout) . unwrap ( ) ;
429
+ unsafe {
430
+ let allocated_ptr = Global . alloc ( layout)
431
+ . unwrap_or_else ( |_| handle_alloc_error ( layout) )
432
+ . as_ptr ( ) ;
433
+ let data_ptr = allocated_ptr. add ( offset) as * mut mem:: MaybeUninit < T > ;
434
+ let slice: * mut [ mem:: MaybeUninit < T > ] = from_raw_parts_mut ( data_ptr, len) ;
435
+ let wide_ptr = slice as * mut ArcInner < [ mem:: MaybeUninit < T > ] > ;
436
+ let wide_ptr = set_data_ptr ( wide_ptr, allocated_ptr) ;
437
+ ptr:: write ( & mut ( * wide_ptr) . strong , atomic:: AtomicUsize :: new ( 1 ) ) ;
438
+ ptr:: write ( & mut ( * wide_ptr) . weak , atomic:: AtomicUsize :: new ( 1 ) ) ;
439
+ Arc {
440
+ ptr : NonNull :: new_unchecked ( wide_ptr) ,
441
+ phantom : PhantomData ,
442
+ }
443
+ }
444
+ }
445
+ }
446
+
445
447
impl < T > Arc < mem:: MaybeUninit < T > > {
446
448
/// Convert to `Arc<T>`.
447
449
///
@@ -503,7 +505,7 @@ impl<T> Arc<[mem::MaybeUninit<T>]> {
503
505
///
504
506
/// use std::sync::Arc;
505
507
///
506
- /// let mut values = Arc::<u32>::new_uninit_slice(3);
508
+ /// let mut values = Arc::<[ u32] >::new_uninit_slice(3);
507
509
///
508
510
/// let values = unsafe {
509
511
/// // Deferred initialization:
0 commit comments