File tree Expand file tree Collapse file tree 3 files changed +33
-13
lines changed Expand file tree Collapse file tree 3 files changed +33
-13
lines changed Original file line number Diff line number Diff line change 1010use alloc:: boxed:: Box ;
1111#[ cfg( not( feature = "std" ) ) ]
1212use alloc:: vec:: Vec ;
13+ use alloc:: sync:: Arc ;
14+ use std:: hash;
1315use std:: mem;
16+ use std:: mem:: size_of;
1417use std:: ops:: { Index , IndexMut } ;
15- use std:: { hash, mem:: size_of} ;
1618use std:: { iter:: FromIterator , slice} ;
1719
1820use crate :: imp_prelude:: * ;
21+
1922use crate :: {
2023 dimension,
2124 iter:: { Iter , IterMut } ,
2225 numeric_util,
2326 FoldWhile ,
2427 NdIndex ,
28+ OwnedArcRepr ,
2529 Zip ,
2630} ;
2731
@@ -457,7 +461,9 @@ where D: Dimension
457461{
458462 fn from ( arr : Array < A , D > ) -> ArcArray < A , D >
459463 {
460- arr. into_shared ( )
464+ let data = OwnedArcRepr ( Arc :: new ( arr. data ) ) ;
465+ // safe because: equivalent unmoved data, ptr and dims remain valid
466+ unsafe { ArrayBase :: from_data_ptr ( data, arr. ptr ) . with_strides_dim ( arr. strides , arr. dim ) }
461467 }
462468}
463469
Original file line number Diff line number Diff line change @@ -553,9 +553,13 @@ pub unsafe trait DataOwned: Data
553553 fn new ( elements : Vec < Self :: Elem > ) -> Self ;
554554
555555 /// Converts the data representation to a shared (copy on write)
556- /// representation, without any copying .
556+ /// representation, cloning the array elements if necessary .
557557 #[ doc( hidden) ]
558- fn into_shared ( self ) -> OwnedArcRepr < Self :: Elem > ;
558+ #[ allow( clippy:: wrong_self_convention) ]
559+ fn into_shared < D > ( self_ : ArrayBase < Self , D > ) -> ArcArray < Self :: Elem , D >
560+ where
561+ Self :: Elem : Clone ,
562+ D : Dimension ;
559563}
560564
561565/// Array representation trait.
@@ -578,9 +582,12 @@ unsafe impl<A> DataOwned for OwnedRepr<A>
578582 OwnedRepr :: from ( elements)
579583 }
580584
581- fn into_shared ( self ) -> OwnedArcRepr < A >
585+ fn into_shared < D > ( self_ : ArrayBase < Self , D > ) -> ArcArray < A , D >
586+ where
587+ A : Clone ,
588+ D : Dimension ,
582589 {
583- OwnedArcRepr ( Arc :: new ( self ) )
590+ ArcArray :: from ( self_ )
584591 }
585592}
586593
@@ -593,9 +600,12 @@ unsafe impl<A> DataOwned for OwnedArcRepr<A>
593600 OwnedArcRepr ( Arc :: new ( OwnedRepr :: from ( elements) ) )
594601 }
595602
596- fn into_shared ( self ) -> OwnedArcRepr < A >
603+ fn into_shared < D > ( self_ : ArrayBase < Self , D > ) -> ArcArray < A , D >
604+ where
605+ A : Clone ,
606+ D : Dimension ,
597607 {
598- self
608+ self_
599609 }
600610}
601611
Original file line number Diff line number Diff line change @@ -292,13 +292,17 @@ where
292292 }
293293
294294 /// Turn the array into a shared ownership (copy on write) array,
295- /// without any copying.
295+ /// cloning the array elements if necessary.
296+ ///
297+ /// If you want to generalize over `Array` and `ArcArray` inputs but avoid
298+ /// an `A: Clone` bound, use `Into::<ArcArray<A, D>>::into` instead of this
299+ /// method.
296300 pub fn into_shared ( self ) -> ArcArray < A , D >
297- where S : DataOwned
301+ where
302+ A : Clone ,
303+ S : DataOwned ,
298304 {
299- let data = self . data . into_shared ( ) ;
300- // safe because: equivalent unmoved data, ptr and dims remain valid
301- unsafe { ArrayBase :: from_data_ptr ( data, self . ptr ) . with_strides_dim ( self . strides , self . dim ) }
305+ S :: into_shared ( self )
302306 }
303307
304308 /// Returns a reference to the first element of the array, or `None` if it
You can’t perform that action at this time.
0 commit comments