2828pub unsafe trait Data : Sized {
2929 /// The array element type.
3030 type Elem ;
31+
3132 #[ doc( hidden) ]
3233 // This method is only used for debugging
3334 fn _data_slice ( & self ) -> & [ Self :: Elem ] ;
35+
36+ /// Converts the array to a uniquely owned array, cloning elements if necessary.
37+ #[ doc( hidden) ]
38+ fn into_owned < D > ( self_ : ArrayBase < Self , D > ) -> ArrayBase < OwnedRepr < Self :: Elem > , D >
39+ where
40+ Self :: Elem : Clone ,
41+ D : Dimension ;
42+
3443 private_decl ! { }
3544}
3645
@@ -77,6 +86,20 @@ unsafe impl<A> Data for OwnedArcRepr<A> {
7786 fn _data_slice ( & self ) -> & [ A ] {
7887 & self . 0
7988 }
89+ fn into_owned < D > ( mut self_ : ArrayBase < Self , D > ) -> ArrayBase < OwnedRepr < Self :: Elem > , D >
90+ where
91+ A : Clone ,
92+ D : Dimension ,
93+ {
94+ Self :: ensure_unique ( & mut self_) ;
95+ let data = OwnedRepr ( Arc :: try_unwrap ( self_. data . 0 ) . ok ( ) . unwrap ( ) ) ;
96+ ArrayBase {
97+ data : data,
98+ ptr : self_. ptr ,
99+ dim : self_. dim ,
100+ strides : self_. strides ,
101+ }
102+ }
80103 private_impl ! { }
81104}
82105
@@ -130,6 +153,14 @@ unsafe impl<A> Data for OwnedRepr<A> {
130153 fn _data_slice ( & self ) -> & [ A ] {
131154 & self . 0
132155 }
156+ #[ inline]
157+ fn into_owned < D > ( self_ : ArrayBase < Self , D > ) -> ArrayBase < OwnedRepr < Self :: Elem > , D >
158+ where
159+ A : Clone ,
160+ D : Dimension ,
161+ {
162+ self_
163+ }
133164 private_impl ! { }
134165}
135166
@@ -166,6 +197,13 @@ unsafe impl<'a, A> Data for ViewRepr<&'a A> {
166197 fn _data_slice ( & self ) -> & [ A ] {
167198 & [ ]
168199 }
200+ fn into_owned < D > ( self_ : ArrayBase < Self , D > ) -> ArrayBase < OwnedRepr < Self :: Elem > , D >
201+ where
202+ Self :: Elem : Clone ,
203+ D : Dimension ,
204+ {
205+ self_. to_owned ( )
206+ }
169207 private_impl ! { }
170208}
171209
@@ -180,6 +218,13 @@ unsafe impl<'a, A> Data for ViewRepr<&'a mut A> {
180218 fn _data_slice ( & self ) -> & [ A ] {
181219 & [ ]
182220 }
221+ fn into_owned < D > ( self_ : ArrayBase < Self , D > ) -> ArrayBase < OwnedRepr < Self :: Elem > , D >
222+ where
223+ Self :: Elem : Clone ,
224+ D : Dimension ,
225+ {
226+ self_. to_owned ( )
227+ }
183228 private_impl ! { }
184229}
185230
@@ -193,13 +238,11 @@ unsafe impl<'a, A> DataMut for ViewRepr<&'a mut A> { }
193238pub unsafe trait DataOwned : Data {
194239 #[ doc( hidden) ]
195240 fn new ( elements : Vec < Self :: Elem > ) -> Self ;
241+
242+ /// Converts the data representation to a shared (copy on write)
243+ /// representation, without any copying.
196244 #[ doc( hidden) ]
197245 fn into_shared ( self ) -> OwnedRcRepr < Self :: Elem > ;
198- #[ doc( hidden) ]
199- fn into_owned < D > ( self_ : ArrayBase < Self , D > ) -> ArrayBase < OwnedRepr < Self :: Elem > , D >
200- where
201- Self :: Elem : Clone ,
202- D : Dimension ;
203246}
204247
205248/// Array representation trait.
@@ -219,14 +262,6 @@ unsafe impl<A> DataOwned for OwnedRepr<A> {
219262 fn into_shared ( self ) -> OwnedRcRepr < A > {
220263 OwnedArcRepr ( Arc :: new ( self . 0 ) )
221264 }
222- #[ inline]
223- fn into_owned < D > ( self_ : ArrayBase < Self , D > ) -> ArrayBase < OwnedRepr < Self :: Elem > , D >
224- where
225- A : Clone ,
226- D : Dimension ,
227- {
228- self_
229- }
230265}
231266
232267unsafe impl < A > DataOwned for OwnedArcRepr < A > {
@@ -237,20 +272,4 @@ unsafe impl<A> DataOwned for OwnedArcRepr<A> {
237272 fn into_shared ( self ) -> OwnedRcRepr < A > {
238273 self
239274 }
240-
241- fn into_owned < D > ( mut self_ : ArrayBase < Self , D > ) -> ArrayBase < OwnedRepr < Self :: Elem > , D >
242- where
243- A : Clone ,
244- D : Dimension ,
245- {
246- Self :: ensure_unique ( & mut self_) ;
247- let data = OwnedRepr ( Arc :: try_unwrap ( self_. data . 0 ) . ok ( ) . unwrap ( ) ) ;
248- ArrayBase {
249- data : data,
250- ptr : self_. ptr ,
251- dim : self_. dim ,
252- strides : self_. strides ,
253- }
254- }
255275}
256-
0 commit comments