@@ -182,16 +182,39 @@ public static IEnumerable<ITestData> GetEarlyExitBenchmarkData(int warmupSampleC
182182 Enumerable . Range ( 501 , benchmarkSize ) . ToArray ( ) ,
183183 GeneratorFunction . None , "ValueGreaterThan" ) ;
184184
185+ yield return CreateEarlyExitData ( [ new ValueNotEqualEarlyExit < int > ( 500 ) ] ,
186+ Enumerable . Repeat ( 500 , benchmarkSize ) . ToArray ( ) ,
187+ Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => x >= 500 ? x + 1 : x ) . ToArray ( ) ,
188+ GeneratorFunction . None , "ValueNotEqual" ) ;
189+
185190 yield return CreateEarlyExitData ( [ new ValueInRangeEarlyExit < int > ( 400 , 600 ) ] ,
186191 Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => x % 401 ) . ToArray ( ) ,
187192 Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => 401 + ( x % 199 ) ) . ToArray ( ) ,
188193 GeneratorFunction . None , "ValueInRange" ) ;
189194
195+ ValueLessThanEarlyExit < int > valueLowerBound = new ValueLessThanEarlyExit < int > ( 400 ) ;
196+ ValueGreaterThanEarlyExit < int > valueUpperBound = new ValueGreaterThanEarlyExit < int > ( 600 ) ;
197+ yield return CreateEarlyExitData ( [ new ValueOutOfRangeEarlyExit < int > ( 400 , 600 , valueLowerBound . KeyspaceSize , valueUpperBound . KeyspaceSize ) ] ,
198+ Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => 400 + ( x % 201 ) ) . ToArray ( ) ,
199+ Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => x % 2 == 0 ? x % 400 : 601 + x ) . ToArray ( ) ,
200+ GeneratorFunction . None , "ValueOutOfRange" ) ;
201+
190202 yield return CreateEarlyExitData ( [ new ValueBitMaskEarlyExit ( 0x00FF00ul ) ] ,
191203 Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => x % 256 ) . ToArray ( ) ,
192204 Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => 256 + x ) . ToArray ( ) ,
193205 GeneratorFunction . None , "ValueBitMask" ) ;
194206
207+ const ulong missingEvenOffsets = 0x5555555555555555ul ;
208+ yield return CreateEarlyExitData ( [ new ValueBitSetEarlyExit < int > ( 500 , 563 , missingEvenOffsets ) ] ,
209+ Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => 501 + ( ( x % 32 ) * 2 ) ) . ToArray ( ) ,
210+ Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => 500 + ( ( x % 32 ) * 2 ) ) . ToArray ( ) ,
211+ GeneratorFunction . None , "ValueBitSet" ) ;
212+
213+ yield return CreateEarlyExitData ( [ new ValueLowByteBitmapEarlyExit ( 0x00000000FFFFFFFFul , 0 , 0 , 0 ) ] ,
214+ Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => x % 32 ) . ToArray ( ) ,
215+ Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => 32 + ( x % 224 ) ) . ToArray ( ) ,
216+ GeneratorFunction . None , "ValueLowByteBitmap" ) ;
217+
195218 // --- Individual string exits ---
196219
197220 int stringSize = Math . Min ( benchmarkSize , 200 ) ;
@@ -207,6 +230,21 @@ public static IEnumerable<ITestData> GetEarlyExitBenchmarkData(int warmupSampleC
207230 Enumerable . Range ( 1 , stringSize ) . Select ( x => new string ( 'b' , x + 10 ) ) . ToArray ( ) ,
208231 GeneratorFunction . Length , "LengthGreaterThan" ) ;
209232
233+ yield return CreateEarlyExitData ( [ new LengthNotEqualEarlyExit ( 8 ) ] ,
234+ Enumerable . Repeat ( new string ( 'a' , 8 ) , stringSize ) . ToArray ( ) ,
235+ Enumerable . Range ( 0 , stringSize ) . Select ( x => new string ( 'b' , ( x % 7 ) + 1 ) ) . ToArray ( ) ,
236+ GeneratorFunction . Length , "LengthNotEqual" ) ;
237+
238+ yield return CreateEarlyExitData ( [ new LengthInRangeEarlyExit ( 5 , 10 ) ] ,
239+ Enumerable . Range ( 0 , stringSize ) . Select ( x => new string ( 'a' , x % 2 == 0 ? 5 : 10 ) ) . ToArray ( ) ,
240+ Enumerable . Range ( 0 , stringSize ) . Select ( x => new string ( 'b' , 6 + ( x % 4 ) ) ) . ToArray ( ) ,
241+ GeneratorFunction . Length , "LengthInRange" ) ;
242+
243+ yield return CreateEarlyExitData ( [ new LengthOutOfRangeEarlyExit ( 5 , 15 ) ] ,
244+ Enumerable . Range ( 0 , stringSize ) . Select ( x => new string ( 'a' , 5 + ( x % 11 ) ) ) . ToArray ( ) ,
245+ Enumerable . Range ( 0 , stringSize ) . Select ( x => new string ( 'b' , x % 2 == 0 ? 4 : 16 ) ) . ToArray ( ) ,
246+ GeneratorFunction . Length , "LengthOutOfRange" ) ;
247+
210248 ulong lengthBitmap = ( 1ul << 2 ) | ( 1ul << 4 ) | ( 1ul << 6 ) | ( 1ul << 8 ) ;
211249 yield return CreateEarlyExitData ( [ new LengthBitmapEarlyExit ( lengthBitmap ) ] ,
212250 Enumerable . Range ( 0 , stringSize ) . Select ( x => new string ( 'a' , new [ ] { 3 , 5 , 7 , 9 } [ x % 4 ] ) ) . ToArray ( ) ,
@@ -220,17 +258,42 @@ public static IEnumerable<ITestData> GetEarlyExitBenchmarkData(int warmupSampleC
220258 Enumerable . Range ( 0 , stringSize ) . Select ( x => ( char ) ( 'g' + ( x % 20 ) ) + "test" ) . ToArray ( ) ,
221259 GeneratorFunction . UnitAt | GeneratorFunction . Length , "UnitAtBitmap" ) ;
222260
223- // --- Combined exits ---
261+ yield return CreateEarlyExitData ( [ new UnitAtLessThanEarlyExit ( 'm' ) ] ,
262+ Enumerable . Range ( 0 , stringSize ) . Select ( x => ( char ) ( 'm' + ( x % 14 ) ) + "test" ) . ToArray ( ) ,
263+ Enumerable . Range ( 0 , stringSize ) . Select ( x => ( char ) ( 'a' + ( x % 12 ) ) + "test" ) . ToArray ( ) ,
264+ GeneratorFunction . UnitAt , "UnitAtLessThan" ) ;
265+
266+ yield return CreateEarlyExitData ( [ new UnitAtGreaterThanEarlyExit ( 'm' ) ] ,
267+ Enumerable . Range ( 0 , stringSize ) . Select ( x => ( char ) ( 'a' + ( x % 13 ) ) + "test" ) . ToArray ( ) ,
268+ Enumerable . Range ( 0 , stringSize ) . Select ( x => ( char ) ( 'n' + ( x % 13 ) ) + "test" ) . ToArray ( ) ,
269+ GeneratorFunction . UnitAt , "UnitAtGreaterThan" ) ;
270+
271+ yield return CreateEarlyExitData ( [ new UnitAtNotEqualEarlyExit ( 'm' , false ) ] ,
272+ Enumerable . Repeat ( "mtest" , stringSize ) . ToArray ( ) ,
273+ Enumerable . Range ( 0 , stringSize ) . Select ( x => ( char ) ( 'a' + ( x % 12 ) ) + "test" ) . ToArray ( ) ,
274+ GeneratorFunction . UnitAt , "UnitAtNotEqual" ) ;
275+
276+ yield return CreateEarlyExitData ( [ new UnitAtInRangeEarlyExit ( 'd' , 'm' ) ] ,
277+ Enumerable . Range ( 0 , stringSize ) . Select ( x => ( x % 2 == 0 ? 'd' : 'm' ) + "test" ) . ToArray ( ) ,
278+ Enumerable . Range ( 0 , stringSize ) . Select ( x => ( char ) ( 'e' + ( x % 8 ) ) + "test" ) . ToArray ( ) ,
279+ GeneratorFunction . UnitAt , "UnitAtInRange" ) ;
280+
281+ yield return CreateEarlyExitData ( [ new UnitAtOutOfRangeEarlyExit ( 'd' , 'm' ) ] ,
282+ Enumerable . Range ( 0 , stringSize ) . Select ( x => ( char ) ( 'd' + ( x % 10 ) ) + "test" ) . ToArray ( ) ,
283+ Enumerable . Range ( 0 , stringSize ) . Select ( x => ( x % 2 == 0 ? 'c' : 'n' ) + "test" ) . ToArray ( ) ,
284+ GeneratorFunction . UnitAt , "UnitAtOutOfRange" ) ;
285+
286+ yield return CreateEarlyExitData ( [ new EqualsAtEarlyExit ( "pre" , 0 , false ) ] ,
287+ Enumerable . Range ( 0 , stringSize ) . Select ( x => $ "pre{ x } ") . ToArray ( ) ,
288+ Enumerable . Range ( 0 , stringSize ) . Select ( x => $ "other{ x } ") . ToArray ( ) ,
289+ GeneratorFunction . EqualsAt , "EqualsAt" ) ;
290+
291+ yield return CreateEarlyExitData ( [ new IsAsciiOnlyEarlyExit ( ) ] ,
292+ Enumerable . Range ( 0 , stringSize ) . Select ( x => $ "ascii-{ x } ") . ToArray ( ) ,
293+ Enumerable . Range ( 0 , stringSize ) . Select ( x => $ "non-ascii-\u00e9 -{ x } ") . ToArray ( ) ,
294+ GeneratorFunction . IsAsciiOnly , "IsAsciiOnly" ) ;
224295
225- yield return CreateEarlyExitData ( [ new ValueLessThanEarlyExit < int > ( 100 ) , new ValueGreaterThanEarlyExit < int > ( 900 ) ] ,
226- Enumerable . Range ( 100 , 801 ) . Take ( benchmarkSize ) . ToArray ( ) ,
227- Enumerable . Range ( 0 , benchmarkSize ) . Select ( x => x < benchmarkSize / 2 ? x % 100 : 901 + ( x % 100 ) ) . ToArray ( ) ,
228- GeneratorFunction . None , "ValueLessThan_ValueGreaterThan" ) ;
229-
230- yield return CreateEarlyExitData ( [ new LengthLessThanEarlyExit ( 5 ) , new LengthGreaterThanEarlyExit ( 15 ) ] ,
231- Enumerable . Range ( 0 , stringSize ) . Select ( x => new string ( 'a' , ( x % 11 ) + 5 ) ) . ToArray ( ) ,
232- Enumerable . Range ( 0 , stringSize ) . Select ( x => x % 2 == 0 ? new string ( 'b' , ( x % 4 ) + 1 ) : new string ( 'b' , ( x % 10 ) + 16 ) ) . ToArray ( ) ,
233- GeneratorFunction . Length , "LengthLessThan_LengthGreaterThan" ) ;
296+ // --- Combined exits ---
234297
235298 yield return CreateEarlyExitData ( [ new LengthLessThanEarlyExit ( 3 ) , new UnitAtBitmapEarlyExit ( 0ul , charBitmapHigh , false ) ] ,
236299 Enumerable . Range ( 0 , stringSize ) . Select ( x => ( char ) ( 'a' + ( x % 6 ) ) + new string ( 'x' , ( x % 10 ) + 2 ) ) . ToArray ( ) ,
0 commit comments