Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions include/iris/pp/overload.hpp
Original file line number Diff line number Diff line change
@@ -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
42 changes: 42 additions & 0 deletions include/iris/pp/seq.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down Expand Up @@ -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
59 changes: 59 additions & 0 deletions test/preprocess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <iris/pp/tuple.hpp>
#include <iris/pp/va.hpp>
#include <iris/pp/while.hpp>
#include <iris/pp/overload.hpp>

#include <catch2/catch_test_macros.hpp>

Expand Down Expand Up @@ -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]")
{
Expand Down Expand Up @@ -140,6 +147,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");
Expand Down Expand Up @@ -181,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)
Expand All @@ -197,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]")
{
Expand Down Expand Up @@ -235,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
Loading