@@ -954,15 +954,8 @@ impl<T: Element> PyArray<T, Ix1> {
954
954
pub fn from_slice < ' py > ( py : Python < ' py > , slice : & [ T ] ) -> & ' py Self {
955
955
unsafe {
956
956
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) ;
966
959
array
967
960
}
968
961
}
@@ -1106,15 +1099,7 @@ impl<T: Element> PyArray<T, Ix2> {
1106
1099
if v. len ( ) != len2 {
1107
1100
return Err ( FromVecError :: new ( v. len ( ) , len2) ) ;
1108
1101
}
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) ;
1118
1103
}
1119
1104
Ok ( array)
1120
1105
}
@@ -1157,15 +1142,7 @@ impl<T: Element> PyArray<T, Ix3> {
1157
1142
if v. len ( ) != len3 {
1158
1143
return Err ( FromVecError :: new ( v. len ( ) , len3) ) ;
1159
1144
}
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) ;
1169
1146
}
1170
1147
}
1171
1148
Ok ( array)
@@ -1307,6 +1284,18 @@ impl<T: Element + AsPrimitive<f64>> PyArray<T, Ix1> {
1307
1284
}
1308
1285
}
1309
1286
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
+
1310
1299
#[ cfg( test) ]
1311
1300
mod tests {
1312
1301
use super :: * ;
0 commit comments