|
8 | 8 | # define EXPAND(...) __VA_ARGS__ |
9 | 9 | # define OBSTRUCT_INDIRECT() OBSTRUCT |
10 | 10 |
|
11 | | -// On Clang/GNU compilers, ", ## __VA_ARGS__" will result in an empty |
12 | | -// token if __VA_ARGS__ is empty. This is not True for MSVC. |
13 | | -// #define EAT_COMMA(...) , ## __VA_ARGS__ |
14 | | -// #define APPEND_VA_ARGS(x, ...) x EAT_COMMA(__VA_ARGS__) |
15 | | - |
| 11 | +#if defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL |
16 | 12 | #define APPEND_VA_ARGS_1(x, ...) x |
17 | 13 | #define APPEND_VA_ARGS_0(x, ...) x, __VA_ARGS__ |
18 | 14 | #define APPEND_VA_ARGS(x, ...) \ |
19 | 15 | IF_FUNC(IS_EMPTY(__VA_ARGS__), APPEND_VA_ARGS_)(x, __VA_ARGS__) |
20 | | - |
| 16 | +#else |
| 17 | +// On Clang/GNU compilers, ", ## __VA_ARGS__" will result in an empty |
| 18 | +// token if __VA_ARGS__ is empty. This is not True for MSVC unless |
| 19 | +// /Zc:preprocessor set |
| 20 | +#define EAT_COMMA(...) , ## __VA_ARGS__ |
| 21 | +#define APPEND_VA_ARGS(x, ...) x EAT_COMMA(__VA_ARGS__) |
| 22 | +#endif |
21 | 23 |
|
22 | 24 | #define NARGS_ARG_N_(...) NARGS_ARG_N(__VA_ARGS__) |
23 | 25 |
|
|
367 | 369 | #endif // VALUE_SET_VAL_MEMBERS |
368 | 370 |
|
369 | 371 |
|
| 372 | +#define LESSEQ_0 1 |
| 373 | +#define LESSEQ_1 0 |
| 374 | +#define LESSEQ(A, B) IF_FUNC(SUBTRACT(A, B), LESSEQ_) |
| 375 | +#define GREATEREQ_0 1 |
| 376 | +#define GREATEREQ_1 0 |
| 377 | +#define GREATEREQ(A, B) IF_FUNC(SUBTRACT(B, A), GREATEREQ_) |
| 378 | +#define EQUAL(A, B) AND(LESSEQ(A, B), GREATEREQ(A, B)) |
370 | 379 | #define ADD(N, M) EVAL(ADD_(N, M)) |
371 | 380 | #define ADD_(N, M) NEST(M, INC, N) |
372 | 381 | #define SUBTRACT(N, M) EVAL(SUBTRACT_(N, M)) |
|
414 | 423 | #define NARGS_ALT(...) NARGS_ALT_(__VA_ARGS__) |
415 | 424 | #define NARGS(...) NARGS_ALT(__VA_ARGS__) |
416 | 425 |
|
| 426 | +// #if defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL |
| 427 | +// #else |
| 428 | +// #define NARGS(...) NARGS_DIRECT(__VA_ARGS__) |
| 429 | +// #endif |
| 430 | + |
417 | 431 | #define FIRST_ARG(a, ...) a |
418 | 432 | #define FIRST_ARG_DEFERED() FIRST_ARG |
419 | 433 | #define FIRST_ARG_PACKED(args) FIRST_ARG args |
@@ -600,6 +614,33 @@ MACRO_TEST(OR, 1, OR(1, )); |
600 | 614 | MACRO_TEST(OR, 1, OR(, 1)); |
601 | 615 | MACRO_TEST(OR, 0, OR(, )); |
602 | 616 |
|
| 617 | +MACRO_TEST(ADD, 2, ADD(1, 1)); |
| 618 | +MACRO_TEST(ADD, 15, ADD(10, 5)); |
| 619 | + |
| 620 | +MACRO_TEST(SUBTRACT, 1, SUBTRACT(2, 1)); |
| 621 | +MACRO_TEST(SUBTRACT, 0, SUBTRACT(1, 2)); |
| 622 | +MACRO_TEST(SUBTRACT, 10, SUBTRACT(15, 5)); |
| 623 | +MACRO_TEST(SUBTRACT, 0, SUBTRACT(15, 15)); |
| 624 | + |
| 625 | +MACRO_TEST(LESSEQ, 1, LESSEQ(0, 1)); |
| 626 | +MACRO_TEST(LESSEQ, 1, LESSEQ(0, 0)); |
| 627 | +MACRO_TEST(LESSEQ, 0, LESSEQ(1, 0)); |
| 628 | +MACRO_TEST(LESSEQ, 1, LESSEQ(15, 20)); |
| 629 | +MACRO_TEST(LESSEQ, 0, LESSEQ(20, 15)); |
| 630 | + |
| 631 | +MACRO_TEST(GREATEREQ, 0, GREATEREQ(0, 1)); |
| 632 | +MACRO_TEST(GREATEREQ, 1, GREATEREQ(0, 0)); |
| 633 | +MACRO_TEST(GREATEREQ, 1, GREATEREQ(1, 0)); |
| 634 | +MACRO_TEST(GREATEREQ, 0, GREATEREQ(15, 20)); |
| 635 | +MACRO_TEST(GREATEREQ, 1, GREATEREQ(20, 15)); |
| 636 | + |
| 637 | +MACRO_TEST(EQUAL, 1, EQUAL(1, 1)); |
| 638 | +MACRO_TEST(EQUAL, 1, EQUAL(0, 0)); |
| 639 | +MACRO_TEST(EQUAL, 1, EQUAL(15, 15)); |
| 640 | +MACRO_TEST(EQUAL, 0, EQUAL(1, 0)); |
| 641 | +MACRO_TEST(EQUAL, 0, EQUAL(15, 20)); |
| 642 | +MACRO_TEST(EQUAL, 0, EQUAL(20, 15)); |
| 643 | + |
603 | 644 | MACRO_TEST(HAS_PARENS, 0, HAS_PARENS(A, B, C)); |
604 | 645 | MACRO_TEST(HAS_PARENS, 1, HAS_PARENS((A))); |
605 | 646 | MACRO_TEST(HAS_PARENS, 1, HAS_PARENS((A, B, C))); |
@@ -657,38 +698,39 @@ MACRO_TEST(IS_LESS_THAN_NARGS_N, 0, IS_LESS_THAN_NARGS_N(1, A, B, C)); |
657 | 698 | MACRO_TEST(IS_LESS_THAN_NARGS_N, 1, IS_LESS_THAN_NARGS_N(4, A, B, C)); |
658 | 699 | MACRO_TEST(IS_LESS_THAN_NARGS_N, 0, IS_LESS_THAN_NARGS_N(3, A, B, C)); |
659 | 700 | MACRO_TEST(IS_LESS_THAN_NARGS_N, 1, IS_LESS_THAN_NARGS_N(2, )); |
| 701 | +MACRO_TEST(IS_LESS_THAN_NARGS_N, 0, IS_LESS_THAN_NARGS_N(1, )); |
660 | 702 |
|
661 | 703 | MACRO_TEST(IS_MORE_THAN_NARGS_N, 1, IS_MORE_THAN_NARGS_N(1, A, B, C)); |
662 | 704 | MACRO_TEST(IS_MORE_THAN_NARGS_N, 0, IS_MORE_THAN_NARGS_N(4, A, B, C)); |
663 | 705 |
|
664 | | -MACRO_TEST(FOR_EACH, A, FOR_EACH(PASS_THROUGH, A)); |
665 | | -MACRO_TEST(FOR_EACH, PACK_MACRO(A; B; C), FOR_EACH(PASS_THROUGH, A, B, C)); |
666 | | -MACRO_TEST(FOR_EACH_COMMA, (A), ADD_PARENS(FOR_EACH_COMMA(PASS_THROUGH, A))); |
667 | | -MACRO_TEST(FOR_EACH_COMMA, (A, B, C), ADD_PARENS(FOR_EACH_COMMA(PASS_THROUGH, A, B, C))); |
| 706 | +MACRO_TEST(FOR_EACH, 15, FOR_EACH(PASS_THROUGH, 15)); |
| 707 | +MACRO_TEST_NOEQ(FOR_EACH, PACK_MACRO(A; B; C), FOR_EACH(PASS_THROUGH, A, B, C)); |
| 708 | +MACRO_TEST_NOEQ(FOR_EACH_COMMA, (A), ADD_PARENS(FOR_EACH_COMMA(PASS_THROUGH, A))); |
| 709 | +MACRO_TEST_NOEQ(FOR_EACH_COMMA, (A, B, C), ADD_PARENS(FOR_EACH_COMMA(PASS_THROUGH, A, B, C))); |
668 | 710 |
|
669 | | -MACRO_TEST(GET_ARG_N_BEFORE_END, A, GET_ARG_N_BEFORE_END(2, A, B, C)); |
670 | | -MACRO_TEST(GET_ARG_N_BEFORE_END, B, GET_ARG_N_BEFORE_END(1, A, B, C)); |
671 | | -MACRO_TEST(GET_ARG_N_BEFORE_END, C, GET_ARG_N_BEFORE_END(0, A, B, C)); |
672 | | -MACRO_TEST(GET_ARG_N_BEFORE_END, , GET_ARG_N_BEFORE_END(0, A, B, )); |
| 711 | +MACRO_TEST_NOEQ(GET_ARG_N_BEFORE_END, A, GET_ARG_N_BEFORE_END(2, A, B, C)); |
| 712 | +MACRO_TEST_NOEQ(GET_ARG_N_BEFORE_END, B, GET_ARG_N_BEFORE_END(1, A, B, C)); |
| 713 | +MACRO_TEST_NOEQ(GET_ARG_N_BEFORE_END, C, GET_ARG_N_BEFORE_END(0, A, B, C)); |
| 714 | +MACRO_TEST_NOEQ(GET_ARG_N_BEFORE_END, , GET_ARG_N_BEFORE_END(0, A, B, )); |
673 | 715 |
|
674 | | -MACRO_TEST(LAST_ARG, C, LAST_ARG(A, B, C)); |
675 | | -MACRO_TEST(LAST_ARG, , LAST_ARG(A, B, )); |
| 716 | +MACRO_TEST_NOEQ(LAST_ARG, C, LAST_ARG(A, B, C)); |
| 717 | +MACRO_TEST_NOEQ(LAST_ARG, , LAST_ARG(A, B, )); |
676 | 718 |
|
677 | 719 | MACRO_TEST(IS_SPACE_ARG_N, 0, IS_SPACE_ARG_N(0, A)); |
678 | 720 | MACRO_TEST(IS_SPACE_ARG_N, 1, IS_SPACE_ARG_N(0, )); |
679 | 721 | MACRO_TEST(IS_SPACE_ARG_N, 1, IS_SPACE_ARG_N(124, B)); |
680 | 722 |
|
681 | | -MACRO_TEST(GET_ARGS_AFTER, PACK_MACRO(B, C), |
682 | | - EVAL(GET_ARGS_AFTER_N(1, A, B, C))); |
683 | | -MACRO_TEST(GET_ARGS_AFTER, |
684 | | - PACK_MACRO(_11, _12, _13), |
685 | | - EVAL(GET_ARGS_AFTER_N(10, _1, _2, _3, _4, _5, _6, _7, _8, _9, |
686 | | - _10, _11, _12, _13))); |
687 | | -MACRO_TEST(GET_ARGS_AFTER, |
688 | | - PACK_MACRO(_16, _17, _18, _19, _20), |
689 | | - EVAL(GET_ARGS_AFTER_N(15, _1, _2, _3, _4, _5, _6, _7, _8, _9, |
| 723 | +MACRO_TEST_EVAL(GET_ARGS_AFTER, PACK_MACRO(B, C), |
| 724 | + GET_ARGS_AFTER_N(1, A, B, C)); |
| 725 | +MACRO_TEST_EVAL(GET_ARGS_AFTER, |
| 726 | + PACK_MACRO(_11, _12, _13), |
| 727 | + GET_ARGS_AFTER_N(10, _1, _2, _3, _4, _5, _6, _7, _8, _9, |
| 728 | + _10, _11, _12, _13)); |
| 729 | +MACRO_TEST_EVAL(GET_ARGS_AFTER, |
| 730 | + PACK_MACRO(_16, _17, _18, _19, _20), |
| 731 | + GET_ARGS_AFTER_N(15, _1, _2, _3, _4, _5, _6, _7, _8, _9, |
690 | 732 | _10, _11, _12, _13, _14, _15, _16, _17, |
691 | | - _18, _19, _20))); |
| 733 | + _18, _19, _20)); |
692 | 734 |
|
693 | 735 | #define TEST_ARG_NODEF (const double&, val, ) |
694 | 736 | #define TEST_ARG_DEF (bool, includePrefixes, false) |
|
0 commit comments