@@ -174,7 +174,12 @@ impl<'py, T: Element> NpySingleIterBuilder<'py, T, Readonly> {
174
174
175
175
impl < ' py , T : Element > NpySingleIterBuilder < ' py , T , ReadWrite > {
176
176
/// Makes a new builder for a writable iterator.
177
- pub fn readwrite < D : ndarray:: Dimension > ( array : & ' py PyArray < T , D > ) -> Self {
177
+ ///
178
+ /// # Safety
179
+ ///
180
+ /// The iterator will produce mutable references into the array which must not be
181
+ /// aliased by other references for the life time of the iterator.
182
+ pub unsafe fn readwrite < D : ndarray:: Dimension > ( array : & ' py PyArray < T , D > ) -> Self {
178
183
Self {
179
184
flags : NPY_ITER_READWRITE ,
180
185
array : array. to_dyn ( ) ,
@@ -230,7 +235,7 @@ impl<'py, T: Element, I: IterMode> NpySingleIterBuilder<'py, T, I> {
230
235
/// use numpy::NpySingleIterBuilder;
231
236
/// pyo3::Python::with_gil(|py| {
232
237
/// let array = numpy::PyArray::arange(py, 0, 10, 1);
233
- /// let iter = NpySingleIterBuilder::readwrite(array).build().unwrap();
238
+ /// let iter = unsafe { NpySingleIterBuilder::readwrite(array).build().unwrap() } ;
234
239
/// for (i, elem) in iter.enumerate() {
235
240
/// assert_eq!(*elem, i as i64);
236
241
/// *elem = *elem * 2; // elements are mutable
@@ -242,8 +247,7 @@ impl<'py, T: Element, I: IterMode> NpySingleIterBuilder<'py, T, I> {
242
247
/// # use numpy::NpySingleIterBuilder;
243
248
/// # pyo3::Python::with_gil(|py| {
244
249
/// # let array = numpy::PyArray::arange(py, 0, 10, 1);
245
- /// # let iter = NpySingleIterBuilder::readwrite(array).build().unwrap();
246
- /// for (i, elem) in array.iter().unwrap().enumerate() {
250
+ /// for (i, elem) in unsafe { array.iter().unwrap().enumerate() } {
247
251
/// assert_eq!(*elem, i as i64);
248
252
/// *elem = *elem * 2; // elements are mutable
249
253
/// }
@@ -416,7 +420,12 @@ impl<'py, T: Element, S: MultiIterMode> NpyMultiIterBuilder<'py, T, S> {
416
420
}
417
421
418
422
/// Adds a writable array to the resulting iterator.
419
- pub fn add_readwrite < D : ndarray:: Dimension > (
423
+ ///
424
+ /// # Safety
425
+ ///
426
+ /// The iterator will produce mutable references into the array which must not be
427
+ /// aliased by other references for the life time of the iterator.
428
+ pub unsafe fn add_readwrite < D : ndarray:: Dimension > (
420
429
mut self ,
421
430
array : & ' py PyArray < T , D > ,
422
431
) -> NpyMultiIterBuilder < ' py , T , RW < S > > {
@@ -483,12 +492,14 @@ impl<'py, T: Element, S: MultiIterModeWithManyArrays> NpyMultiIterBuilder<'py, T
483
492
/// let array1 = numpy::PyArray::arange(py, 0, 10, 1);
484
493
/// let array2 = numpy::PyArray::arange(py, 10, 20, 1);
485
494
/// let array3 = numpy::PyArray::arange(py, 10, 30, 2);
486
- /// let iter = NpyMultiIterBuilder::new()
487
- /// .add_readonly(array1.readonly())
488
- /// .add_readwrite(array2)
489
- /// .add_readonly(array3.readonly())
490
- /// .build()
491
- /// .unwrap();
495
+ /// let iter = unsafe {
496
+ /// NpyMultiIterBuilder::new()
497
+ /// .add_readonly(array1.readonly())
498
+ /// .add_readwrite(array2)
499
+ /// .add_readonly(array3.readonly())
500
+ /// .build()
501
+ /// .unwrap()
502
+ /// };
492
503
/// for (i, j, k) in iter {
493
504
/// assert_eq!(*i + *j, *k);
494
505
/// *j += *i + *k; // The third element is only mutable.
0 commit comments