2
2
#![ allow( dead_code, unused_imports) ]
3
3
4
4
#[ cfg( not( feature = "std" ) ) ]
5
+ #[ macro_use]
5
6
extern crate alloc;
6
7
7
8
#[ cfg( not( feature = "std" ) ) ]
8
9
use alloc:: vec:: Vec ;
10
+ use core:: fmt:: Debug ;
9
11
10
12
use derive_more:: IntoIterator ;
11
13
14
+ #[ track_caller]
15
+ fn assert_iter < T : PartialEq + Debug , I : IntoIterator < Item = T > > ( iter : I , vals : & [ T ] ) {
16
+ assert_eq ! ( iter. into_iter( ) . collect:: <Vec <_>>( ) , vals) ;
17
+ }
18
+
12
19
#[ derive( IntoIterator ) ]
13
20
#[ into_iterator( owned, ref, ref_mut) ]
14
21
struct MyVec ( Vec < i32 > ) ;
15
22
23
+ #[ test]
24
+ fn tuple_single ( ) {
25
+ let mut vals = vec ! [ 1 , 2 , 3 ] ;
26
+ let mut iter = MyVec ( vals. clone ( ) ) ;
27
+
28
+ assert_iter ( & mut iter, & vals. iter_mut ( ) . collect :: < Vec < _ > > ( ) ) ;
29
+ assert_iter ( & iter, & vals. iter ( ) . collect :: < Vec < _ > > ( ) ) ;
30
+ assert_iter ( iter, & vals) ;
31
+ }
32
+
16
33
#[ derive( IntoIterator ) ]
17
34
#[ into_iterator( owned, ref, ref_mut) ]
18
35
struct Numbers {
19
36
numbers : Vec < i32 > ,
20
37
}
21
38
39
+ #[ test]
40
+ fn named_single ( ) {
41
+ let mut vals = vec ! [ 1 , 2 , 3 ] ;
42
+ let mut iter = Numbers {
43
+ numbers : vals. clone ( ) ,
44
+ } ;
45
+
46
+ assert_iter ( & mut iter, & vals. iter_mut ( ) . collect :: < Vec < _ > > ( ) ) ;
47
+ assert_iter ( & iter, & vals. iter ( ) . collect :: < Vec < _ > > ( ) ) ;
48
+ assert_iter ( iter, & vals) ;
49
+ }
50
+
22
51
#[ derive( IntoIterator ) ]
23
52
struct Numbers2 {
24
53
#[ into_iterator( owned, ref, ref_mut) ]
@@ -27,6 +56,19 @@ struct Numbers2 {
27
56
useless2 : bool ,
28
57
}
29
58
59
+ fn named_many ( ) {
60
+ let mut vals = vec ! [ 1 , 2 , 3 ] ;
61
+ let mut iter = Numbers2 {
62
+ numbers : vals. clone ( ) ,
63
+ useless : true ,
64
+ useless2 : true ,
65
+ } ;
66
+
67
+ assert_iter ( & mut iter, & vals. iter_mut ( ) . collect :: < Vec < _ > > ( ) ) ;
68
+ assert_iter ( & iter, & vals. iter ( ) . collect :: < Vec < _ > > ( ) ) ;
69
+ assert_iter ( iter, & vals) ;
70
+ }
71
+
30
72
#[ derive( IntoIterator ) ]
31
73
struct Numbers3 {
32
74
#[ into_iterator( ref, ref_mut) ]
@@ -45,3 +87,87 @@ impl ::core::iter::IntoIterator for Numbers3 {
45
87
<Vec < i32 > as :: core:: iter:: IntoIterator >:: into_iter ( self . numbers )
46
88
}
47
89
}
90
+
91
+ #[ derive( IntoIterator ) ]
92
+ struct Generic1 < T > {
93
+ #[ into_iterator( owned, ref, ref_mut) ]
94
+ items : Vec < T > ,
95
+ }
96
+
97
+ #[ test]
98
+ fn generic ( ) {
99
+ let mut vals = vec ! [ 1 , 2 , 3 ] ;
100
+ let mut iter = Generic1 {
101
+ items : vals. clone ( ) ,
102
+ } ;
103
+
104
+ assert_iter ( & mut iter, & vals. iter_mut ( ) . collect :: < Vec < _ > > ( ) ) ;
105
+ assert_iter ( & iter, & vals. iter ( ) . collect :: < Vec < _ > > ( ) ) ;
106
+ assert_iter ( iter, & vals) ;
107
+ }
108
+
109
+ #[ derive( IntoIterator ) ]
110
+ struct Generic2 < ' a , T , U : Send >
111
+ where
112
+ T : Send ,
113
+ {
114
+ #[ into_iterator( owned, ref, ref_mut) ]
115
+ items : Vec < T > ,
116
+ useless : & ' a U ,
117
+ }
118
+
119
+ #[ test]
120
+ fn generic_bounds ( ) {
121
+ let mut vals = vec ! [ 1 , 2 , 3 ] ;
122
+ let useless = false ;
123
+ let mut iter = Generic2 {
124
+ items : vals. clone ( ) ,
125
+ useless : & useless,
126
+ } ;
127
+
128
+ assert_iter ( & mut iter, & vals. iter_mut ( ) . collect :: < Vec < _ > > ( ) ) ;
129
+ assert_iter ( & iter, & vals. iter ( ) . collect :: < Vec < _ > > ( ) ) ;
130
+ assert_iter ( iter, & vals) ;
131
+ }
132
+
133
+ #[ derive( IntoIterator ) ]
134
+ struct Generic3 < ' a , ' b , T > {
135
+ #[ into_iterator( owned) ]
136
+ items : & ' a mut Vec < & ' b mut T > ,
137
+ }
138
+
139
+ #[ test]
140
+ fn generic_refs ( ) {
141
+ let mut numbers = vec ! [ 1 , 2 , 3 ] ;
142
+ let mut numbers2 = numbers. clone ( ) ;
143
+
144
+ let mut number_refs = numbers. iter_mut ( ) . collect :: < Vec < _ > > ( ) ;
145
+ let mut number_refs2 = numbers2. iter_mut ( ) . collect :: < Vec < _ > > ( ) ;
146
+
147
+ assert_iter (
148
+ Generic3 {
149
+ items : & mut number_refs,
150
+ } ,
151
+ & number_refs2. iter_mut ( ) . collect :: < Vec < _ > > ( ) ,
152
+ )
153
+ }
154
+
155
+ #[ derive( IntoIterator ) ]
156
+ struct Generic4 < T > {
157
+ #[ into_iterator]
158
+ items : Vec < T > ,
159
+ useless : bool ,
160
+ }
161
+
162
+ #[ test]
163
+ fn generic_owned ( ) {
164
+ let numbers = vec ! [ 1 , 2 , 3 ] ;
165
+
166
+ assert_iter (
167
+ Generic4 {
168
+ items : numbers. clone ( ) ,
169
+ useless : true ,
170
+ } ,
171
+ & numbers,
172
+ ) ;
173
+ }
0 commit comments