@@ -1261,49 +1261,6 @@ impl<T> Arc<[T]> {
1261
1261
}
1262
1262
}
1263
1263
1264
- /// Create an `Arc<[T]>` by reusing the underlying memory
1265
- /// of a `Vec<T>`. This will return the vector if the existing allocation
1266
- /// is not large enough.
1267
- #[ cfg( not( no_global_oom_handling) ) ]
1268
- fn try_from_vec_in_place ( mut v : Vec < T > ) -> Result < Arc < [ T ] > , Vec < T > > {
1269
- let layout_elements = Layout :: array :: < T > ( v. len ( ) ) . unwrap ( ) ;
1270
- let layout_allocation = Layout :: array :: < T > ( v. capacity ( ) ) . unwrap ( ) ;
1271
- let layout_arcinner = arcinner_layout_for_value_layout ( layout_elements) ;
1272
- let mut ptr = NonNull :: new ( v. as_mut_ptr ( ) ) . expect ( "`Vec<T>` stores `NonNull<T>`" ) ;
1273
- if layout_arcinner. size ( ) > layout_allocation. size ( )
1274
- || layout_arcinner. align ( ) > layout_allocation. align ( )
1275
- {
1276
- // Can't fit - calling `grow` would involve `realloc`
1277
- // (which copies the elements), followed by copying again.
1278
- return Err ( v) ;
1279
- }
1280
- if layout_arcinner. size ( ) < layout_allocation. size ( )
1281
- || layout_arcinner. align ( ) < layout_allocation. align ( )
1282
- {
1283
- // We need to shrink the allocation so that it fits
1284
- // https://doc.rust-lang.org/nightly/std/alloc/trait.Allocator.html#memory-fitting
1285
- // SAFETY:
1286
- // - Vec allocates by requesting `Layout::array::<T>(capacity)`, so this capacity matches
1287
- // - `layout_arcinner` is smaller
1288
- // If this fails, the ownership has not been transferred
1289
- if let Ok ( p) = unsafe { Global . shrink ( ptr. cast ( ) , layout_allocation, layout_arcinner) }
1290
- {
1291
- ptr = p. cast ( ) ;
1292
- } else {
1293
- return Err ( v) ;
1294
- }
1295
- }
1296
- // Make sure the vec's memory isn't deallocated now
1297
- let v = mem:: ManuallyDrop :: new ( v) ;
1298
- let ptr: * mut ArcInner < [ T ] > = ptr:: slice_from_raw_parts_mut ( ptr. as_ptr ( ) , v. len ( ) ) as _ ;
1299
- unsafe {
1300
- ptr:: copy ( ptr. cast :: < T > ( ) , & mut ( * ptr) . data as * mut [ T ] as * mut T , v. len ( ) ) ;
1301
- ptr:: write ( & mut ( * ptr) . strong , atomic:: AtomicUsize :: new ( 1 ) ) ;
1302
- ptr:: write ( & mut ( * ptr) . weak , atomic:: AtomicUsize :: new ( 1 ) ) ;
1303
- Ok ( Self :: from_ptr ( ptr) )
1304
- }
1305
- }
1306
-
1307
1264
/// Constructs an `Arc<[T]>` from an iterator known to be of a certain size.
1308
1265
///
1309
1266
/// Behavior is undefined should the size be wrong.
@@ -2615,17 +2572,12 @@ impl<T> From<Vec<T>> for Arc<[T]> {
2615
2572
/// assert_eq!(&[1, 2, 3], &shared[..]);
2616
2573
/// ```
2617
2574
#[ inline]
2618
- fn from ( v : Vec < T > ) -> Arc < [ T ] > {
2619
- match Arc :: try_from_vec_in_place ( v) {
2620
- Ok ( rc) => rc,
2621
- Err ( mut v) => {
2622
- unsafe {
2623
- let rc = Arc :: copy_from_slice ( & v) ;
2624
- // Allow the Vec to free its memory, but not destroy its contents
2625
- v. set_len ( 0 ) ;
2626
- rc
2627
- }
2628
- }
2575
+ fn from ( mut v : Vec < T > ) -> Arc < [ T ] > {
2576
+ unsafe {
2577
+ let rc = Arc :: copy_from_slice ( & v) ;
2578
+ // Allow the Vec to free its memory, but not destroy its contents
2579
+ v. set_len ( 0 ) ;
2580
+ rc
2629
2581
}
2630
2582
}
2631
2583
}
0 commit comments