1
+ #[ macro_use]
2
+ extern crate generic_array;
3
+
4
+ use std:: cell:: Cell ;
5
+ use std:: ops:: Drop ;
6
+
7
+ use generic_array:: GenericArray ;
8
+ use generic_array:: typenum:: consts:: U5 ;
9
+
10
+ #[ test]
11
+ fn test_into_iter_as_slice ( ) {
12
+ let array = arr ! [ char ; 'a' , 'b' , 'c' ] ;
13
+ let mut into_iter = array. into_iter ( ) ;
14
+ assert_eq ! ( into_iter. as_slice( ) , & [ 'a' , 'b' , 'c' ] ) ;
15
+ let _ = into_iter. next ( ) . unwrap ( ) ;
16
+ assert_eq ! ( into_iter. as_slice( ) , & [ 'b' , 'c' ] ) ;
17
+ let _ = into_iter. next ( ) . unwrap ( ) ;
18
+ let _ = into_iter. next ( ) . unwrap ( ) ;
19
+ assert_eq ! ( into_iter. as_slice( ) , & [ ] ) ;
20
+ }
21
+
22
+ #[ test]
23
+ fn test_into_iter_as_mut_slice ( ) {
24
+ let array = arr ! [ char ; 'a' , 'b' , 'c' ] ;
25
+ let mut into_iter = array. into_iter ( ) ;
26
+ assert_eq ! ( into_iter. as_slice( ) , & [ 'a' , 'b' , 'c' ] ) ;
27
+ into_iter. as_mut_slice ( ) [ 0 ] = 'x' ;
28
+ into_iter. as_mut_slice ( ) [ 1 ] = 'y' ;
29
+ assert_eq ! ( into_iter. next( ) . unwrap( ) , 'x' ) ;
30
+ assert_eq ! ( into_iter. as_slice( ) , & [ 'y' , 'c' ] ) ;
31
+ }
32
+
33
+ #[ test]
34
+ fn test_into_iter_debug ( ) {
35
+ let array = arr ! [ char ; 'a' , 'b' , 'c' ] ;
36
+ let into_iter = array. into_iter ( ) ;
37
+ let debug = format ! ( "{:?}" , into_iter) ;
38
+ assert_eq ! ( debug, "GenericArrayIter(['a', 'b', 'c'])" ) ;
39
+ }
40
+
41
+ #[ test]
42
+ fn test_into_iter_clone ( ) {
43
+ fn iter_equal < I : Iterator < Item = i32 > > ( it : I , slice : & [ i32 ] ) {
44
+ let v: Vec < i32 > = it. collect ( ) ;
45
+ assert_eq ! ( & v[ ..] , slice) ;
46
+ }
47
+ let mut it = arr ! [ i32 ; 1 , 2 , 3 ] . into_iter ( ) ;
48
+ iter_equal ( it. clone ( ) , & [ 1 , 2 , 3 ] ) ;
49
+ assert_eq ! ( it. next( ) , Some ( 1 ) ) ;
50
+ let mut it = it. rev ( ) ;
51
+ iter_equal ( it. clone ( ) , & [ 3 , 2 ] ) ;
52
+ assert_eq ! ( it. next( ) , Some ( 3 ) ) ;
53
+ iter_equal ( it. clone ( ) , & [ 2 ] ) ;
54
+ assert_eq ! ( it. next( ) , Some ( 2 ) ) ;
55
+ iter_equal ( it. clone ( ) , & [ ] ) ;
56
+ assert_eq ! ( it. next( ) , None ) ;
57
+ }
58
+
59
+ #[ test]
60
+ fn test_into_iter_nth ( ) {
61
+ let v = arr ! [ i32 ; 0 , 1 , 2 , 3 , 4 ] ;
62
+ for i in 0 ..v. len ( ) {
63
+ assert_eq ! ( v. clone( ) . into_iter( ) . nth( i) . unwrap( ) , v[ i] ) ;
64
+ }
65
+ assert_eq ! ( v. clone( ) . into_iter( ) . nth( v. len( ) ) , None ) ;
66
+
67
+ let mut iter = v. into_iter ( ) ;
68
+ assert_eq ! ( iter. nth( 2 ) . unwrap( ) , v[ 2 ] ) ;
69
+ assert_eq ! ( iter. nth( 1 ) . unwrap( ) , v[ 4 ] ) ;
70
+ }
71
+
72
+ #[ test]
73
+ fn test_into_iter_last ( ) {
74
+ let v = arr ! [ i32 ; 0 , 1 , 2 , 3 , 4 ] ;
75
+ assert_eq ! ( v. into_iter( ) . last( ) . unwrap( ) , 4 ) ;
76
+ assert_eq ! ( arr![ i32 ; 0 ] . into_iter( ) . last( ) . unwrap( ) , 0 ) ;
77
+ }
78
+
79
+ #[ test]
80
+ fn test_into_iter_count ( ) {
81
+ let v = arr ! [ i32 ; 0 , 1 , 2 , 3 , 4 ] ;
82
+ assert_eq ! ( v. clone( ) . into_iter( ) . count( ) , 5 ) ;
83
+
84
+ let mut iter2 = v. into_iter ( ) ;
85
+ iter2. next ( ) ;
86
+ iter2. next ( ) ;
87
+ assert_eq ! ( iter2. count( ) , 3 ) ;
88
+ }
89
+
90
+ #[ test]
91
+ fn test_into_iter_flat_map ( ) {
92
+ assert ! ( ( 0 ..5 ) . flat_map( |i| arr![ i32 ; 2 * i, 2 * i + 1 ] ) . eq( 0 ..10 ) ) ;
93
+ }
94
+
95
+ #[ test]
96
+ fn test_into_iter_drops ( ) {
97
+ struct R < ' a > {
98
+ i : & ' a Cell < usize > ,
99
+ }
100
+
101
+ impl < ' a > Drop for R < ' a > {
102
+ fn drop ( & mut self ) {
103
+ self . i . set ( self . i . get ( ) + 1 ) ;
104
+ }
105
+ }
106
+
107
+ fn r ( i : & Cell < usize > ) -> R {
108
+ R {
109
+ i : i
110
+ }
111
+ }
112
+
113
+ fn v ( i : & Cell < usize > ) -> GenericArray < R , U5 > {
114
+ arr ! [ R ; r( i) , r( i) , r( i) , r( i) , r( i) ]
115
+ }
116
+
117
+ let i = Cell :: new ( 0 ) ;
118
+ {
119
+ v ( & i) . into_iter ( ) ;
120
+ }
121
+ assert_eq ! ( i. get( ) , 5 ) ;
122
+
123
+ let i = Cell :: new ( 0 ) ;
124
+ {
125
+ let mut iter = v ( & i) . into_iter ( ) ;
126
+ let _x = iter. next ( ) ;
127
+ assert_eq ! ( i. get( ) , 0 ) ;
128
+ assert_eq ! ( iter. count( ) , 4 ) ;
129
+ assert_eq ! ( i. get( ) , 4 ) ;
130
+ }
131
+ assert_eq ! ( i. get( ) , 5 ) ;
132
+
133
+ let i = Cell :: new ( 0 ) ;
134
+ {
135
+ let mut iter = v ( & i) . into_iter ( ) ;
136
+ let _x = iter. nth ( 2 ) ;
137
+ assert_eq ! ( i. get( ) , 2 ) ;
138
+ let _y = iter. last ( ) ;
139
+ assert_eq ! ( i. get( ) , 3 ) ;
140
+ }
141
+ assert_eq ! ( i. get( ) , 5 ) ;
142
+
143
+ let i = Cell :: new ( 0 ) ;
144
+ for ( index, _x) in v ( & i) . into_iter ( ) . enumerate ( ) {
145
+ assert_eq ! ( i. get( ) , index) ;
146
+ }
147
+ assert_eq ! ( i. get( ) , 5 ) ;
148
+
149
+ let i = Cell :: new ( 0 ) ;
150
+ for ( index, _x) in v ( & i) . into_iter ( ) . rev ( ) . enumerate ( ) {
151
+ assert_eq ! ( i. get( ) , index) ;
152
+ }
153
+ assert_eq ! ( i. get( ) , 5 ) ;
154
+ }
155
+
156
+ /*
157
+ //TODO: Cover this
158
+ #[allow(dead_code)]
159
+ fn assert_covariance() {
160
+ fn into_iter<'new>(i: GenericArrayIter<&'static str, U10>) -> GenericArrayIter<&'new str, U10> {
161
+ i
162
+ }
163
+ }
164
+ */
0 commit comments