Skip to content

Commit 68e0034

Browse files
authored
Merge pull request #498 from jturner314/relax-into_owned
Remove DataOwned constraint from into_owned
2 parents 93d5639 + b97dba6 commit 68e0034

File tree

2 files changed

+49
-31
lines changed

2 files changed

+49
-31
lines changed

src/data_traits.rs

+48-29
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,18 @@ use {
2828
pub 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> { }
193238
pub 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

232267
unsafe 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-

src/impl_methods.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,9 @@ impl<A, S, D> ArrayBase<S, D> where S: Data<Elem=A>, D: Dimension
169169
}
170170

171171
/// Turn the array into a uniquely owned array, cloning the array elements
172-
/// to unshare them if necessary.
172+
/// if necessary.
173173
pub fn into_owned(self) -> Array<A, D>
174174
where A: Clone,
175-
S: DataOwned,
176175
{
177176
S::into_owned(self)
178177
}

0 commit comments

Comments
 (0)