Prusa MINI Firmware overview
macro_logic.h
Go to the documentation of this file.
1 /*
2  * File: macro_logic.h
3  * Author: root
4  *
5  * Created on December 22, 2018, 4:49 AM
6  *
7  * To test:
8  * gcc -DAJK_TEST_MACRO_LOGIC -E macro_logic.h
9  *
10  */
11 
12 #ifndef MACRO_LOGIC_H
13 #define MACRO_LOGIC_H
14 
15 #define AJK_CAT(a, ...) AJK_PRIMITIVE_CAT(a, __VA_ARGS__)
16 #define AJK_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
17 
18 #define AJK_COMPL(b) AJK_PRIMITIVE_CAT(AJK_COMPL_, b)
19 #define AJK_COMPL_0 1
20 #define AJK_COMPL_1 0
21 
22 #define AJK_BITAND(x) AJK_PRIMITIVE_CAT(AJK_BITAND_, x)
23 #define AJK_BITAND_0(y) 0
24 #define AJK_BITAND_1(y) y
25 
26 #define AJK_INC(x) AJK_PRIMITIVE_CAT(AJK_INC_, x)
27 #define AJK_INC_0 1
28 #define AJK_INC_1 2
29 #define AJK_INC_2 3
30 #define AJK_INC_3 4
31 #define AJK_INC_4 5
32 #define AJK_INC_5 6
33 #define AJK_INC_6 7
34 #define AJK_INC_7 8
35 #define AJK_INC_8 9
36 #define AJK_INC_9 10
37 #define AJK_INC_10 10
38 
39 #define AJK_DEC(x) AJK_PRIMITIVE_CAT(AJK_DEC_, x)
40 #define AJK_DEC_0 0
41 #define AJK_DEC_1 0
42 #define AJK_DEC_2 1
43 #define AJK_DEC_3 2
44 #define AJK_DEC_4 3
45 #define AJK_DEC_5 4
46 #define AJK_DEC_6 5
47 #define AJK_DEC_7 6
48 #define AJK_DEC_8 7
49 #define AJK_DEC_9 8
50 #define AJK_DEC_10 9
51 
52 #define AJK_CHECK_N(x, n, ...) n
53 #define AJK_CHECK(...) AJK_CHECK_N(__VA_ARGS__, 0,)
54 #define AJK_PROBE(x) x, 1,
55 
56 #define AJK_IS_PAREN(x) AJK_CHECK(AJK_IS_PAREN_PROBE x)
57 #define AJK_IS_PAREN_PROBE(...) AJK_PROBE(~)
58 
59 #define AJK_NOT(x) AJK_CHECK(AJK_PRIMITIVE_CAT(AJK_NOT_, x))
60 #define AJK_NOT_0 AJK_PROBE(~)
61 
62 #define AJK_COMPL(b) AJK_PRIMITIVE_CAT(AJK_COMPL_, b)
63 #define AJK_COMPL_0 1
64 #define AJK_COMPL_1 0
65 
66 #define AJK_BOOL(x) AJK_COMPL(AJK_NOT(x))
67 
68 #define AJK_IIF(c) AJK_PRIMITIVE_CAT(AJK_IIF_, c)
69 #define AJK_IIF_0(t, ...) __VA_ARGS__
70 #define AJK_IIF_1(t, ...) t
71 
72 #define AJK_IF(c) AJK_IIF(AJK_BOOL(c))
73 
74 #define AJK_EAT(...)
75 #define AJK_EXPAND(...) __VA_ARGS__
76 #define AJK_WHEN(c) AJK_IF(c)(AJK_EXPAND, AJK_EAT)
77 
78 #define AJK_EMPTY()
79 #define AJK_DEFER(id) id AJK_EMPTY()
80 #define AJK_OBSTRUCT(id) id AJK_DEFER(AJK_EMPTY)()
81 
82 #define AJK_EVAL(...) AJK_EVAL1(AJK_EVAL1(AJK_EVAL1(__VA_ARGS__)))
83 #define AJK_EVAL1(...) AJK_EVAL2(AJK_EVAL2(AJK_EVAL2(__VA_ARGS__)))
84 #define AJK_EVAL2(...) AJK_EVAL3(AJK_EVAL3(AJK_EVAL3(__VA_ARGS__)))
85 #define AJK_EVAL3(...) AJK_EVAL4(AJK_EVAL4(AJK_EVAL4(__VA_ARGS__)))
86 #define AJK_EVAL4(...) AJK_EVAL5(AJK_EVAL5(AJK_EVAL5(__VA_ARGS__)))
87 #define AJK_EVAL5(...) __VA_ARGS__
88 
89 #define AJK_REPEAT(AJK_count, AJK_macro, ...) \
90  AJK_WHEN(AJK_count) \
91  ( \
92  AJK_OBSTRUCT(AJK_REPEAT_INDIRECT) () \
93  ( \
94  AJK_DEC(AJK_count), AJK_macro, __VA_ARGS__ \
95  ) \
96  AJK_OBSTRUCT(AJK_macro) \
97  ( \
98  AJK_DEC(AJK_count), __VA_ARGS__ \
99  ) \
100  )
101 #define AJK_REPEAT_INDIRECT() AJK_REPEAT
102 
103 #define AJK_WHILE(AJK_pred, AJK_op, ...) \
104  IF(AJK_pred(__VA_ARGS__)) \
105  ( \
106  AJK_OBSTRUCT(AJK_WHILE_INDIRECT) () \
107  ( \
108  AJK_pred, AJK_op, AJK_op(__VA_ARGS__) \
109  ), \
110  __VA_ARGS__ \
111  )
112 #define AJK_WHILE_INDIRECT() AJK_WHILE
113 
114 #define AJK_PRIMITIVE_COMPARE(x, y) AJK_IS_PAREN \
115 ( \
116  AJK_COMPARE_ ## x ( AJK_COMPARE_ ## y) (()) \
117 )
118 
119 #define AJK_IS_COMPARABLE(x) AJK_IS_PAREN( AJK_CAT(AJK_COMPARE_, x) (()) )
120 
121 #define AJK_NOT_EQUAL(x, y) \
122 AJK_IIF(AJK_BITAND(AJK_IS_COMPARABLE(x))(AJK_IS_COMPARABLE(y)) ) \
123 ( \
124  AJK_PRIMITIVE_COMPARE, \
125  1 AJK_EAT \
126 )(x, y)
127 
128 #define AJK_EQUAL(x, y) AJK_COMPL(AJK_NOT_EQUAL(x, y))
129 
130 
131 #define AJK_COMMA() ,
132 
133 #define AJK_COMMA_IF(n) AJK_IF(n)(AJK_COMMA, AJK_EAT)()
134 
135 
136 #define AJK_COMMA_VAR(AJK_count, AJK_v) AJK_COMMA_IF(AJK_count) AJK_v ## AJK_count
137 
138 #define AJK_MAKE_LIST(AJK_v, AJK_count) AJK_EVAL(AJK_REPEAT(AJK_count, AJK_COMMA_VAR, AJK_v))
139 
140 #define AJK_FUN(AJK_count, AJK_v, AJK_args, AJK_body) AJK_v ## AJK_count (AJK_args) { AJK_body(AJK_count) }
141 #define AJK_MAKE_FUNS(AJK_v, AJK_args, AJK_count, AJK_body) AJK_EVAL(AJK_REPEAT(AJK_count, AJK_FUN, AJK_v, AJK_args, AJK_body))
142 #ifdef AJK_TEST_MACRO_LOGIC
143 
144 #define BODY(AJKindex) some(C, statement); contaning(a, test[AJKindex]);
145 #define ZERO_TIMES_TEST 0
146 #define THREE_TIMES_TEST 3
147 blank > AJK_MAKE_LIST(VARIABLE_, ZERO_TIMES_TEST) < because zero repeats
148 Make 3 comma separated indexed variables : AJK_MAKE_LIST(VARIABLE_, THREE_TIMES_TEST)
149 Make 3 bogus function bodies
150 AJK_MAKE_FUNS(unsigned Cfunc,(arg1, arg2),3,BODY)
151 #endif
152 
153 #endif /* MACRO_LOGIC_H */
AJK_MAKE_FUNS
#define AJK_MAKE_FUNS(AJK_v, AJK_args, AJK_count, AJK_body)
Definition: macro_logic.h:141
AJK_MAKE_LIST
#define AJK_MAKE_LIST(AJK_v, AJK_count)
Definition: macro_logic.h:138