@@ -254,6 +254,13 @@ static void test_FOR_EACH(void)
254254 zassert_equal (array[0 ], 1 , " Unexpected value %d" , array[0 ]);
255255 zassert_equal (array[1 ], 2 , " Unexpected value %d" , array[1 ]);
256256 zassert_equal (array[2 ], 3 , " Unexpected value %d" , array[2 ]);
257+
258+ buf = array;
259+ FAST_FOR_EACH (FOR_EACH_MACRO_TEST, (;), 4 , 5 , 6 );
260+
261+ zassert_equal (array[0 ], 4 , " Unexpected value %d" , array[0 ]);
262+ zassert_equal (array[1 ], 5 , " Unexpected value %d" , array[1 ]);
263+ zassert_equal (array[2 ], 6 , " Unexpected value %d" , array[2 ]);
257264}
258265
259266static void test_FOR_EACH_NONEMPTY_TERM (void )
@@ -301,18 +308,28 @@ static void test_FOR_EACH_FIXED_ARG(void)
301308 FOR_EACH_FIXED_ARG (fsum, (;), &sum, 1 , 2 , 3 );
302309
303310 zassert_equal (sum, 6 , " Unexpected value %d" , sum);
311+
312+ sum = 0 ;
313+ FAST_FOR_EACH_FIXED_ARG (fsum, (;), &sum, 10 , 20 , 30 );
314+
315+ zassert_equal (sum, 60 , " Unexpected value %d" , sum);
304316}
305317
306318static void test_FOR_EACH_IDX (void )
307319{
308320 #define FOR_EACH_IDX_MACRO_TEST (n, arg ) uint8_t a##n = arg
321+ #define FAST_FOR_EACH_IDX_MACRO_TEST (n, arg ) uint8_t b##n = arg
309322
310323 FOR_EACH_IDX (FOR_EACH_IDX_MACRO_TEST, (;), 1 , 2 , 3 );
324+ FAST_FOR_EACH_IDX (FAST_FOR_EACH_IDX_MACRO_TEST, (;), 1 , 2 , 3 );
311325
312326 zassert_equal (a0, 1 , " Unexpected value %d" , a0);
313327 zassert_equal (a1, 2 , " Unexpected value %d" , a1);
314328 zassert_equal (a2, 3 , " Unexpected value %d" , a2);
315329
330+ zassert_equal (b0, 3 , " Unexpected value %d" , a0);
331+ zassert_equal (b1, 2 , " Unexpected value %d" , a1);
332+ zassert_equal (b2, 1 , " Unexpected value %d" , a2);
316333 #define FOR_EACH_IDX_MACRO_TEST2 (n, arg ) array[n] = arg
317334 uint8_t array[32 ] = {0 };
318335
@@ -324,13 +341,29 @@ static void test_FOR_EACH_IDX(void)
324341 }
325342 zassert_equal (array[15 ], 0 , " Unexpected value: %d" , array[15 ]);
326343
344+ FAST_FOR_EACH_IDX (FOR_EACH_IDX_MACRO_TEST2, (;),
345+ 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 );
346+ for (int i = 0 ; i < 15 ; i++) {
347+ zassert_equal (array[i], i,
348+ " Unexpected value: %d" , array[i]);
349+ }
350+ zassert_equal (array[15 ], 0 , " Unexpected value: %d" , array[15 ]);
351+
327352 #define FOR_EACH_IDX_MACRO_TEST3 (n, arg ) &a##n
328353
329354 uint8_t *a[] = {
330355 FOR_EACH_IDX (FOR_EACH_IDX_MACRO_TEST3, (,), 1 , 2 , 3 )
331356 };
332357
333358 zassert_equal (ARRAY_SIZE (a), 3 , " Unexpected value:%d" , ARRAY_SIZE (a));
359+
360+ #define FAST_FOR_EACH_IDX_MACRO_TEST3 (n, arg ) &b##n
361+
362+ uint8_t *b[] = {
363+ FAST_FOR_EACH_IDX (FAST_FOR_EACH_IDX_MACRO_TEST3, (,), 1 , 2 , 3 )
364+ };
365+
366+ zassert_equal (ARRAY_SIZE (b), 3 , " Unexpected value:%d" , ARRAY_SIZE (b));
334367}
335368
336369static void test_FOR_EACH_IDX_FIXED_ARG (void )
@@ -344,6 +377,12 @@ static void test_FOR_EACH_IDX_FIXED_ARG(void)
344377 zassert_equal (a0, 1 , " Unexpected value %d" , a0);
345378 zassert_equal (a1, 2 , " Unexpected value %d" , a1);
346379 zassert_equal (a2, 3 , " Unexpected value %d" , a2);
380+
381+ FAST_FOR_EACH_IDX_FIXED_ARG (FOO, (;), b, 1 , 2 , 3 );
382+
383+ zassert_equal (b0, 3 , " Unexpected value %d" , a0);
384+ zassert_equal (b1, 2 , " Unexpected value %d" , a1);
385+ zassert_equal (b2, 1 , " Unexpected value %d" , a2);
347386}
348387
349388static void test_IS_EMPTY (void )
@@ -385,6 +424,12 @@ static void test_nested_FOR_EACH(void)
385424 zassert_equal (a0, 0 , NULL );
386425 zassert_equal (a1, 1 , NULL );
387426 zassert_equal (a2, 2 , NULL );
427+
428+ FAST_FOR_EACH (FOO_2, (;), FAST_FOR_EACH (FOO_1, (,), 3 , 4 , 5 ));
429+
430+ zassert_equal (a3, 3 , NULL );
431+ zassert_equal (a4, 4 , NULL );
432+ zassert_equal (a5, 5 , NULL );
388433}
389434
390435static void test_GET_ARG_N (void )
@@ -396,22 +441,35 @@ static void test_GET_ARG_N(void)
396441 zassert_equal (a, 10 , NULL );
397442 zassert_equal (b, 100 , NULL );
398443 zassert_equal (c, 1000 , NULL );
444+
445+ zassert_equal (FAST_GET_ARG_N (1 , 10 , 100 , 1000 ), 10 , NULL );
446+ zassert_equal (FAST_GET_ARG_N (2 , 10 , 100 , 1000 ), 100 , NULL );
447+ zassert_equal (FAST_GET_ARG_N (3 , 10 , 100 , 1000 ), 1000 , NULL );
399448}
400449
401450static void test_GET_ARGS_LESS_N (void )
402451{
403452 uint8_t a[] = { GET_ARGS_LESS_N (0 , 1 , 2 , 3 ) };
404453 uint8_t b[] = { GET_ARGS_LESS_N (1 , 1 , 2 , 3 ) };
405454 uint8_t c[] = { GET_ARGS_LESS_N (2 , 1 , 2 , 3 ) };
455+ uint8_t a2[] = { FAST_GET_ARGS_LESS_N (0 , 1 , 2 , 3 ) };
456+ uint8_t b2[] = { FAST_GET_ARGS_LESS_N (1 , 1 , 2 , 3 ) };
457+ uint8_t c2[] = { FAST_GET_ARGS_LESS_N (2 , 1 , 2 , 3 ) };
406458
407459 zassert_equal (sizeof (a), 3 , NULL );
460+ zassert_equal (sizeof (a2), 3 , NULL );
408461
409462 zassert_equal (sizeof (b), 2 , NULL );
463+ zassert_equal (sizeof (b2), 2 , NULL );
410464 zassert_equal (b[0 ], 2 , NULL );
411465 zassert_equal (b[1 ], 3 , NULL );
466+ zassert_equal (b2[0 ], 2 , NULL );
467+ zassert_equal (b2[1 ], 3 , NULL );
412468
413469 zassert_equal (sizeof (c), 1 , NULL );
470+ zassert_equal (sizeof (c2), 1 , NULL );
414471 zassert_equal (c[0 ], 3 , NULL );
472+ zassert_equal (c2[0 ], 3 , NULL );
415473}
416474
417475static void test_mixing_GET_ARG_and_FOR_EACH (void )
0 commit comments