QuISP
Loading...
Searching...
No Matches
macro_utils.h
Go to the documentation of this file.
1#pragma once
2
3// it returns the number of variadic arguments
4#define VA_ARGS_SIZE(...) VA_ARGS_SIZE_AUX(__VA_ARGS__, INDEX_REV_SEQ())
5
6#define INDEX_REV_SEQ() 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
7#define VA_ARGS_SIZE_IMPL(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, ARG10, N, ...) N
8#define VA_ARGS_SIZE_AUX(...) VA_ARGS_SIZE_IMPL(__VA_ARGS__)
9
10#define CONCAT_AUX(x, y) x##y
11#define CONCAT(x, y) CONCAT_AUX(x, y)
12#define FOLD_VA_ARGS_AUX_1(FUNC, ARG1, ...) FUNC(ARG1)
13#define FOLD_VA_ARGS_AUX_2(FUNC, ARG1, ...) CONCAT(FUNC(ARG1), FOLD_VA_ARGS_AUX_1(FUNC, __VA_ARGS__))
14#define FOLD_VA_ARGS_AUX_3(FUNC, ARG1, ...) CONCAT(FUNC(ARG1), FOLD_VA_ARGS_AUX_2(FUNC, __VA_ARGS__))
15#define FOLD_VA_ARGS_AUX_4(FUNC, ARG1, ...) CONCAT(FUNC(ARG1), FOLD_VA_ARGS_AUX_3(FUNC, __VA_ARGS__))
16#define FOLD_VA_ARGS_AUX_5(FUNC, ARG1, ...) CONCAT(FUNC(ARG1), FOLD_VA_ARGS_AUX_4(FUNC, __VA_ARGS__))
17#define FOLD_VA_ARGS_AUX_6(FUNC, ARG1, ...) CONCAT(FUNC(ARG1), FOLD_VA_ARGS_AUX_5(FUNC, __VA_ARGS__))
18#define FOLD_VA_ARGS_AUX_7(FUNC, ARG1, ...) CONCAT(FUNC(ARG1), FOLD_VA_ARGS_AUX_6(FUNC, __VA_ARGS__))
19#define FOLD_VA_ARGS_AUX_8(FUNC, ARG1, ...) CONCAT(FUNC(ARG1), FOLD_VA_ARGS_AUX_7(FUNC, __VA_ARGS__))
20#define FOLD_VA_ARGS_AUX_9(FUNC, ARG1, ...) CONCAT(FUNC(ARG1), FOLD_VA_ARGS_AUX_8(FUNC, __VA_ARGS__))
21#define FOLD_VA_ARGS_AUX_10(FUNC, ARG1, ...) CONCAT(FUNC(ARG1), FOLD_VA_ARGS_AUX_9(FUNC, __VA_ARGS__))
22#define FOLD_VA_ARGS(FUNC, ...) CONCAT(FOLD_VA_ARGS_AUX_, VA_ARGS_SIZE(__VA_ARGS__))(FUNC, __VA_ARGS__)
23
24#define CONCAT_ID(x) x##_
25
26#define CONCAT_ID_WITH_UNDERBAR(...) FOLD_VA_ARGS(CONCAT_ID, __VA_ARGS__)
27
28#define INSTRUCTION_TYPE_ALIAS(...) CONCAT(INSTR_, CONCAT_ID_WITH_UNDERBAR(__VA_ARGS__))