Skip to content

Commit 0a6c3a4

Browse files
committed
Factor common code for clone elements into a given data pointer and use it in PyArray::from_slice/vec2/vec3.
1 parent 6864a8a commit 0a6c3a4

File tree

1 file changed

+16
-27
lines changed

1 file changed

+16
-27
lines changed

src/array.rs

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -954,15 +954,8 @@ impl<T: Element> PyArray<T, Ix1> {
954954
pub fn from_slice<'py>(py: Python<'py>, slice: &[T]) -> &'py Self {
955955
unsafe {
956956
let array = PyArray::new(py, [slice.len()], false);
957-
if T::IS_COPY {
958-
ptr::copy_nonoverlapping(slice.as_ptr(), array.data(), slice.len());
959-
} else {
960-
let mut data_ptr = array.data();
961-
for item in slice {
962-
data_ptr.write(item.clone());
963-
data_ptr = data_ptr.add(1);
964-
}
965-
}
957+
let mut data_ptr = array.data();
958+
clone_elements(slice, &mut data_ptr);
966959
array
967960
}
968961
}
@@ -1106,15 +1099,7 @@ impl<T: Element> PyArray<T, Ix2> {
11061099
if v.len() != len2 {
11071100
return Err(FromVecError::new(v.len(), len2));
11081101
}
1109-
if T::IS_COPY {
1110-
ptr::copy_nonoverlapping(v.as_ptr(), data_ptr, len2);
1111-
data_ptr = data_ptr.add(len2);
1112-
} else {
1113-
for v in v {
1114-
data_ptr.write(v.clone());
1115-
data_ptr = data_ptr.add(1);
1116-
}
1117-
}
1102+
clone_elements(v, &mut data_ptr);
11181103
}
11191104
Ok(array)
11201105
}
@@ -1157,15 +1142,7 @@ impl<T: Element> PyArray<T, Ix3> {
11571142
if v.len() != len3 {
11581143
return Err(FromVecError::new(v.len(), len3));
11591144
}
1160-
if T::IS_COPY {
1161-
ptr::copy_nonoverlapping(v.as_ptr(), data_ptr, len3);
1162-
data_ptr = data_ptr.add(len3);
1163-
} else {
1164-
for v in v {
1165-
data_ptr.write(v.clone());
1166-
data_ptr = data_ptr.add(1);
1167-
}
1168-
}
1145+
clone_elements(v, &mut data_ptr);
11691146
}
11701147
}
11711148
Ok(array)
@@ -1307,6 +1284,18 @@ impl<T: Element + AsPrimitive<f64>> PyArray<T, Ix1> {
13071284
}
13081285
}
13091286

1287+
unsafe fn clone_elements<T: Element>(elems: &[T], data_ptr: &mut *mut T) {
1288+
if T::IS_COPY {
1289+
ptr::copy_nonoverlapping(elems.as_ptr(), *data_ptr, elems.len());
1290+
*data_ptr = data_ptr.add(elems.len());
1291+
} else {
1292+
for elem in elems {
1293+
data_ptr.write(elem.clone());
1294+
*data_ptr = data_ptr.add(1);
1295+
}
1296+
}
1297+
}
1298+
13101299
#[cfg(test)]
13111300
mod tests {
13121301
use super::*;

0 commit comments

Comments
 (0)