def generator(num): file = open("MacroUtils.hpp", "w") file.write("//\n//\n// THIS FILE IS AUTOGENERATED, DO NOT EDIT!\n//\n//\n") file.write("// Defines a for each macro utility, with up to " + str(num) + " elements.\n") file.write("#define FE_0(FUNC, arg)\n") file.write("#define FE_1(FUNC, arg, X) FUNC(X, arg)\n") for i in range(2, num + 1): file.write("#define FE_" + str(i) + "(FUNC, arg, X, ...) FUNC(X, arg) FE_" + str(i -1) + "(FUNC, arg, __VA_ARGS__)\n") file.write("#define FE_" + str(num + 1) +"(FUNC, arg, X, ...) THE_FOREACH_MACRO_CURRENTLY_ONLY_SUPPORTS_UP_TO_" + str(num) + "_VALUES FE_" + str(num) + "(FUNC, arg, __VA_ARGS__)\n") file.write("#define GET_MACRO(") for i in range(0, num + 2): file.write("_" + str(i) + ", ") file.write("NAME, ...) NAME\n") file.write("#define FOR_EACH(action, arg, ...) GET_MACRO(_0, __VA_ARGS__") for i in range(num + 1, 0, -1): file.write(", FE_" + str(i)) file.write(") (action, arg, __VA_ARGS__)\n") file.write("// count arguments\n") file.write("#define NARGS(...) NARGS_(__VA_ARGS__") for i in range(num, -1, -1): file.write(", " + str(i)) file.write(")\n") file.write("#define NARGS_(") for i in range(num, 0, -1): file.write("_" + str(i) + ", ") file.write("N, ...) N\n") file.write("// utility (concatenation)\n") file.write("#define CONC(A, B) CONC_(A, B)\n") file.write("#define CONC_(A, B) A##B\n\n") file.write("#define GET_ELEM(N, ...) CONC(GET_ELEM_, N)(__VA_ARGS__)\n") for i in range(0, num + 1): file.write("#define GET_ELEM_" + str(i) +"(") for j in range(0, i + 1): file.write("_" + str(j) + ", ") file.write("...) _" + str(i) + "\n") file.write("#define GET_LAST(...) GET_ELEM(NARGS(__VA_ARGS__), _, __VA_ARGS__ ,") for i in range(0, num): file.write(",") file.write(")\n") file.write("#define GET_FIRST(...) GET_ELEM_0(__VA_ARGS__)\n") file.close() def main(): generator(256) if __name__ == "__main__": main()