Skip to content

Commit 350a92e

Browse files
committed
Merge pull request #148 from bluss/no-order-map
Use .as_slice_memory_order in .to_owned() and .map()
2 parents b660e0f + 9c722ce commit 350a92e

File tree

4 files changed

+44
-8
lines changed

4 files changed

+44
-8
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ script:
2525
cargo test --verbose &&
2626
([ -z "$FEATURES" ] || cargo build --verbose --features "$FEATURES") &&
2727
([ -z "$FEATURES" ] || cargo test --verbose --features "$FEATURES") &&
28-
([ "$BENCH" != 1 ] || cargo bench --verbose --features "$FEATURES")
28+
([ "$BENCH" != 1 ] || cargo bench --no-run --verbose --features "$FEATURES")

src/impl_methods.rs

+15-7
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,13 @@ impl<A, S, D> ArrayBase<S, D> where S: Data<Elem=A>, D: Dimension
8383
pub fn to_owned(&self) -> OwnedArray<A, D>
8484
where A: Clone
8585
{
86-
let data = if let Some(slc) = self.as_slice() {
87-
slc.to_vec()
86+
let (data, strides) = if let Some(slc) = self.as_slice_memory_order() {
87+
(slc.to_vec(), self.strides.clone())
8888
} else {
89-
self.iter().cloned().collect()
89+
(self.iter().cloned().collect(), self.dim.default_strides())
9090
};
9191
unsafe {
92-
ArrayBase::from_vec_dim_unchecked(self.dim.clone(), data)
92+
ArrayBase::from_vec_dim_stride_unchecked(self.dim.clone(), strides, data)
9393
}
9494
}
9595

@@ -1074,9 +1074,17 @@ impl<A, S, D> ArrayBase<S, D> where S: Data<Elem=A>, D: Dimension
10741074
where F: FnMut(&'a A) -> B,
10751075
A: 'a,
10761076
{
1077-
let v = ::iterators::to_vec(self.iter().map(f));
1078-
unsafe {
1079-
ArrayBase::from_vec_dim_unchecked(self.dim.clone(), v)
1077+
if let Some(slc) = self.as_slice_memory_order() {
1078+
let v = ::iterators::to_vec(slc.iter().map(f));
1079+
unsafe {
1080+
ArrayBase::from_vec_dim_stride_unchecked(
1081+
self.dim.clone(), self.strides.clone(), v)
1082+
}
1083+
} else {
1084+
let v = ::iterators::to_vec(self.iter().map(f));
1085+
unsafe {
1086+
ArrayBase::from_vec_dim_unchecked(self.dim.clone(), v)
1087+
}
10801088
}
10811089
}
10821090
}

src/iterators.rs

+2
Original file line numberDiff line numberDiff line change
@@ -888,13 +888,15 @@ send_sync_read_write!(AxisChunksIterMut);
888888
/// to deliver exactly as many items as it said it would.
889889
pub unsafe trait TrustedIterator { }
890890

891+
use std::slice;
891892
use std::iter;
892893
use linspace::Linspace;
893894

894895
unsafe impl<F> TrustedIterator for Linspace<F> { }
895896
unsafe impl<'a, A, D> TrustedIterator for Elements<'a, A, D> { }
896897
unsafe impl<I, F> TrustedIterator for iter::Map<I, F>
897898
where I: TrustedIterator { }
899+
unsafe impl<'a, A> TrustedIterator for slice::Iter<'a, A> { }
898900

899901

900902
/// Like Iterator::collect, but only for trusted length iterators

tests/array.rs

+26
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,32 @@ fn test_f_order() {
883883
assert_eq!(dupc, dupf);
884884
}
885885

886+
#[test]
887+
fn to_owned_memory_order() {
888+
// check that .to_owned() makes f-contiguous arrays out of f-contiguous
889+
// input.
890+
let c = arr2(&[[1, 2, 3],
891+
[4, 5, 6]]);
892+
let mut f = c.view();
893+
f.swap_axes(0, 1);
894+
let fo = f.to_owned();
895+
assert_eq!(f, fo);
896+
assert_eq!(f.strides(), fo.strides());
897+
}
898+
899+
#[test]
900+
fn map_memory_order() {
901+
let a = arr3(&[[[1, 2, 3],
902+
[4, 5, 6]],
903+
[[7, 8, 9],
904+
[0, -1, -2]]]);
905+
let mut v = a.view();
906+
v.swap_axes(0, 1);
907+
let amap = v.map(|x| *x >= 3);
908+
assert_eq!(amap.dim(), v.dim());
909+
assert_eq!(amap.strides(), v.strides());
910+
}
911+
886912
#[test]
887913
fn test_contiguous() {
888914
let c = arr3(&[[[1, 2, 3],

0 commit comments

Comments
 (0)