@@ -9,7 +9,7 @@ use crate::{CheckCtx, FloatExt, MathOp, test_log};
99
1010/// Generate a sequence of edge cases, e.g. numbers near zeroes and infiniteis.
1111pub 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 ) ;
1313}
1414
1515/// Create a list of values around interesting points (infinities, zeroes, NaNs).
@@ -140,32 +140,32 @@ macro_rules! impl_edge_case_input {
140140 where
141141 Op : MathOp <RustArgs = Self , FTy = $fty>,
142142 {
143- fn get_cases( ctx: & CheckCtx ) -> impl ExactSizeIterator <Item = Self > {
143+ fn get_cases( ctx: & CheckCtx ) -> ( impl Iterator <Item = Self >, u64 ) {
144144 let ( iter0, steps0) = float_edge_cases:: <Op >( ctx, 0 ) ;
145145 let iter0 = iter0. map( |v| ( v, ) ) ;
146- KnownSize :: new ( iter0, steps0)
146+ ( iter0, steps0)
147147 }
148148 }
149149
150150 impl <Op > EdgeCaseInput <Op > for ( $fty, $fty)
151151 where
152152 Op : MathOp <RustArgs = Self , FTy = $fty>,
153153 {
154- fn get_cases( ctx: & CheckCtx ) -> impl ExactSizeIterator <Item = Self > {
154+ fn get_cases( ctx: & CheckCtx ) -> ( impl Iterator <Item = Self >, u64 ) {
155155 let ( iter0, steps0) = float_edge_cases:: <Op >( ctx, 0 ) ;
156156 let ( iter1, steps1) = float_edge_cases:: <Op >( ctx, 1 ) ;
157157 let iter =
158158 iter0. flat_map( move |first| iter1. clone( ) . map( move |second| ( first, second) ) ) ;
159159 let count = steps0. checked_mul( steps1) . unwrap( ) ;
160- KnownSize :: new ( iter, count)
160+ ( iter, count)
161161 }
162162 }
163163
164164 impl <Op > EdgeCaseInput <Op > for ( $fty, $fty, $fty)
165165 where
166166 Op : MathOp <RustArgs = Self , FTy = $fty>,
167167 {
168- fn get_cases( ctx: & CheckCtx ) -> impl ExactSizeIterator <Item = Self > {
168+ fn get_cases( ctx: & CheckCtx ) -> ( impl Iterator <Item = Self >, u64 ) {
169169 let ( iter0, steps0) = float_edge_cases:: <Op >( ctx, 0 ) ;
170170 let ( iter1, steps1) = float_edge_cases:: <Op >( ctx, 1 ) ;
171171 let ( iter2, steps2) = float_edge_cases:: <Op >( ctx, 2 ) ;
@@ -177,39 +177,39 @@ macro_rules! impl_edge_case_input {
177177 } ) ;
178178 let count = steps0. checked_mul( steps1) . unwrap( ) . checked_mul( steps2) . unwrap( ) ;
179179
180- KnownSize :: new ( iter, count)
180+ ( iter, count)
181181 }
182182 }
183183
184184 impl <Op > EdgeCaseInput <Op > for ( i32 , $fty)
185185 where
186186 Op : MathOp <RustArgs = Self , FTy = $fty>,
187187 {
188- fn get_cases( ctx: & CheckCtx ) -> impl ExactSizeIterator <Item = Self > {
188+ fn get_cases( ctx: & CheckCtx ) -> ( impl Iterator <Item = Self >, u64 ) {
189189 let ( iter0, steps0) = int_edge_cases( ctx, 0 ) ;
190190 let ( iter1, steps1) = float_edge_cases:: <Op >( ctx, 1 ) ;
191191
192192 let iter =
193193 iter0. flat_map( move |first| iter1. clone( ) . map( move |second| ( first, second) ) ) ;
194194 let count = steps0. checked_mul( steps1) . unwrap( ) ;
195195
196- KnownSize :: new ( iter, count)
196+ ( iter, count)
197197 }
198198 }
199199
200200 impl <Op > EdgeCaseInput <Op > for ( $fty, i32 )
201201 where
202202 Op : MathOp <RustArgs = Self , FTy = $fty>,
203203 {
204- fn get_cases( ctx: & CheckCtx ) -> impl ExactSizeIterator <Item = Self > {
204+ fn get_cases( ctx: & CheckCtx ) -> ( impl Iterator <Item = Self >, u64 ) {
205205 let ( iter0, steps0) = float_edge_cases:: <Op >( ctx, 0 ) ;
206206 let ( iter1, steps1) = int_edge_cases( ctx, 1 ) ;
207207
208208 let iter =
209209 iter0. flat_map( move |first| iter1. clone( ) . map( move |second| ( first, second) ) ) ;
210210 let count = steps0. checked_mul( steps1) . unwrap( ) ;
211211
212- KnownSize :: new ( iter, count)
212+ ( iter, count)
213213 }
214214 }
215215 } ;
@@ -224,10 +224,13 @@ impl_edge_case_input!(f128);
224224
225225pub fn get_test_cases < Op > (
226226 ctx : & CheckCtx ,
227- ) -> impl ExactSizeIterator < Item = Op :: RustArgs > + use < ' _ , Op >
227+ ) -> ( impl Iterator < Item = Op :: RustArgs > + Send + use < ' _ , Op > , u64 )
228228where
229229 Op : MathOp ,
230230 Op :: RustArgs : EdgeCaseInput < Op > ,
231231{
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)
233236}
0 commit comments