barretenberg
Loading...
Searching...
No Matches
name_value_pair_macro.hpp
1#pragma once
2
3/* start of #define NVP:
4 * expands to name-value pairs (NVPs), e.g. NVP(x,y,z) -> "x", x, "y", y", "z", z
5 * used in msgpack serialization. */
6
7// hacky counting of variadic macro params:
8#define VA_NARGS_IMPL(_1, \
9 _2, \
10 _3, \
11 _4, \
12 _5, \
13 _6, \
14 _7, \
15 _8, \
16 _9, \
17 _10, \
18 _11, \
19 _12, \
20 _13, \
21 _14, \
22 _15, \
23 _16, \
24 _17, \
25 _18, \
26 _19, \
27 _20, \
28 _21, \
29 _22, \
30 _23, \
31 _24, \
32 _25, \
33 _26, \
34 _27, \
35 _28, \
36 _29, \
37 _30, \
38 N, \
39 ...) \
40 N
41// AD: support for 30 fields!? one may ask. Well, after 20 not being enough...
42#define VA_NARGS(...) \
43 VA_NARGS_IMPL(__VA_ARGS__, \
44 30, \
45 29, \
46 28, \
47 27, \
48 26, \
49 25, \
50 24, \
51 23, \
52 22, \
53 21, \
54 20, \
55 19, \
56 18, \
57 17, \
58 16, \
59 15, \
60 14, \
61 13, \
62 12, \
63 11, \
64 10, \
65 9, \
66 8, \
67 7, \
68 6, \
69 5, \
70 4, \
71 3, \
72 2, \
73 1)
74
75// name-value pair expansion for variables
76// used in msgpack map expansion
77// n<=3 case
78#define _NVP1(x) #x, x
79#define _NVP2(x, y) #x, x, #y, y
80#define _NVP3(x, y, z) #x, x, #y, y, #z, z
81// n>3 cases
82#define _NVP4(x, ...) _NVP1(x), _NVP3(__VA_ARGS__)
83#define _NVP5(x, ...) _NVP1(x), _NVP4(__VA_ARGS__)
84#define _NVP6(x, ...) _NVP1(x), _NVP5(__VA_ARGS__)
85#define _NVP7(x, ...) _NVP1(x), _NVP6(__VA_ARGS__)
86#define _NVP8(x, ...) _NVP1(x), _NVP7(__VA_ARGS__)
87#define _NVP9(x, ...) _NVP1(x), _NVP8(__VA_ARGS__)
88#define _NVP10(x, ...) _NVP1(x), _NVP9(__VA_ARGS__)
89#define _NVP11(x, ...) _NVP1(x), _NVP10(__VA_ARGS__)
90#define _NVP12(x, ...) _NVP1(x), _NVP11(__VA_ARGS__)
91#define _NVP13(x, ...) _NVP1(x), _NVP12(__VA_ARGS__)
92#define _NVP14(x, ...) _NVP1(x), _NVP13(__VA_ARGS__)
93#define _NVP15(x, ...) _NVP1(x), _NVP14(__VA_ARGS__)
94#define _NVP16(x, ...) _NVP1(x), _NVP15(__VA_ARGS__)
95#define _NVP17(x, ...) _NVP1(x), _NVP16(__VA_ARGS__)
96#define _NVP18(x, ...) _NVP1(x), _NVP17(__VA_ARGS__)
97#define _NVP19(x, ...) _NVP1(x), _NVP18(__VA_ARGS__)
98#define _NVP20(x, ...) _NVP1(x), _NVP19(__VA_ARGS__)
99#define _NVP21(x, ...) _NVP1(x), _NVP20(__VA_ARGS__)
100#define _NVP22(x, ...) _NVP1(x), _NVP21(__VA_ARGS__)
101#define _NVP23(x, ...) _NVP1(x), _NVP22(__VA_ARGS__)
102#define _NVP24(x, ...) _NVP1(x), _NVP23(__VA_ARGS__)
103#define _NVP25(x, ...) _NVP1(x), _NVP24(__VA_ARGS__)
104#define _NVP26(x, ...) _NVP1(x), _NVP25(__VA_ARGS__)
105#define _NVP27(x, ...) _NVP1(x), _NVP26(__VA_ARGS__)
106#define _NVP28(x, ...) _NVP1(x), _NVP27(__VA_ARGS__)
107#define _NVP29(x, ...) _NVP1(x), _NVP28(__VA_ARGS__)
108#define _NVP30(x, ...) _NVP1(x), _NVP29(__VA_ARGS__)
109
110#define CONCAT(a, b) a##b
111#define _NVP_N(n) CONCAT(_NVP, n)
112#define NVP(...) _NVP_N(VA_NARGS(__VA_ARGS__))(__VA_ARGS__)
113// end of #define NVP