Skip to content

Commit d54fa80

Browse files
committed
shape: Add internal constructor from_shape_trusted_iter_unchecked
1 parent 73ffe90 commit d54fa80

File tree

2 files changed

+31
-13
lines changed

2 files changed

+31
-13
lines changed

src/impl_constructors.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ use crate::indices;
2929
#[cfg(feature = "std")]
3030
use crate::iterators::to_vec;
3131
use crate::iterators::to_vec_mapped;
32+
use crate::iterators::TrustedIterator;
3233
use crate::StrideShape;
3334
#[cfg(feature = "std")]
3435
use crate::{geomspace, linspace, logspace};
@@ -495,6 +496,27 @@ where
495496
ArrayBase::from_data_ptr(DataOwned::new(v), ptr).with_strides_dim(strides, dim)
496497
}
497498

499+
/// Creates an array from an iterator, mapped by `map` and interpret it according to the
500+
/// provided shape and strides.
501+
///
502+
/// # Safety
503+
///
504+
/// See from_shape_vec_unchecked
505+
pub(crate) unsafe fn from_shape_trusted_iter_unchecked<Sh, I, F>(shape: Sh, iter: I, map: F)
506+
-> Self
507+
where
508+
Sh: Into<StrideShape<D>>,
509+
I: TrustedIterator + ExactSizeIterator,
510+
F: FnMut(I::Item) -> A,
511+
{
512+
let shape = shape.into();
513+
let dim = shape.dim;
514+
let strides = shape.strides.strides_for_dim(&dim);
515+
let v = to_vec_mapped(iter, map);
516+
Self::from_vec_dim_stride_unchecked(dim, strides, v)
517+
}
518+
519+
498520
/// Create an array with uninitalized elements, shape `shape`.
499521
///
500522
/// The uninitialized elements of type `A` are represented by the type `MaybeUninit<A>`,

src/impl_methods.rs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2226,17 +2226,14 @@ where
22262226
A: 'a,
22272227
S: Data,
22282228
{
2229-
if let Some(slc) = self.as_slice_memory_order() {
2230-
let v = crate::iterators::to_vec_mapped(slc.iter(), f);
2231-
unsafe {
2232-
ArrayBase::from_shape_vec_unchecked(
2229+
unsafe {
2230+
if let Some(slc) = self.as_slice_memory_order() {
2231+
ArrayBase::from_shape_trusted_iter_unchecked(
22332232
self.dim.clone().strides(self.strides.clone()),
2234-
v,
2235-
)
2233+
slc.iter(), f)
2234+
} else {
2235+
ArrayBase::from_shape_trusted_iter_unchecked(self.dim.clone(), self.iter(), f)
22362236
}
2237-
} else {
2238-
let v = crate::iterators::to_vec_mapped(self.iter(), f);
2239-
unsafe { ArrayBase::from_shape_vec_unchecked(self.dim.clone(), v) }
22402237
}
22412238
}
22422239

@@ -2256,11 +2253,10 @@ where
22562253
if self.is_contiguous() {
22572254
let strides = self.strides.clone();
22582255
let slc = self.as_slice_memory_order_mut().unwrap();
2259-
let v = crate::iterators::to_vec_mapped(slc.iter_mut(), f);
2260-
unsafe { ArrayBase::from_shape_vec_unchecked(dim.strides(strides), v) }
2256+
unsafe { ArrayBase::from_shape_trusted_iter_unchecked(dim.strides(strides),
2257+
slc.iter_mut(), f) }
22612258
} else {
2262-
let v = crate::iterators::to_vec_mapped(self.iter_mut(), f);
2263-
unsafe { ArrayBase::from_shape_vec_unchecked(dim, v) }
2259+
unsafe { ArrayBase::from_shape_trusted_iter_unchecked(dim, self.iter_mut(), f) }
22642260
}
22652261
}
22662262

0 commit comments

Comments
 (0)