|
8 | 8 | use ndarray::prelude::*;
|
9 | 9 | use ndarray::{arr3, aview1, indices, s, Axis, Slice, Zip};
|
10 | 10 |
|
11 |
| -use itertools::{assert_equal, enumerate}; |
| 11 | +use itertools::assert_equal; |
| 12 | +use itertools::{enumerate, rev}; |
| 13 | +use std::cell::Cell; |
12 | 14 |
|
13 | 15 | macro_rules! assert_panics {
|
14 | 16 | ($body:expr) => {
|
@@ -892,3 +894,100 @@ fn test_rfold() {
|
892 | 894 | );
|
893 | 895 | }
|
894 | 896 | }
|
| 897 | + |
| 898 | +#[test] |
| 899 | +fn test_into_iter() { |
| 900 | + let a = Array1::from(vec![1, 2, 3, 4]); |
| 901 | + let v = a.into_iter().collect::<Vec<_>>(); |
| 902 | + assert_eq!(v, [1, 2, 3, 4]); |
| 903 | +} |
| 904 | + |
| 905 | +#[test] |
| 906 | +fn test_into_iter_2d() { |
| 907 | + let a = Array1::from(vec![1, 2, 3, 4]).into_shape((2, 2)).unwrap(); |
| 908 | + let v = a.into_iter().collect::<Vec<_>>(); |
| 909 | + assert_eq!(v, [1, 2, 3, 4]); |
| 910 | + |
| 911 | + let a = Array1::from(vec![1, 2, 3, 4]).into_shape((2, 2)).unwrap().reversed_axes(); |
| 912 | + let v = a.into_iter().collect::<Vec<_>>(); |
| 913 | + assert_eq!(v, [1, 3, 2, 4]); |
| 914 | +} |
| 915 | + |
| 916 | +#[test] |
| 917 | +fn test_into_iter_sliced() { |
| 918 | + /* |
| 919 | + let mut a = Array1::from(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) |
| 920 | + .into_shape((3, 4)).unwrap(); |
| 921 | + a.slice_axis_inplace(Axis(1), Slice::from(0..1)); |
| 922 | + assert_eq!(a, arr2(&[[1], [5], [9]])); |
| 923 | + let v = a.into_iter().collect::<Vec<_>>(); |
| 924 | + assert_eq!(v, [1, 5, 9]); |
| 925 | + */ |
| 926 | + |
| 927 | + let (m, n) = (4, 5); |
| 928 | + let drops = Cell::new(0); |
| 929 | + |
| 930 | + for i in 0..m - 1 { |
| 931 | + for j in 0..n - 1 { |
| 932 | + for i2 in i + 1 .. m { |
| 933 | + for j2 in j + 1 .. n { |
| 934 | + for invert in 0..3 { |
| 935 | + drops.set(0); |
| 936 | + let i = i as isize; |
| 937 | + let j = j as isize; |
| 938 | + let i2 = i2 as isize; |
| 939 | + let j2 = j2 as isize; |
| 940 | + let mut a = Array1::from_iter(0..(m * n) as i32) |
| 941 | + .mapv(|v| DropCount::new(v, &drops)) |
| 942 | + .into_shape((m, n)).unwrap(); |
| 943 | + a.slice_collapse(s![i..i2, j..j2]); |
| 944 | + if invert < a.ndim() { |
| 945 | + a.invert_axis(Axis(invert)); |
| 946 | + } |
| 947 | + //assert_eq!(a, arr2(&[[1, 2], [5, 6]])); |
| 948 | + println!("{:?}, {:?}", i..i2, j..j2); |
| 949 | + println!("{:?}", a); |
| 950 | + let answer = a.iter().cloned().collect::<Vec<_>>(); |
| 951 | + let v = a.into_iter().collect::<Vec<_>>(); |
| 952 | + assert_eq!(v, answer); |
| 953 | + |
| 954 | + assert_eq!(drops.get(), m * n - v.len()); |
| 955 | + drop(v); |
| 956 | + assert_eq!(drops.get(), m * n); |
| 957 | + } |
| 958 | + } |
| 959 | + } |
| 960 | + } |
| 961 | + } |
| 962 | +} |
| 963 | + |
| 964 | +/// Helper struct that counts its drops Asserts that it's not dropped twice. Also global number of |
| 965 | +/// drops is counted in the cell. |
| 966 | +/// |
| 967 | +/// Compares equal by its "represented value". |
| 968 | +#[derive(Clone, Debug)] |
| 969 | +struct DropCount<'a> { |
| 970 | + value: i32, |
| 971 | + my_drops: usize, |
| 972 | + drops: &'a Cell<usize> |
| 973 | +} |
| 974 | + |
| 975 | +impl PartialEq for DropCount<'_> { |
| 976 | + fn eq(&self, other: &Self) -> bool { |
| 977 | + self.value == other.value |
| 978 | + } |
| 979 | +} |
| 980 | + |
| 981 | +impl<'a> DropCount<'a> { |
| 982 | + fn new(value: i32, drops: &'a Cell<usize>) -> Self { |
| 983 | + DropCount { value, my_drops: 0, drops } |
| 984 | + } |
| 985 | +} |
| 986 | + |
| 987 | +impl Drop for DropCount<'_> { |
| 988 | + fn drop(&mut self) { |
| 989 | + assert_eq!(self.my_drops, 0); |
| 990 | + self.my_drops += 1; |
| 991 | + self.drops.set(self.drops.get() + 1); |
| 992 | + } |
| 993 | +} |
0 commit comments