1#include <cstdlib>
2#include <iostream>
3#include <sstream>
4
5using namespace std;
6
7void build_code(int max_args)
8{
9    stringstream ss;
10    ss << "#define NLOHMANN_JSON_EXPAND( x ) x" << endl;
11    ss << "#define NLOHMANN_JSON_GET_MACRO(";
12    for (int i = 0 ; i < max_args ; i++)
13        ss << "_" << i + 1 << ", ";
14    ss << "NAME,...) NAME" << endl;
15
16    ss << "#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \\" << endl;
17    for (int i = max_args ; i > 1 ; i--)
18        ss << "NLOHMANN_JSON_PASTE" << i << ", \\" << endl;
19    ss << "NLOHMANN_JSON_PASTE1)(__VA_ARGS__))" << endl;
20
21    ss << "#define NLOHMANN_JSON_PASTE2(func, v1) func(v1)" << endl;
22    for (int i = 3 ; i <= max_args ; i++)
23    {
24        ss << "#define NLOHMANN_JSON_PASTE" << i << "(func, ";
25        for (int j = 1 ; j < i -1 ; j++)
26            ss << "v" << j << ", ";
27        ss << "v" << i-1 << ") NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE" << i-1 << "(func, ";
28        for (int j = 2 ; j < i-1 ; j++)
29            ss << "v" << j << ", ";
30        ss << "v" << i-1 << ")" << endl;
31    }
32
33    cout << ss.str() << endl;
34}
35
36int main(int argc, char** argv)
37{
38    int max_args = 64;
39    build_code(max_args);
40
41    return 0;
42}
43
44