@@ -9,7 +9,7 @@ use crate::{CheckCtx, FloatExt, MathOp, test_log};
9
9
10
10
/// Generate a sequence of edge cases, e.g. numbers near zeroes and infiniteis.
11
11
pub trait EdgeCaseInput < Op > {
12
- fn get_cases ( ctx : & CheckCtx ) -> impl ExactSizeIterator < Item = Self > + Send ;
12
+ fn get_cases ( ctx : & CheckCtx ) -> ( impl Iterator < Item = Self > + Send , u64 ) ;
13
13
}
14
14
15
15
/// Create a list of values around interesting points (infinities, zeroes, NaNs).
@@ -140,32 +140,32 @@ macro_rules! impl_edge_case_input {
140
140
where
141
141
Op : MathOp <RustArgs = Self , FTy = $fty>,
142
142
{
143
- fn get_cases( ctx: & CheckCtx ) -> impl ExactSizeIterator <Item = Self > {
143
+ fn get_cases( ctx: & CheckCtx ) -> ( impl Iterator <Item = Self >, u64 ) {
144
144
let ( iter0, steps0) = float_edge_cases:: <Op >( ctx, 0 ) ;
145
145
let iter0 = iter0. map( |v| ( v, ) ) ;
146
- KnownSize :: new ( iter0, steps0)
146
+ ( iter0, steps0)
147
147
}
148
148
}
149
149
150
150
impl <Op > EdgeCaseInput <Op > for ( $fty, $fty)
151
151
where
152
152
Op : MathOp <RustArgs = Self , FTy = $fty>,
153
153
{
154
- fn get_cases( ctx: & CheckCtx ) -> impl ExactSizeIterator <Item = Self > {
154
+ fn get_cases( ctx: & CheckCtx ) -> ( impl Iterator <Item = Self >, u64 ) {
155
155
let ( iter0, steps0) = float_edge_cases:: <Op >( ctx, 0 ) ;
156
156
let ( iter1, steps1) = float_edge_cases:: <Op >( ctx, 1 ) ;
157
157
let iter =
158
158
iter0. flat_map( move |first| iter1. clone( ) . map( move |second| ( first, second) ) ) ;
159
159
let count = steps0. checked_mul( steps1) . unwrap( ) ;
160
- KnownSize :: new ( iter, count)
160
+ ( iter, count)
161
161
}
162
162
}
163
163
164
164
impl <Op > EdgeCaseInput <Op > for ( $fty, $fty, $fty)
165
165
where
166
166
Op : MathOp <RustArgs = Self , FTy = $fty>,
167
167
{
168
- fn get_cases( ctx: & CheckCtx ) -> impl ExactSizeIterator <Item = Self > {
168
+ fn get_cases( ctx: & CheckCtx ) -> ( impl Iterator <Item = Self >, u64 ) {
169
169
let ( iter0, steps0) = float_edge_cases:: <Op >( ctx, 0 ) ;
170
170
let ( iter1, steps1) = float_edge_cases:: <Op >( ctx, 1 ) ;
171
171
let ( iter2, steps2) = float_edge_cases:: <Op >( ctx, 2 ) ;
@@ -177,39 +177,39 @@ macro_rules! impl_edge_case_input {
177
177
} ) ;
178
178
let count = steps0. checked_mul( steps1) . unwrap( ) . checked_mul( steps2) . unwrap( ) ;
179
179
180
- KnownSize :: new ( iter, count)
180
+ ( iter, count)
181
181
}
182
182
}
183
183
184
184
impl <Op > EdgeCaseInput <Op > for ( i32 , $fty)
185
185
where
186
186
Op : MathOp <RustArgs = Self , FTy = $fty>,
187
187
{
188
- fn get_cases( ctx: & CheckCtx ) -> impl ExactSizeIterator <Item = Self > {
188
+ fn get_cases( ctx: & CheckCtx ) -> ( impl Iterator <Item = Self >, u64 ) {
189
189
let ( iter0, steps0) = int_edge_cases( ctx, 0 ) ;
190
190
let ( iter1, steps1) = float_edge_cases:: <Op >( ctx, 1 ) ;
191
191
192
192
let iter =
193
193
iter0. flat_map( move |first| iter1. clone( ) . map( move |second| ( first, second) ) ) ;
194
194
let count = steps0. checked_mul( steps1) . unwrap( ) ;
195
195
196
- KnownSize :: new ( iter, count)
196
+ ( iter, count)
197
197
}
198
198
}
199
199
200
200
impl <Op > EdgeCaseInput <Op > for ( $fty, i32 )
201
201
where
202
202
Op : MathOp <RustArgs = Self , FTy = $fty>,
203
203
{
204
- fn get_cases( ctx: & CheckCtx ) -> impl ExactSizeIterator <Item = Self > {
204
+ fn get_cases( ctx: & CheckCtx ) -> ( impl Iterator <Item = Self >, u64 ) {
205
205
let ( iter0, steps0) = float_edge_cases:: <Op >( ctx, 0 ) ;
206
206
let ( iter1, steps1) = int_edge_cases( ctx, 1 ) ;
207
207
208
208
let iter =
209
209
iter0. flat_map( move |first| iter1. clone( ) . map( move |second| ( first, second) ) ) ;
210
210
let count = steps0. checked_mul( steps1) . unwrap( ) ;
211
211
212
- KnownSize :: new ( iter, count)
212
+ ( iter, count)
213
213
}
214
214
}
215
215
} ;
@@ -224,10 +224,13 @@ impl_edge_case_input!(f128);
224
224
225
225
pub fn get_test_cases < Op > (
226
226
ctx : & CheckCtx ,
227
- ) -> impl ExactSizeIterator < Item = Op :: RustArgs > + use < ' _ , Op >
227
+ ) -> ( impl Iterator < Item = Op :: RustArgs > + Send + use < ' _ , Op > , u64 )
228
228
where
229
229
Op : MathOp ,
230
230
Op :: RustArgs : EdgeCaseInput < Op > ,
231
231
{
232
- Op :: RustArgs :: get_cases ( ctx)
232
+ let ( iter, count) = Op :: RustArgs :: get_cases ( ctx) ;
233
+
234
+ // Wrap in `KnownSize` so we get an assertion if the cuunt is wrong.
235
+ ( KnownSize :: new ( iter, count) , count)
233
236
}
0 commit comments