From ee320524a11b726efd2f4240d0b3345f38c4ac26 Mon Sep 17 00:00:00 2001 From: bluss Date: Sun, 13 Mar 2016 21:20:25 +0100 Subject: [PATCH 1/2] Use .as_slice_memory_order in .to_owned() and .map() --- src/impl_methods.rs | 22 +++++++++++++++------- src/iterators.rs | 2 ++ tests/array.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/impl_methods.rs b/src/impl_methods.rs index 7372b8be0..37bdc66ef 100644 --- a/src/impl_methods.rs +++ b/src/impl_methods.rs @@ -83,13 +83,13 @@ impl ArrayBase where S: Data, D: Dimension pub fn to_owned(&self) -> OwnedArray where A: Clone { - let data = if let Some(slc) = self.as_slice() { - slc.to_vec() + let (data, strides) = if let Some(slc) = self.as_slice_memory_order() { + (slc.to_vec(), self.strides.clone()) } else { - self.iter().cloned().collect() + (self.iter().cloned().collect(), self.dim.default_strides()) }; unsafe { - ArrayBase::from_vec_dim_unchecked(self.dim.clone(), data) + ArrayBase::from_vec_dim_stride_unchecked(self.dim.clone(), strides, data) } } @@ -1074,9 +1074,17 @@ impl ArrayBase where S: Data, D: Dimension where F: FnMut(&'a A) -> B, A: 'a, { - let v = ::iterators::to_vec(self.iter().map(f)); - unsafe { - ArrayBase::from_vec_dim_unchecked(self.dim.clone(), v) + if let Some(slc) = self.as_slice_memory_order() { + let v = ::iterators::to_vec(slc.iter().map(f)); + unsafe { + ArrayBase::from_vec_dim_stride_unchecked( + self.dim.clone(), self.strides.clone(), v) + } + } else { + let v = ::iterators::to_vec(self.iter().map(f)); + unsafe { + ArrayBase::from_vec_dim_unchecked(self.dim.clone(), v) + } } } } diff --git a/src/iterators.rs b/src/iterators.rs index 3b9e3eb28..51690bbd2 100644 --- a/src/iterators.rs +++ b/src/iterators.rs @@ -888,6 +888,7 @@ send_sync_read_write!(AxisChunksIterMut); /// to deliver exactly as many items as it said it would. pub unsafe trait TrustedIterator { } +use std::slice; use std::iter; use linspace::Linspace; @@ -895,6 +896,7 @@ unsafe impl TrustedIterator for Linspace { } unsafe impl<'a, A, D> TrustedIterator for Elements<'a, A, D> { } unsafe impl TrustedIterator for iter::Map where I: TrustedIterator { } +unsafe impl<'a, A> TrustedIterator for slice::Iter<'a, A> { } /// Like Iterator::collect, but only for trusted length iterators diff --git a/tests/array.rs b/tests/array.rs index a7ed8f523..4fdda2202 100644 --- a/tests/array.rs +++ b/tests/array.rs @@ -883,6 +883,32 @@ fn test_f_order() { assert_eq!(dupc, dupf); } +#[test] +fn to_owned_memory_order() { + // check that .to_owned() makes f-contiguous arrays out of f-contiguous + // input. + let c = arr2(&[[1, 2, 3], + [4, 5, 6]]); + let mut f = c.view(); + f.swap_axes(0, 1); + let fo = f.to_owned(); + assert_eq!(f, fo); + assert_eq!(f.strides(), fo.strides()); +} + +#[test] +fn map_memory_order() { + let a = arr3(&[[[1, 2, 3], + [4, 5, 6]], + [[7, 8, 9], + [0, -1, -2]]]); + let mut v = a.view(); + v.swap_axes(0, 1); + let amap = v.map(|x| *x >= 3); + assert_eq!(amap.dim(), v.dim()); + assert_eq!(amap.strides(), v.strides()); +} + #[test] fn test_contiguous() { let c = arr3(&[[[1, 2, 3], From 9c722ce68b176cc37c4725d16aec048cd482cd28 Mon Sep 17 00:00:00 2001 From: bluss Date: Sun, 13 Mar 2016 21:25:09 +0100 Subject: [PATCH 2/2] Don't run benchmarks in travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 41dae76f8..abe4d7cfc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,4 @@ script: cargo test --verbose && ([ -z "$FEATURES" ] || cargo build --verbose --features "$FEATURES") && ([ -z "$FEATURES" ] || cargo test --verbose --features "$FEATURES") && - ([ "$BENCH" != 1 ] || cargo bench --verbose --features "$FEATURES") + ([ "$BENCH" != 1 ] || cargo bench --no-run --verbose --features "$FEATURES")