-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMGX_number.h
291 lines (268 loc) · 9.92 KB
/
MGX_number.h
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
#define __MGX_DEC_MGX_ERROR MGX_ERROR
#define __MGX_DEC_0 MGX_ERROR
#define __MGX_DEC_1 0
#define __MGX_DEC_2 1
#define __MGX_DEC_3 2
#define __MGX_DEC_4 3
#define __MGX_DEC_5 4
#define __MGX_DEC_6 5
#define __MGX_DEC_7 6
#define __MGX_DEC_8 7
#define __MGX_DEC_9 8
#define __MGX_DEC_10 9
#define __MGX_DEC_11 10
#define __MGX_DEC_12 11
#define __MGX_DEC_13 12
#define __MGX_DEC_14 13
#define __MGX_DEC_15 14
#define __MGX_DEC_16 15
#define __MGX_DEC_17 16
#define __MGX_DEC_18 17
#define __MGX_DEC_19 18
#define __MGX_DEC_20 19
#define __MGX_DEC_21 20
#define __MGX_DEC_22 21
#define __MGX_DEC_23 22
#define __MGX_DEC_24 23
#define __MGX_DEC_25 24
#define __MGX_DEC_26 25
#define __MGX_DEC_27 26
#define __MGX_DEC_28 27
#define __MGX_DEC_29 28
#define __MGX_DEC_30 29
#define __MGX_DEC_31 30
#define __MGX_DEC_32 31
#define __MGX_DEC_33 32
#define __MGX_DEC_34 33
#define __MGX_DEC_35 34
#define __MGX_DEC_36 35
#define __MGX_DEC_37 36
#define __MGX_DEC_38 37
#define __MGX_DEC_39 38
#define __MGX_DEC_40 39
#define __MGX_DEC_41 40
#define __MGX_DEC_42 41
#define __MGX_DEC_43 42
#define __MGX_DEC_44 43
#define __MGX_DEC_45 44
#define __MGX_DEC_46 45
#define __MGX_DEC_47 46
#define __MGX_DEC_48 47
#define __MGX_DEC_49 48
#define __MGX_DEC_50 49
#define __MGX_DEC_51 50
#define __MGX_DEC_52 51
#define __MGX_DEC_53 52
#define __MGX_DEC_54 53
#define __MGX_DEC_55 54
#define __MGX_DEC_56 55
#define __MGX_DEC_57 56
#define __MGX_DEC_58 57
#define __MGX_DEC_59 58
#define __MGX_DEC_60 59
#define __MGX_DEC_61 60
#define __MGX_DEC_62 61
#define __MGX_DEC_63 62
#define __MGX_DEC_64 63
#define __MGX_DEC_65 64
#define __MGX_DEC_66 65
#define __MGX_DEC_67 66
#define __MGX_DEC_68 67
#define __MGX_DEC_69 68
#define __MGX_DEC_70 69
#define __MGX_DEC_71 70
#define __MGX_DEC_72 71
#define __MGX_DEC_73 72
#define __MGX_DEC_74 73
#define __MGX_DEC_75 74
#define __MGX_DEC_76 75
#define __MGX_DEC_77 76
#define __MGX_DEC_78 77
#define __MGX_DEC_79 78
#define __MGX_DEC_80 79
#define __MGX_DEC_81 80
#define __MGX_DEC_82 81
#define __MGX_DEC_83 82
#define __MGX_DEC_84 83
#define __MGX_DEC_85 84
#define __MGX_DEC_86 85
#define __MGX_DEC_87 86
#define __MGX_DEC_88 87
#define __MGX_DEC_89 88
#define __MGX_DEC_90 89
#define __MGX_DEC_91 90
#define __MGX_DEC_92 91
#define __MGX_DEC_93 92
#define __MGX_DEC_94 93
#define __MGX_DEC_95 94
#define __MGX_DEC_96 95
#define __MGX_DEC_97 96
#define __MGX_DEC_98 97
#define __MGX_DEC_99 98
#define __MGX_DEC_100 99
#define __MGX_INC_0 1
#define __MGX_INC_1 2
#define __MGX_INC_2 3
#define __MGX_INC_3 4
#define __MGX_INC_4 5
#define __MGX_INC_5 6
#define __MGX_INC_6 7
#define __MGX_INC_7 8
#define __MGX_INC_8 9
#define __MGX_INC_9 10
#define __MGX_INC_10 11
#define __MGX_INC_11 12
#define __MGX_INC_12 13
#define __MGX_INC_13 14
#define __MGX_INC_14 15
#define __MGX_INC_15 16
#define __MGX_INC_16 17
#define __MGX_INC_17 18
#define __MGX_INC_18 19
#define __MGX_INC_19 20
#define __MGX_INC_20 21
#define __MGX_INC_21 22
#define __MGX_INC_22 23
#define __MGX_INC_23 24
#define __MGX_INC_24 25
#define __MGX_INC_25 26
#define __MGX_INC_26 27
#define __MGX_INC_27 28
#define __MGX_INC_28 29
#define __MGX_INC_29 30
#define __MGX_INC_30 31
#define __MGX_INC_31 32
#define __MGX_INC_32 33
#define __MGX_INC_33 34
#define __MGX_INC_34 35
#define __MGX_INC_35 36
#define __MGX_INC_36 37
#define __MGX_INC_37 38
#define __MGX_INC_38 39
#define __MGX_INC_39 40
#define __MGX_INC_40 41
#define __MGX_INC_41 42
#define __MGX_INC_42 43
#define __MGX_INC_43 44
#define __MGX_INC_44 45
#define __MGX_INC_45 46
#define __MGX_INC_46 47
#define __MGX_INC_47 48
#define __MGX_INC_48 49
#define __MGX_INC_49 50
#define __MGX_INC_50 51
#define __MGX_INC_51 52
#define __MGX_INC_52 53
#define __MGX_INC_53 54
#define __MGX_INC_54 55
#define __MGX_INC_55 56
#define __MGX_INC_56 57
#define __MGX_INC_57 58
#define __MGX_INC_58 59
#define __MGX_INC_59 60
#define __MGX_INC_60 61
#define __MGX_INC_61 62
#define __MGX_INC_62 63
#define __MGX_INC_63 64
#define __MGX_INC_64 65
#define __MGX_INC_65 66
#define __MGX_INC_66 67
#define __MGX_INC_67 68
#define __MGX_INC_68 69
#define __MGX_INC_69 70
#define __MGX_INC_70 71
#define __MGX_INC_71 72
#define __MGX_INC_72 73
#define __MGX_INC_73 74
#define __MGX_INC_74 75
#define __MGX_INC_75 76
#define __MGX_INC_76 77
#define __MGX_INC_77 78
#define __MGX_INC_78 79
#define __MGX_INC_79 80
#define __MGX_INC_80 81
#define __MGX_INC_81 82
#define __MGX_INC_82 83
#define __MGX_INC_83 84
#define __MGX_INC_84 85
#define __MGX_INC_85 86
#define __MGX_INC_86 87
#define __MGX_INC_87 88
#define __MGX_INC_88 89
#define __MGX_INC_89 90
#define __MGX_INC_90 91
#define __MGX_INC_91 92
#define __MGX_INC_92 93
#define __MGX_INC_93 94
#define __MGX_INC_94 95
#define __MGX_INC_95 96
#define __MGX_INC_96 97
#define __MGX_INC_97 98
#define __MGX_INC_98 99
#define __MGX_INC_99 100
#define __MGX_INC_100 MGX_ERROR
#define __MGX_INC_MGX_ERROR MGX_ERROR
#define __MGX_NUM_CAT(a, b) __MGX_NUM_CAT_(a, b)
#define __MGX_NUM_CAT_(a, b) a ## b
#define __MGX_NUM_EXPAND(...) __VA_ARGS__
#define __MGX_NUM_EXPAND2(...) __VA_ARGS__
#define __MGX_NUM_EXPAND3(...) __VA_ARGS__
#define __MGX_NUM_EVAL(...) __MGX_NUM_EVAL1(__MGX_NUM_EVAL1(__MGX_NUM_EVAL1(__VA_ARGS__)))
#define __MGX_NUM_EVAL1(...) __MGX_NUM_EVAL2(__MGX_NUM_EVAL2(__MGX_NUM_EVAL2(__VA_ARGS__)))
#define __MGX_NUM_EVAL2(...) __MGX_NUM_EVAL3(__MGX_NUM_EVAL3(__MGX_NUM_EVAL3(__VA_ARGS__)))
#define __MGX_NUM_EVAL3(...) __MGX_NUM_EVAL4(__MGX_NUM_EVAL4(__MGX_NUM_EVAL4(__VA_ARGS__)))
#define __MGX_NUM_EVAL4(...) __MGX_NUM_EVAL5(__MGX_NUM_EVAL5(__MGX_NUM_EVAL5(__VA_ARGS__)))
#define __MGX_NUM_EVAL5(...) __VA_ARGS__
#define __MGX_NUM_2EVAL(...) __MGX_NUM_2EVAL1(__MGX_NUM_2EVAL1(__MGX_NUM_2EVAL1(__VA_ARGS__)))
#define __MGX_NUM_2EVAL1(...) __MGX_NUM_2EVAL2(__MGX_NUM_2EVAL2(__MGX_NUM_2EVAL2(__VA_ARGS__)))
#define __MGX_NUM_2EVAL2(...) __MGX_NUM_2EVAL3(__MGX_NUM_2EVAL3(__MGX_NUM_2EVAL3(__VA_ARGS__)))
#define __MGX_NUM_2EVAL3(...) __MGX_NUM_2EVAL4(__MGX_NUM_2EVAL4(__MGX_NUM_2EVAL4(__VA_ARGS__)))
#define __MGX_NUM_2EVAL4(...) __MGX_NUM_2EVAL5(__MGX_NUM_2EVAL5(__MGX_NUM_2EVAL5(__VA_ARGS__)))
#define __MGX_NUM_2EVAL5(...) __VA_ARGS__
#define __MGX_NUM_3EVAL(...) __MGX_NUM_3EVAL1(__MGX_NUM_3EVAL1(__MGX_NUM_3EVAL1(__VA_ARGS__)))
#define __MGX_NUM_3EVAL1(...) __MGX_NUM_3EVAL2(__MGX_NUM_3EVAL2(__MGX_NUM_3EVAL2(__VA_ARGS__)))
#define __MGX_NUM_3EVAL2(...) __MGX_NUM_3EVAL3(__MGX_NUM_3EVAL3(__MGX_NUM_3EVAL3(__VA_ARGS__)))
#define __MGX_NUM_3EVAL3(...) __MGX_NUM_3EVAL4(__MGX_NUM_3EVAL4(__MGX_NUM_3EVAL4(__VA_ARGS__)))
#define __MGX_NUM_3EVAL4(...) __MGX_NUM_3EVAL5(__MGX_NUM_3EVAL5(__MGX_NUM_3EVAL5(__VA_ARGS__)))
#define __MGX_NUM_3EVAL5(...) __VA_ARGS__
#define __MGX_NUM_IS_0_0 __MGX_PROBE(~)
#define __MGX_NUM_IS_1_1 __MGX_PROBE(~)
#define __MGX_NUM_IS_MGX_ERROR_MGX_ERROR __MGX_PROBE(~)
#define __MGX_NUM_WHILE(c, ...) __MGX_NUM_EVAL(__MGX_NUM_WHILE_(c, __VA_ARGS__))
#define __MGX_NUM_WHILE2(c, ...) __MGX_NUM_2EVAL(__MGX_NUM_WHILE2_(c, __VA_ARGS__))
#define __MGX_NUM_WHILE3(c, ...) __MGX_NUM_3EVAL(__MGX_NUM_WHILE3_(c, __VA_ARGS__))
#define __MGX_NUM_WHILE_INDIRECT() __MGX_NUM_WHILE_
#define __MGX_NUM_WHILE_(c, M, ...) MGX_IF( c(__VA_ARGS__))(__MGX_DEFER2(__MGX_NUM_WHILE_INDIRECT)()(c, M, M(__VA_ARGS__)), __MGX_NUM_EXPAND(__VA_ARGS__))
#define __MGX_NUM_WHILE_INDIRECT2() __MGX_NUM_WHILE2_
#define __MGX_NUM_WHILE2_(c, M, ...) MGX_IF( c(__VA_ARGS__))(__MGX_DEFER2(__MGX_NUM_WHILE_INDIRECT2)()(c, M, M(__VA_ARGS__)), __MGX_NUM_EXPAND2(__VA_ARGS__))
#define __MGX_NUM_WHILE_INDIRECT3() __MGX_NUM_WHILE3_
#define __MGX_NUM_WHILE3_(c, M, ...) MGX_IF( c(__VA_ARGS__))(__MGX_DEFER2(__MGX_NUM_WHILE_INDIRECT3)()(c, M, M(__VA_ARGS__)), __MGX_NUM_EXPAND3(__VA_ARGS__))
#define __MGX_NUM_IS(a, b) __MGX_CHECK(__MGX_NUM_CAT(__MGX_NUM_CAT(__MGX_NUM_CAT(__MGX_NUM_IS_,a), _), b))
#define __MGX_NUM_SUB(a, b) MGX_DEC(a), MGX_DEC(b)
#define __MGX_NUM_ADD(a, b) MGX_DEC(a), MGX_INC(b)
#define __MGX_NUM_DIV(a, b, res) MGX_SUB(a, b), b, MGX_INC(res)
#define __MGX_NUM_MUL(a, b, res) MGX_DEC(a), b, MGX_ADD(b, res)
#define __MGX_NUM_EXP(e, b, res) MGX_DEC(e), b, MGX_MUL(res, b)
#define __MGX_NUM_ROOT(r, b, res) MGX_DIV(r, b), b, MGX_INC(res)
#define __MGX_NUM_IS_EMPTY(a, b, res) MGX_NOT(MGX_OR(__MGX_NUM_IS(a, 0), __MGX_NUM_IS(a,MGX_ERROR)))
#define __MGX_NUM_IS_LESS_ONE(a, b, res) MGX_NOT(MGX_OR(__MGX_NUM_IS(a, 0), __MGX_NUM_IS(a,1)))
#define __MGX_NUM_POST(...) __MGX_NUM_POST_(__VA_ARGS__)
#define __MGX_NUM_POST_(a,b,res) res
#define __MGX_NUM_D_POST(...) __MGX_NUM_D_POST_(__VA_ARGS__)
#define __MGX_NUM_D_POST_(a,b,res) MGX_IF(__MGX_NUM_IS(a, MGX_ERROR))(MGX_DEC(res), res)
#define __MGX_NUM_CMP(M, a, b) __MGX_NUM_CMP_(M, a, b)
#define __MGX_NUM_CMP_(M, a, b) M(MGX_SUB(b, a))
#define __MGX_NUM_CMP_LESS(A) MGX_AND(MGX_NUM_NOT_ZERO(A), MGX_NOT(__MGX_NUM_IS(A, MGX_ERROR)))
#define __MGX_NUM_CMP_GREATER(A) MGX_NOT(MGX_OR(MGX_NUM_IS(A, 0), MGX_NOT(__MGX_NUM_IS(A, MGX_ERROR))))
#define MGX_DEC(n) __MGX_CAT_(__MGX_DEC_, n)
#define MGX_INC(n) __MGX_CAT_(__MGX_INC_, n)
#define MGX_SUB(a, b) MGX_ARG_SECOND(__MGX_NUM_WHILE(MGX_NUM_NOT_ZERO, __MGX_NUM_SUB, b, a))
#define MGX_ADD(a, b) MGX_ARG_SECOND(__MGX_NUM_WHILE(MGX_NUM_NOT_ZERO, __MGX_NUM_ADD, b, a))
#define MGX_DIV(a, b) __MGX_NUM_D_POST(__MGX_NUM_WHILE2(__MGX_NUM_IS_EMPTY, __MGX_NUM_DIV, a, b, 0))
#define MGX_MUL(a, b) __MGX_NUM_D_POST(__MGX_NUM_WHILE2(__MGX_NUM_IS_EMPTY, __MGX_NUM_MUL, a, b, 0))
#define MGX_EXP(a, b) __MGX_NUM_POST(__MGX_NUM_WHILE3(__MGX_NUM_IS_EMPTY, __MGX_NUM_EXP, b, a, 1))
#define MGX_ROOT(b, r) __MGX_NUM_POST(__MGX_NUM_WHILE3(__MGX_NUM_IS_LESS_ONE, __MGX_NUM_ROOT, r, b, 0))
#define MGX_NUM_NOT_ZERO(...) MGX_NOT(__MGX_NUM_IS(__MGX_ARG_FIRST(__VA_ARGS__,), 0))
#define MGX_NUM_EQUAL(a, b) __MGX_NUM_CMP(MGX_NOT, a, b)
#define MGX_NUM_LESS(a, b) __MGX_NUM_CMP(__MGX_NUM_CMP_LESS, a, b)
#define MGX_NUM_GREATER(a, b) __MGX_NUM_CMP(__MGX_NUM_CMP_GREATER, a, b)