From 1f7e193c64cc8ef78b3921e4821de792b8d8ca32 Mon Sep 17 00:00:00 2001 From: Nana Sakisaka <1901813+saki7@users.noreply.github.com> Date: Fri, 9 Oct 2026 05:50:33 +0900 Subject: [PATCH 1/2] Add `IRIS_PP_SEQ_ENUM` and `IRIS_PP_VARIADIC_SEQ_TO_SEQ` --- include/iris/pp/seq.hpp | 42 +++++++++++++++++++++++++++++++++++++++++ test/preprocess.cpp | 10 ++++++++++ 2 files changed, 52 insertions(+) diff --git a/include/iris/pp/seq.hpp b/include/iris/pp/seq.hpp index e8a9364..cd91233 100644 --- a/include/iris/pp/seq.hpp +++ b/include/iris/pp/seq.hpp @@ -17,6 +17,14 @@ #define IRIS_PP_SEQ_SIZE(seq) IRIS_PP_CAT(IRIS_ZZ_PP_SEQ_SIZE_I_, IRIS_ZZ_PP_SEQ_SIZE_I_0 seq) +#define IRIS_PP_SEQ_ENUM(seq) IRIS_PP_CAT(IRIS_ZZ_PP_SEQ_ENUM_I_, IRIS_PP_SEQ_SIZE(seq)) seq + +#define IRIS_PP_VARIADIC_SEQ_TO_SEQ(vseq) IRIS_PP_CAT(IRIS_ZZ_PP_VARIADIC_SEQ_TO_SEQ_A vseq, _END) +#define IRIS_ZZ_PP_VARIADIC_SEQ_TO_SEQ_A(...) ((__VA_ARGS__)) IRIS_ZZ_PP_VARIADIC_SEQ_TO_SEQ_B +#define IRIS_ZZ_PP_VARIADIC_SEQ_TO_SEQ_B(...) ((__VA_ARGS__)) IRIS_ZZ_PP_VARIADIC_SEQ_TO_SEQ_A +#define IRIS_ZZ_PP_VARIADIC_SEQ_TO_SEQ_A_END +#define IRIS_ZZ_PP_VARIADIC_SEQ_TO_SEQ_B_END + #define IRIS_PP_SEQ_FOR_EACH(seq, macro, data) IRIS_PP_CAT(IRIS_ZZ_PP_SEQ_FOR_EACH_I_, IRIS_PP_SEQ_SIZE(seq))(macro, data, seq) #define IRIS_PP_SEQ_FOR_EACH_WITH_INDEX(seq, macro, data) \ @@ -192,4 +200,38 @@ #define IRIS_ZZ_PP_SEQ_FOR_EACH_WITH_INDEX_I_31(index, macro, data, seq) macro(index, IRIS_PP_SEQ_HEAD(seq), data) IRIS_ZZ_PP_SEQ_FOR_EACH_WITH_INDEX_I_30(IRIS_PP_INCREMENT(index), macro, data, IRIS_PP_SEQ_TAIL(seq)) #define IRIS_ZZ_PP_SEQ_FOR_EACH_WITH_INDEX_I_32(index, macro, data, seq) macro(index, IRIS_PP_SEQ_HEAD(seq), data) IRIS_ZZ_PP_SEQ_FOR_EACH_WITH_INDEX_I_31(IRIS_PP_INCREMENT(index), macro, data, IRIS_PP_SEQ_TAIL(seq)) +#define IRIS_ZZ_PP_SEQ_ENUM_I_0 +#define IRIS_ZZ_PP_SEQ_ENUM_I_1(x) x +#define IRIS_ZZ_PP_SEQ_ENUM_I_2(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_1 +#define IRIS_ZZ_PP_SEQ_ENUM_I_3(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_2 +#define IRIS_ZZ_PP_SEQ_ENUM_I_4(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_3 +#define IRIS_ZZ_PP_SEQ_ENUM_I_5(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_4 +#define IRIS_ZZ_PP_SEQ_ENUM_I_6(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_5 +#define IRIS_ZZ_PP_SEQ_ENUM_I_7(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_6 +#define IRIS_ZZ_PP_SEQ_ENUM_I_8(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_7 +#define IRIS_ZZ_PP_SEQ_ENUM_I_9(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_8 +#define IRIS_ZZ_PP_SEQ_ENUM_I_10(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_9 +#define IRIS_ZZ_PP_SEQ_ENUM_I_11(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_10 +#define IRIS_ZZ_PP_SEQ_ENUM_I_12(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_11 +#define IRIS_ZZ_PP_SEQ_ENUM_I_13(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_12 +#define IRIS_ZZ_PP_SEQ_ENUM_I_14(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_13 +#define IRIS_ZZ_PP_SEQ_ENUM_I_15(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_14 +#define IRIS_ZZ_PP_SEQ_ENUM_I_16(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_15 +#define IRIS_ZZ_PP_SEQ_ENUM_I_17(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_16 +#define IRIS_ZZ_PP_SEQ_ENUM_I_18(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_17 +#define IRIS_ZZ_PP_SEQ_ENUM_I_19(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_18 +#define IRIS_ZZ_PP_SEQ_ENUM_I_20(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_19 +#define IRIS_ZZ_PP_SEQ_ENUM_I_21(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_20 +#define IRIS_ZZ_PP_SEQ_ENUM_I_22(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_21 +#define IRIS_ZZ_PP_SEQ_ENUM_I_23(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_22 +#define IRIS_ZZ_PP_SEQ_ENUM_I_24(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_23 +#define IRIS_ZZ_PP_SEQ_ENUM_I_25(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_24 +#define IRIS_ZZ_PP_SEQ_ENUM_I_26(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_25 +#define IRIS_ZZ_PP_SEQ_ENUM_I_27(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_26 +#define IRIS_ZZ_PP_SEQ_ENUM_I_28(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_27 +#define IRIS_ZZ_PP_SEQ_ENUM_I_29(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_28 +#define IRIS_ZZ_PP_SEQ_ENUM_I_30(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_29 +#define IRIS_ZZ_PP_SEQ_ENUM_I_31(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_30 +#define IRIS_ZZ_PP_SEQ_ENUM_I_32(x) x, IRIS_ZZ_PP_SEQ_ENUM_I_31 + #endif diff --git a/test/preprocess.cpp b/test/preprocess.cpp index 330a857..a413009 100644 --- a/test/preprocess.cpp +++ b/test/preprocess.cpp @@ -140,6 +140,16 @@ TEST_CASE("seq", "[preprocess]") STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_SEQ_HEAD((a)(b)(c))) == "a"sv); STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_SEQ_TAIL((a)(b)(c))) == "(b)(c)"sv); + STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_SEQ_ENUM()) == ""sv); + STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_SEQ_ENUM((a))) == "a"sv); + STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_SEQ_ENUM((a)(b)(c))) == "a, b, c"sv); + STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_SEQ_ENUM(((a, b))(c))) == "(a, b), c"sv); + + STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_VARIADIC_SEQ_TO_SEQ()) == ""sv); + STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_VARIADIC_SEQ_TO_SEQ((a))) == "((a))"sv); + STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_VARIADIC_SEQ_TO_SEQ((a, b)(c)(d, e, f))) == "((a, b)) ((c)) ((d, e, f))"sv); + STATIC_CHECK(IRIS_PP_SEQ_SIZE(IRIS_PP_VARIADIC_SEQ_TO_SEQ((a, b)(c)(d, e, f))) == 3); + IRIS_PP_SEQ_FOR_EACH((a)(b)(c), IRIS_TEST_SEQ_EXEC, foo) STATIC_CHECK(fooa == "a"); From aa876355c5c73dc284345b9110a455110344d882 Mon Sep 17 00:00:00 2001 From: Nana Sakisaka <1901813+saki7@users.noreply.github.com> Date: Fri, 9 Oct 2026 05:54:10 +0900 Subject: [PATCH 2/2] Add `IRIS_PP_OVERLOAD` --- include/iris/pp/overload.hpp | 9 +++++++ test/preprocess.cpp | 49 ++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 include/iris/pp/overload.hpp diff --git a/include/iris/pp/overload.hpp b/include/iris/pp/overload.hpp new file mode 100644 index 0000000..ace7bf0 --- /dev/null +++ b/include/iris/pp/overload.hpp @@ -0,0 +1,9 @@ +#ifndef IRIS_ZZ_PP_OVERLOAD_HPP +#define IRIS_ZZ_PP_OVERLOAD_HPP + +// SPDX-License-Identifier: MIT + +#define IRIS_PP_OVERLOAD(prefix, ...) IRIS_ZZ_PP_OVERLOAD_I(prefix, __VA_ARGS__ __VA_OPT__(, ) 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#define IRIS_ZZ_PP_OVERLOAD_I(prefix, a32, a31, a30, a29, a28, a27, a26, a25, a24, a23, a22, a21, a20, a19, a18, a17, a16, a15, a14, a13, a12, a11, a10, a9, a8, a7, a6, a5, a4, a3, a2, a1, size, ...) prefix##size + +#endif diff --git a/test/preprocess.cpp b/test/preprocess.cpp index a413009..a1234e1 100644 --- a/test/preprocess.cpp +++ b/test/preprocess.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -55,6 +56,12 @@ TEST_CASE("repeat", "[preprocess]") STATIC_CHECK(qux_1_00 == 1); STATIC_CHECK(qux_2_00 == 1); } +#undef IRIS_TEST_REPEAT_INNER +#undef IRIS_TEST_REPEAT_OUTER +#undef IRIS_TEST_REPEAT_DECLARE_VAR +#undef IRIS_TEST_REPEAT_LEVEL_3 +#undef IRIS_TEST_REPEAT_LEVEL_2 +#undef IRIS_TEST_REPEAT_LEVEL_1 TEST_CASE("tuple", "[preprocess]") { @@ -191,6 +198,9 @@ TEST_CASE("va", "[preprocess]") STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_VA_ENUM(IRIS_TEST_VA_ENUM, x)) == ""sv); STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_VA_ENUM(IRIS_TEST_VA_ENUM, x, (a, b))) == "x + (a, b)"sv); } +#undef IRIS_TEST_VA_EXEC +#undef IRIS_TEST_VA_ENUM + #define IRIS_TEST_REC_AVAILABLE_FROM_1(n) IRIS_PP_SUB(n, 0) #define IRIS_TEST_REC_AVAILABLE_FROM_5(n) IRIS_PP_SUB(n, 4) @@ -207,6 +217,10 @@ TEST_CASE("rec", "[preprocess]") STATIC_CHECK(IRIS_PP_REC(IRIS_TEST_REC_AVAILABLE_FROM_1, 4) == 1); STATIC_CHECK(IRIS_PP_REC(IRIS_TEST_REC_AVAILABLE_FROM_5, 4) == 4); } +#undef IRIS_TEST_REC_AVAILABLE_FROM_1 +#undef IRIS_TEST_REC_AVAILABLE_FROM_5 +#undef IRIS_TEST_REC_AVAILABLE_FROM_7 +#undef IRIS_TEST_REC_AVAILABLE_FROM_8 TEST_CASE("while", "[preprocess]") { @@ -245,3 +259,38 @@ TEST_CASE("comma_if", "[preprocess]") STATIC_CHECK(arr[1] == 1); STATIC_CHECK(arr[2] == 2); } +#undef IRIS_TEST_COMMA_IF + + +#define IRIS_TEST_OVERLOAD_0() 0 +#define IRIS_TEST_OVERLOAD_1(a) a +#define IRIS_TEST_OVERLOAD_2(a, b) a + b +#define IRIS_TEST_OVERLOAD_3(a, b, c) a + b + c +#define IRIS_TEST_OVERLOAD(...) IRIS_PP_OVERLOAD(IRIS_TEST_OVERLOAD_, __VA_ARGS__)(__VA_ARGS__) + +#define IRIS_TEST_OVERLOAD_NESTED_1(a) IRIS_TEST_OVERLOAD(a, 10) +#define IRIS_TEST_OVERLOAD_NESTED_2(a, b) IRIS_TEST_OVERLOAD(a, b, 100) +#define IRIS_TEST_OVERLOAD_NESTED(...) IRIS_PP_OVERLOAD(IRIS_TEST_OVERLOAD_NESTED_, __VA_ARGS__)(__VA_ARGS__) + +TEST_CASE("overload", "[preprocess]") +{ + STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_OVERLOAD(IRIS_TEST_OVERLOAD_, a, b)) == "IRIS_TEST_OVERLOAD_2"sv); + STATIC_CHECK(IRIS_PP_STRINGIZE(IRIS_PP_OVERLOAD(IRIS_TEST_OVERLOAD_, (a, b))) == "IRIS_TEST_OVERLOAD_1"sv); + + STATIC_CHECK(IRIS_TEST_OVERLOAD() == 0); + STATIC_CHECK(IRIS_TEST_OVERLOAD(1) == 1); + STATIC_CHECK(IRIS_TEST_OVERLOAD(1, 2) == 3); + STATIC_CHECK(IRIS_TEST_OVERLOAD(1, 2, 3) == 6); + + STATIC_CHECK(IRIS_TEST_OVERLOAD_NESTED(1) == 11); + STATIC_CHECK(IRIS_TEST_OVERLOAD_NESTED(1, 2) == 103); +} +#undef IRIS_TEST_OVERLOAD_0 +#undef IRIS_TEST_OVERLOAD_1 +#undef IRIS_TEST_OVERLOAD_2 +#undef IRIS_TEST_OVERLOAD_3 +#undef IRIS_TEST_OVERLOAD + +#undef IRIS_TEST_OVERLOAD_NESTED_1 +#undef IRIS_TEST_OVERLOAD_NESTED_2 +#undef IRIS_TEST_OVERLOAD_NESTED