-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmi_json_struct.hpp
More file actions
137 lines (124 loc) · 9.12 KB
/
mi_json_struct.hpp
File metadata and controls
137 lines (124 loc) · 9.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Copyright (c) 2024 Max Ind dmmaster335@gmail.com
// License: MIT License
#pragma once
#define p_MI_FE_0(WHAT)
#define p_MI_FE_1(WHAT, X) WHAT(X)
#define p_MI_FE_2(WHAT, X, ...) WHAT(X) p_MI_FE_1(WHAT, __VA_ARGS__)
#define p_MI_FE_3(WHAT, X, ...) WHAT(X) p_MI_FE_2(WHAT, __VA_ARGS__)
#define p_MI_FE_4(WHAT, X, ...) WHAT(X) p_MI_FE_3(WHAT, __VA_ARGS__)
#define p_MI_FE_5(WHAT, X, ...) WHAT(X) p_MI_FE_4(WHAT, __VA_ARGS__)
#define p_MI_FE_6(WHAT, X, ...) WHAT(X) p_MI_FE_5(WHAT, __VA_ARGS__)
#define p_MI_FE_7(WHAT, X, ...) WHAT(X) p_MI_FE_6(WHAT, __VA_ARGS__)
#define p_MI_FE_8(WHAT, X, ...) WHAT(X) p_MI_FE_7(WHAT, __VA_ARGS__)
#define p_MI_FE_9(WHAT, X, ...) WHAT(X) p_MI_FE_8(WHAT, __VA_ARGS__)
#define p_MI_FE_10(WHAT, X, ...) WHAT(X) p_MI_FE_9(WHAT, __VA_ARGS__)
#define p_MI_FE_11(WHAT, X, ...) WHAT(X) p_MI_FE_10(WHAT, __VA_ARGS__)
#define p_MI_FE_12(WHAT, X, ...) WHAT(X) p_MI_FE_11(WHAT, __VA_ARGS__)
#define p_MI_FE_13(WHAT, X, ...) WHAT(X) p_MI_FE_12(WHAT, __VA_ARGS__)
#define p_MI_FE_14(WHAT, X, ...) WHAT(X) p_MI_FE_13(WHAT, __VA_ARGS__)
#define p_MI_FE_15(WHAT, X, ...) WHAT(X) p_MI_FE_14(WHAT, __VA_ARGS__)
#define p_MI_FE_16(WHAT, X, ...) WHAT(X) p_MI_FE_15(WHAT, __VA_ARGS__)
#define p_MI_FE_17(WHAT, X, ...) WHAT(X) p_MI_FE_16(WHAT, __VA_ARGS__)
#define p_MI_FE_18(WHAT, X, ...) WHAT(X) p_MI_FE_17(WHAT, __VA_ARGS__)
#define p_MI_FE_19(WHAT, X, ...) WHAT(X) p_MI_FE_18(WHAT, __VA_ARGS__)
#define p_MI_FE_20(WHAT, X, ...) WHAT(X) p_MI_FE_19(WHAT, __VA_ARGS__)
#define p_MI_FE_21(WHAT, X, ...) WHAT(X) p_MI_FE_20(WHAT, __VA_ARGS__)
#define p_MI_FE_22(WHAT, X, ...) WHAT(X) p_MI_FE_21(WHAT, __VA_ARGS__)
#define p_MI_FE_23(WHAT, X, ...) WHAT(X) p_MI_FE_22(WHAT, __VA_ARGS__)
#define p_MI_FE_24(WHAT, X, ...) WHAT(X) p_MI_FE_23(WHAT, __VA_ARGS__)
#define p_MI_FE_25(WHAT, X, ...) WHAT(X) p_MI_FE_24(WHAT, __VA_ARGS__)
#define p_MI_FE_26(WHAT, X, ...) WHAT(X) p_MI_FE_25(WHAT, __VA_ARGS__)
#define p_MI_FE_27(WHAT, X, ...) WHAT(X) p_MI_FE_26(WHAT, __VA_ARGS__)
#define p_MI_FE_28(WHAT, X, ...) WHAT(X) p_MI_FE_27(WHAT, __VA_ARGS__)
#define p_MI_FE_29(WHAT, X, ...) WHAT(X) p_MI_FE_28(WHAT, __VA_ARGS__)
#define p_MI_FE_30(WHAT, X, ...) WHAT(X) p_MI_FE_29(WHAT, __VA_ARGS__)
#define p_MI_FE_31(WHAT, X, ...) WHAT(X) p_MI_FE_30(WHAT, __VA_ARGS__)
#define p_MI_FE_32(WHAT, X, ...) WHAT(X) p_MI_FE_31(WHAT, __VA_ARGS__)
#define p_MI_FE_33(WHAT, X, ...) WHAT(X) p_MI_FE_32(WHAT, __VA_ARGS__)
#define p_MI_FE_34(WHAT, X, ...) WHAT(X) p_MI_FE_33(WHAT, __VA_ARGS__)
#define p_MI_FE_35(WHAT, X, ...) WHAT(X) p_MI_FE_34(WHAT, __VA_ARGS__)
#define p_MI_FE_36(WHAT, X, ...) WHAT(X) p_MI_FE_35(WHAT, __VA_ARGS__)
#define p_MI_FE_37(WHAT, X, ...) WHAT(X) p_MI_FE_36(WHAT, __VA_ARGS__)
#define p_MI_FE_38(WHAT, X, ...) WHAT(X) p_MI_FE_37(WHAT, __VA_ARGS__)
#define p_MI_FE_39(WHAT, X, ...) WHAT(X) p_MI_FE_38(WHAT, __VA_ARGS__)
#define p_MI_FE_40(WHAT, X, ...) WHAT(X) p_MI_FE_39(WHAT, __VA_ARGS__)
#define p_MI_FE_41(WHAT, X, ...) WHAT(X) p_MI_FE_40(WHAT, __VA_ARGS__)
#define p_MI_FE_42(WHAT, X, ...) WHAT(X) p_MI_FE_41(WHAT, __VA_ARGS__)
#define p_MI_FE_43(WHAT, X, ...) WHAT(X) p_MI_FE_42(WHAT, __VA_ARGS__)
#define p_MI_FE_44(WHAT, X, ...) WHAT(X) p_MI_FE_43(WHAT, __VA_ARGS__)
#define p_MI_FE_45(WHAT, X, ...) WHAT(X) p_MI_FE_44(WHAT, __VA_ARGS__)
#define p_MI_FE_46(WHAT, X, ...) WHAT(X) p_MI_FE_45(WHAT, __VA_ARGS__)
#define p_MI_FE_47(WHAT, X, ...) WHAT(X) p_MI_FE_46(WHAT, __VA_ARGS__)
#define p_MI_FE_48(WHAT, X, ...) WHAT(X) p_MI_FE_47(WHAT, __VA_ARGS__)
#define p_MI_FE_49(WHAT, X, ...) WHAT(X) p_MI_FE_48(WHAT, __VA_ARGS__)
#define p_MI_FE_50(WHAT, X, ...) WHAT(X) p_MI_FE_49(WHAT, __VA_ARGS__)
#define p_MI_FE_51(WHAT, X, ...) WHAT(X) p_MI_FE_50(WHAT, __VA_ARGS__)
#define p_MI_FE_52(WHAT, X, ...) WHAT(X) p_MI_FE_51(WHAT, __VA_ARGS__)
#define p_MI_FE_53(WHAT, X, ...) WHAT(X) p_MI_FE_52(WHAT, __VA_ARGS__)
#define p_MI_FE_54(WHAT, X, ...) WHAT(X) p_MI_FE_53(WHAT, __VA_ARGS__)
#define p_MI_FE_55(WHAT, X, ...) WHAT(X) p_MI_FE_54(WHAT, __VA_ARGS__)
#define p_MI_FE_56(WHAT, X, ...) WHAT(X) p_MI_FE_55(WHAT, __VA_ARGS__)
#define p_MI_FE_57(WHAT, X, ...) WHAT(X) p_MI_FE_56(WHAT, __VA_ARGS__)
#define p_MI_FE_58(WHAT, X, ...) WHAT(X) p_MI_FE_57(WHAT, __VA_ARGS__)
#define p_MI_FE_59(WHAT, X, ...) WHAT(X) p_MI_FE_58(WHAT, __VA_ARGS__)
#define p_MI_FE_60(WHAT, X, ...) WHAT(X) p_MI_FE_59(WHAT, __VA_ARGS__)
#define p_MI_FE_61(WHAT, X, ...) WHAT(X) p_MI_FE_60(WHAT, __VA_ARGS__)
#define p_MI_FE_62(WHAT, X, ...) WHAT(X) p_MI_FE_61(WHAT, __VA_ARGS__)
#define p_MI_FE_63(WHAT, X, ...) WHAT(X) p_MI_FE_62(WHAT, __VA_ARGS__)
#define p_MI_FE_64(WHAT, X, ...) WHAT(X) p_MI_FE_63(WHAT, __VA_ARGS__)
#define p_MI_EXPAND(x) x
#define p_MI_FOR_EACH_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \
_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, \
_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME, \
...) NAME
#define p_MI_FOR_EACH(action, ...) \
p_MI_EXPAND(p_MI_FOR_EACH_IMPL(_0,__VA_ARGS__,p_MI_FE_64,p_MI_FE_63,p_MI_FE_62,p_MI_FE_61,p_MI_FE_60,p_MI_FE_59, \
p_MI_FE_58,p_MI_FE_57,p_MI_FE_56,p_MI_FE_55,p_MI_FE_54,p_MI_FE_53,p_MI_FE_52,p_MI_FE_51,p_MI_FE_50,p_MI_FE_49, \
p_MI_FE_48,p_MI_FE_47,p_MI_FE_46,p_MI_FE_45,p_MI_FE_44,p_MI_FE_43,p_MI_FE_42,p_MI_FE_41,p_MI_FE_40,p_MI_FE_39, \
p_MI_FE_38,p_MI_FE_37,p_MI_FE_36,p_MI_FE_35,p_MI_FE_34,p_MI_FE_33,p_MI_FE_32,p_MI_FE_31,p_MI_FE_30,p_MI_FE_29, \
p_MI_FE_28,p_MI_FE_27,p_MI_FE_26,p_MI_FE_25,p_MI_FE_24,p_MI_FE_23,p_MI_FE_22,p_MI_FE_21,p_MI_FE_20,p_MI_FE_19, \
p_MI_FE_18,p_MI_FE_17,p_MI_FE_16,p_MI_FE_15,p_MI_FE_14,p_MI_FE_13,p_MI_FE_12,p_MI_FE_11,p_MI_FE_10,p_MI_FE_9, \
p_MI_FE_8,p_MI_FE_7,p_MI_FE_6,p_MI_FE_5,p_MI_FE_4,p_MI_FE_3,p_MI_FE_2,p_MI_FE_1,p_MI_FE_0)(action,__VA_ARGS__))
#define p_MI_FIRST_IMPL(FIRST, SECOND) FIRST
#define p_MI_FIRST(PAIR) p_MI_FIRST_IMPL PAIR
#define p_MI_SECOND_IMPL(FIRST, SECOND) SECOND
#define p_MI_SECOND(PAIR) p_MI_SECOND_IMPL PAIR
#define p_MI_STRINGIZE_IMPL(X) #X
#define p_MI_STRINGIZE(X) p_MI_STRINGIZE_IMPL(X)
#ifndef MI_JSON_STRUCT_IMPL
#define p_MI_FROM_JSON(STRUCT_NAME, ...)
#define p_MI_TO_JSON(STRUCT_NAME, ...)
#else
#include <nlohmann/json.hpp>
#define p_MI_FROM_JSON_IMPL(ARG) nlohmann_json_j.at(p_MI_STRINGIZE(p_MI_SECOND(ARG))).get_to(nlohmann_json_t. p_MI_SECOND(ARG));
#define p_MI_FROM_JSON(STRUCT_NAME, ...) \
inline void from_json(const nlohmann::json& nlohmann_json_j, STRUCT_NAME& nlohmann_json_t) { \
p_MI_FOR_EACH(p_MI_FROM_JSON_IMPL, __VA_ARGS__) \
}
#define p_MI_TO_JSON_IMPL(ARG) nlohmann_json_j[p_MI_STRINGIZE(p_MI_SECOND(ARG))] = nlohmann_json_t.p_MI_SECOND(ARG);
#define p_MI_TO_JSON(STRUCT_NAME, ...) \
inline void to_json(nlohmann::json& nlohmann_json_j, const STRUCT_NAME& nlohmann_json_t) { \
p_MI_FOR_EACH(p_MI_TO_JSON_IMPL, __VA_ARGS__) \
}
#endif
#define p_MI_JSON_MEMBER(ARG) p_MI_FIRST(ARG) p_MI_SECOND(ARG);
#define p_MI_JSON_STRUCT(STRUCT_NAME, ...) \
struct STRUCT_NAME { \
p_MI_FOR_EACH(p_MI_JSON_MEMBER, __VA_ARGS__) \
};
#define MI_STRUCT_WITH_FROM_JSON(NAMESPACE, STRUCT_NAME, ...) \
namespace NAMESPACE { \
p_MI_JSON_STRUCT(STRUCT_NAME, __VA_ARGS__) \
p_MI_FROM_JSON(STRUCT_NAME, __VA_ARGS__) \
}
#define MI_STRUCT_WITH_TO_JSON(NAMESPACE, STRUCT_NAME, ...) \
namespace NAMESPACE { \
p_MI_JSON_STRUCT(STRUCT_NAME, __VA_ARGS__) \
p_MI_TO_JSON(STRUCT_NAME, __VA_ARGS__) \
}
#define MI_STRUCT_WITH_FROM_AND_TO_JSON(NAMESPACE, STRUCT_NAME, ...) \
namespace NAMESPACE { \
p_MI_JSON_STRUCT(STRUCT_NAME, __VA_ARGS__) \
p_MI_FROM_JSON(STRUCT_NAME, __VA_ARGS__) \
p_MI_TO_JSON(STRUCT_NAME, __VA_ARGS__) \
}