AFLOW
 
Loading...
Searching...
No Matches
aurostd_automatic_template.h
Go to the documentation of this file.
1// ***************************************************************************
2// * *
3// * Aflow STEFANO CURTAROLO - Duke University 2003-2024 *
4// * *
5// ***************************************************************************
14
15#ifndef _AUROSTD_AUTOMATIC_TEMPLATE_H_
16#define _AUROSTD_AUTOMATIC_TEMPLATE_H_
17
18// utype lists
19#define AST_UTYPE_BASE_NUM int, unsigned int, float, double
20#define AST_UTYPE_NUM int, unsigned int, long int, long unsigned int, long long int, long long unsigned int, float, double, long double
21#define AST_UTYPE_NUM_COMPLEX \
22 int, unsigned int, long int, long unsigned int, long long int, long long unsigned int, float, double, long double, aurostd::xcomplex<float>, aurostd::xcomplex<double>, aurostd::xcomplex<long double>
23#define AST_UTYPE_COMPLEX aurostd::xcomplex<float>, aurostd::xcomplex<double>, aurostd::xcomplex<long double>
24#define AST_UTYPE_NUM_STDCOMPLEX int, unsigned int, long int, long unsigned int, long long int, long long unsigned int, float, double, long double, std::complex<float>, std::complex<double>
25#define AST_UTYPE_FLOAT float, double, long double
26#define AST_UTYPE_INT int, long int, long long int
27#define AST_UTYPE_AINT int, unsigned int, long int, unsigned long int, long long int, unsigned long long int
28#define AST_UTYPE_UINT unsigned int, unsigned long int, unsigned long long int
29#define AST_UTYPE_TEXT std::string, char, char const*
30#define AST_UTYPE_STRING std::string
31#define AST_UTYPE_CHAR char
32#define AST_UTYPE_BOOL bool
33
34// Nested evaluations
35#define AST_FIRST(a, ...) a
36#define AST_SECOND(a, b, ...) b
37
38#define AST_EMPTY()
39
40#define AST_EVAL(...) AST_EVAL1024(__VA_ARGS__)
41#define AST_EVAL1024(...) AST_EVAL512(AST_EVAL512(__VA_ARGS__))
42#define AST_EVAL512(...) AST_EVAL256(AST_EVAL256(__VA_ARGS__))
43#define AST_EVAL256(...) AST_EVAL128(AST_EVAL128(__VA_ARGS__))
44#define AST_EVAL128(...) AST_EVAL64(AST_EVAL64(__VA_ARGS__))
45#define AST_EVAL64(...) AST_EVAL32(AST_EVAL32(__VA_ARGS__))
46#define AST_EVAL32(...) AST_EVAL16(AST_EVAL16(__VA_ARGS__))
47#define AST_EVAL16(...) AST_EVAL8(AST_EVAL8(__VA_ARGS__))
48#define AST_EVAL8(...) AST_EVAL4(AST_EVAL4(__VA_ARGS__))
49#define AST_EVAL4(...) AST_EVAL2(AST_EVAL2(__VA_ARGS__))
50#define AST_EVAL2(...) AST_EVAL1(AST_EVAL1(__VA_ARGS__))
51#define AST_EVAL1(...) __VA_ARGS__
52
53#define AST_DEFER1(m) m AST_EMPTY()
54#define AST_DEFER2(m) m AST_EMPTY AST_EMPTY()()
55#define AST_DEFER3(m) m AST_EMPTY AST_EMPTY AST_EMPTY()()()
56#define AST_DEFER4(m) m AST_EMPTY AST_EMPTY AST_EMPTY AST_EMPTY()()()()
57
58#define AST_IS_AST_PROBE(...) AST_SECOND(__VA_ARGS__, 0)
59#define AST_PROBE() ~, 1
60
61#define AST_CAT(a, b) a##b
62
63#define AST_NOT(x) AST_IS_AST_PROBE(AST_CAT(_AST_NOT_, x))
64#define _AST_NOT_0 AST_PROBE()
65
66#define AST_BOOL(x) AST_NOT(AST_NOT(x))
67
68#define AST_IF_ELSE(condition) _AST_IF_ELSE(AST_BOOL(condition))
69#define _AST_IF_ELSE(condition) AST_CAT(_IF_, condition)
70
71#define _IF_1(...) __VA_ARGS__ _IF_1_ELSE
72#define _IF_0(...) _IF_0_ELSE
73
74#define _IF_1_ELSE(...)
75#define _IF_0_ELSE(...) __VA_ARGS__
76
77#define AST_HAS_ARGS(...) AST_BOOL(AST_FIRST(_AST_END_OF_ARGUMENTS_ __VA_ARGS__)())
78#define AST_HAS_ARGS_2(skip1, ...) AST_BOOL(AST_FIRST(_AST_END_OF_ARGUMENTS_ __VA_ARGS__)())
79#define AST_HAS_ARGS_3(skip1, skip2, ...) AST_BOOL(AST_FIRST(_AST_END_OF_ARGUMENTS_ __VA_ARGS__)())
80#define _AST_END_OF_ARGUMENTS_() 0
81#define AST_INVOKE(macro, ...) macro(__VA_ARGS__)
82
83// logic for iterations up to 3 types
84// single utype
85#define AST_MAP(m, first, ...) \
86 m(first) AST_IF_ELSE(AST_HAS_ARGS(__VA_ARGS__))(AST_DEFER2(_AST_MAP)()(m, __VA_ARGS__))( /* Do nothing, just terminate */ \
87 )
88#define _AST_MAP() AST_MAP
89
90// dual utype
91#define AST_MAP2_1(m, first, ...) \
92 m(first, first) AST_IF_ELSE(AST_HAS_ARGS(__VA_ARGS__))(AST_DEFER2(_AST_MAP2_1)()(m, __VA_ARGS__))( /* Do nothing, just terminate */ \
93 )
94#define _AST_MAP2_1() AST_MAP2_1
95
96#define AST_MAP2_2(m, first, ...) \
97 AST_DEFER3(AST_MAP2_2_SUB(m, first, __VA_ARGS__)) \
98 AST_IF_ELSE(AST_HAS_ARGS_2(__VA_ARGS__))(AST_DEFER2(_AST_MAP2_2)()(m, __VA_ARGS__))( /* Do nothing, just terminate */ \
99 )
100#define _AST_MAP2_2() AST_MAP2_2
101
102#define AST_MAP2_2_SUB(m, first, second, ...) \
103 m(first, second) m(second, first) AST_IF_ELSE(AST_HAS_ARGS(__VA_ARGS__))(AST_DEFER2(_AST_MAP2_2_SUB)()(m, first, __VA_ARGS__))( /* Do nothing, just terminate */ \
104 )
105#define _AST_MAP2_2_SUB() AST_MAP2_2_SUB
106
107// Three types
108#define AST_MAP3_1(m, first, ...) \
109 m(first, first, first) AST_IF_ELSE(AST_HAS_ARGS(__VA_ARGS__))(AST_DEFER2(_AST_MAP3_1)()(m, __VA_ARGS__))( /* Do nothing, just terminate */ \
110 )
111#define _AST_MAP3_1() AST_MAP3_1
112
113#define AST_MAP3_2(m, first, ...) \
114 AST_DEFER4(AST_MAP3_2_SUB(m, first, __VA_ARGS__)) \
115 AST_IF_ELSE(AST_HAS_ARGS_3(__VA_ARGS__))(AST_DEFER3(_AST_MAP3_2)()(m, __VA_ARGS__))( /* Do nothing, just terminate */ \
116 )
117#define _AST_MAP3_2() AST_MAP3_2
118
119#define AST_MAP3_2_SUB(m, first, second, ...) \
120 m(first, second, second) m(second, first, second) m(second, second, first) m(second, first, first) m(first, second, first) \
121 AST_IF_ELSE(AST_HAS_ARGS(__VA_ARGS__))(AST_DEFER3(AST_MAP3_3_SUB(m, first, second, __VA_ARGS__)) AST_DEFER2(_AST_MAP3_2_SUB)()(m, first, __VA_ARGS__))( /* Do nothing, just terminate */ \
122 )
123#define _AST_MAP3_2_SUB() AST_MAP3_2_SUB
124
125#define AST_MAP3_3_SUB(m, first, second, third, ...) \
126 m(first, second, third) m(first, third, second) m(second, first, third) m(second, third, first) m(third, first, second) m(third, second, first) \
127 AST_IF_ELSE(AST_HAS_ARGS(__VA_ARGS__))(AST_DEFER2(AST_MAP3_3_SUB(m, first, second, __VA_ARGS__)))( /* Do nothing, just terminate */ \
128 )
129#define _AST_MAP3_3_SUB() AST_MAP3_3_SUB
130
151#define AST_GEN_1(type_selection) AST_EVAL(AST_INVOKE(AST_MAP, AST_TEMPLATE, type_selection))
152
173#define AST_GEN_2(type_selection) \
174 AST_EVAL(AST_INVOKE(AST_MAP2_1, AST_TEMPLATE, type_selection)) \
175 AST_EVAL(AST_INVOKE(AST_MAP2_2, AST_TEMPLATE, type_selection))
176
181#define AST_JSON_ACCESSOR(accessor, ...) AST_EVAL(AST_INVOKE(AST_MAP, accessor, __VA_ARGS__))
182
183#define JSON_GETTER(var) {#var, this->var},
185#define JSON_SETTER(var) this->var = static_cast<decltype(var)>(jo[#var]);
186
188#define AST_JSON_GETTER(...) AST_JSON_ACCESSOR(JSON_GETTER, __VA_ARGS__)
191#define AST_JSON_SETTER(...) AST_JSON_ACCESSOR(JSON_SETTER, __VA_ARGS__)
192
193#endif //_AUROSTD_AUTOMATIC_TEMPLATE_H_