Skip to content

Commit 0852daf

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

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed

src/impl_constructors.rs

+15
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};
@@ -453,6 +454,20 @@ where
453454
unsafe { Ok(Self::from_vec_dim_stride_unchecked(dim, strides, v)) }
454455
}
455456

457+
pub(crate) unsafe fn from_shape_trusted_iter_unchecked<Sh, I, F>(shape: Sh, iter: I, map: F)
458+
-> Self
459+
where
460+
Sh: Into<StrideShape<D>>,
461+
I: TrustedIterator + ExactSizeIterator,
462+
F: FnMut(I::Item) -> A,
463+
{
464+
let shape = shape.into();
465+
let dim = shape.dim;
466+
let strides = shape.strides.strides_for_dim(&dim);
467+
let v = to_vec_mapped(iter, map);
468+
Self::from_vec_dim_stride_unchecked(dim, strides, v)
469+
}
470+
456471
/// Creates an array from a vector and interpret it according to the
457472
/// provided shape and strides. (No cloning of elements needed.)
458473
///

src/impl_methods.rs

+9-13
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)