28
28
pub unsafe trait Data : Sized {
29
29
/// The array element type.
30
30
type Elem ;
31
+
31
32
#[ doc( hidden) ]
32
33
// This method is only used for debugging
33
34
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
+
34
43
private_decl ! { }
35
44
}
36
45
@@ -77,6 +86,20 @@ unsafe impl<A> Data for OwnedArcRepr<A> {
77
86
fn _data_slice ( & self ) -> & [ A ] {
78
87
& self . 0
79
88
}
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
+ }
80
103
private_impl ! { }
81
104
}
82
105
@@ -130,6 +153,14 @@ unsafe impl<A> Data for OwnedRepr<A> {
130
153
fn _data_slice ( & self ) -> & [ A ] {
131
154
& self . 0
132
155
}
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
+ }
133
164
private_impl ! { }
134
165
}
135
166
@@ -166,6 +197,13 @@ unsafe impl<'a, A> Data for ViewRepr<&'a A> {
166
197
fn _data_slice ( & self ) -> & [ A ] {
167
198
& [ ]
168
199
}
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
+ }
169
207
private_impl ! { }
170
208
}
171
209
@@ -180,6 +218,13 @@ unsafe impl<'a, A> Data for ViewRepr<&'a mut A> {
180
218
fn _data_slice ( & self ) -> & [ A ] {
181
219
& [ ]
182
220
}
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
+ }
183
228
private_impl ! { }
184
229
}
185
230
@@ -193,13 +238,11 @@ unsafe impl<'a, A> DataMut for ViewRepr<&'a mut A> { }
193
238
pub unsafe trait DataOwned : Data {
194
239
#[ doc( hidden) ]
195
240
fn new ( elements : Vec < Self :: Elem > ) -> Self ;
241
+
242
+ /// Converts the data representation to a shared (copy on write)
243
+ /// representation, without any copying.
196
244
#[ doc( hidden) ]
197
245
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 ;
203
246
}
204
247
205
248
/// Array representation trait.
@@ -219,14 +262,6 @@ unsafe impl<A> DataOwned for OwnedRepr<A> {
219
262
fn into_shared ( self ) -> OwnedRcRepr < A > {
220
263
OwnedArcRepr ( Arc :: new ( self . 0 ) )
221
264
}
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
- }
230
265
}
231
266
232
267
unsafe impl < A > DataOwned for OwnedArcRepr < A > {
@@ -237,20 +272,4 @@ unsafe impl<A> DataOwned for OwnedArcRepr<A> {
237
272
fn into_shared ( self ) -> OwnedRcRepr < A > {
238
273
self
239
274
}
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
- }
255
275
}
256
-
0 commit comments