Go to the documentation of this file. 1#ifndef GRID_MACRO_MAGIC_H
2#define GRID_MACRO_MAGIC_H
46#define MAX(x,y) ((x)>(y)?(x):(y))
47#define MIN(x,y) ((x)>(y)?(y):(x))
50#define GRID_MACRO_FIRST(a, ...) a
51#define GRID_MACRO_SECOND(a, b, ...) b
53#define GRID_MACRO_EMPTY()
55#define GRID_MACRO_EVAL(...) GRID_MACRO_EVAL64(__VA_ARGS__)
56#define GRID_MACRO_EVAL1024(...) GRID_MACRO_EVAL512(GRID_MACRO_EVAL512(__VA_ARGS__))
57#define GRID_MACRO_EVAL512(...) GRID_MACRO_EVAL256(GRID_MACRO_EVAL256(__VA_ARGS__))
58#define GRID_MACRO_EVAL256(...) GRID_MACRO_EVAL128(GRID_MACRO_EVAL128(__VA_ARGS__))
59#define GRID_MACRO_EVAL128(...) GRID_MACRO_EVAL64(GRID_MACRO_EVAL64(__VA_ARGS__))
60#define GRID_MACRO_EVAL64(...) GRID_MACRO_EVAL32(GRID_MACRO_EVAL32(__VA_ARGS__))
61#define GRID_MACRO_EVAL32(...) GRID_MACRO_EVAL16(GRID_MACRO_EVAL16(__VA_ARGS__))
62#define GRID_MACRO_EVAL16(...) GRID_MACRO_EVAL8(GRID_MACRO_EVAL8(__VA_ARGS__))
63#define GRID_MACRO_EVAL8(...) GRID_MACRO_EVAL4(GRID_MACRO_EVAL4(__VA_ARGS__))
64#define GRID_MACRO_EVAL4(...) GRID_MACRO_EVAL2(GRID_MACRO_EVAL2(__VA_ARGS__))
65#define GRID_MACRO_EVAL2(...) GRID_MACRO_EVAL1(GRID_MACRO_EVAL1(__VA_ARGS__))
66#define GRID_MACRO_EVAL1(...) __VA_ARGS__
68#define GRID_MACRO_DEFER1(m) m GRID_MACRO_EMPTY()
69#define GRID_MACRO_DEFER2(m) m GRID_MACRO_EMPTY GRID_MACRO_EMPTY()()
70#define GRID_MACRO_DEFER3(m) m GRID_MACRO_EMPTY GRID_MACRO_EMPTY GRID_MACRO_EMPTY()()()
71#define GRID_MACRO_DEFER4(m) m GRID_MACRO_EMPTY GRID_MACRO_EMPTY GRID_MACRO_EMPTY GRID_MACRO_EMPTY()()()()
73#define GRID_MACRO_IS_PROBE(...) GRID_MACRO_SECOND(__VA_ARGS__, 0)
74#define GRID_MACRO_PROBE() ~, 1
76#define GRID_MACRO_CAT(a,b) a ## b
78#define GRID_MACRO_NOT(x) GRID_MACRO_IS_PROBE(GRID_MACRO_CAT(_GRID_MACRO_NOT_, x))
79#define _GRID_MACRO_NOT_0 GRID_MACRO_PROBE()
81#define GRID_MACRO_BOOL(x) GRID_MACRO_NOT(GRID_MACRO_NOT(x))
83#define GRID_MACRO_IF_ELSE(condition) _GRID_MACRO_IF_ELSE(GRID_MACRO_BOOL(condition))
84#define _GRID_MACRO_IF_ELSE(condition) GRID_MACRO_CAT(_GRID_MACRO_IF_, condition)
86#define _GRID_MACRO_IF_1(...) __VA_ARGS__ _GRID_MACRO_IF_1_ELSE
87#define _GRID_MACRO_IF_0(...) _GRID_MACRO_IF_0_ELSE
89#define _GRID_MACRO_IF_1_ELSE(...)
90#define _GRID_MACRO_IF_0_ELSE(...) __VA_ARGS__
92#define GRID_MACRO_HAS_ARGS(...) GRID_MACRO_BOOL(GRID_MACRO_FIRST(_GRID_MACRO_END_OF_ARGUMENTS_ __VA_ARGS__)())
93#define _GRID_MACRO_END_OF_ARGUMENTS_() 0
95#define GRID_MACRO_MAP(m, first, second, ...) \
97 GRID_MACRO_IF_ELSE(GRID_MACRO_HAS_ARGS(__VA_ARGS__))( \
98 GRID_MACRO_DEFER4(_GRID_MACRO_MAP)()(m, __VA_ARGS__) \
103#define _GRID_MACRO_MAP() GRID_MACRO_MAP
109#define GRID_MACRO_MEMBER(A,B) A B;
111#define GRID_MACRO_COMP_MEMBER(A,B) result = (result and CompareMember(lhs. B, rhs. B));
112#define GRID_MACRO_OS_WRITE_MEMBER(A,B) os<< #A <<" " #B << " = "; WriteMember( os, obj. B ); os << " ; " <<std::endl;
113#define GRID_MACRO_READ_MEMBER(A,B) ::Grid::read(RD,#B,obj. B);
114#define GRID_MACRO_WRITE_MEMBER(A,B) ::Grid::write(WR,#B,obj. B);
116#define GRID_SERIALIZABLE_CLASS_MEMBERS(cname,...)\
117static inline std::string SerialisableClassName(void) {return std::string(#cname);} \
118static constexpr bool isEnum = false; \
119GRID_MACRO_EVAL(GRID_MACRO_MAP(GRID_MACRO_MEMBER,__VA_ARGS__))\
120template <typename T>\
121static inline void write(::Grid::Writer<T> &WR,const std::string &s, const cname &obj){ \
123 GRID_MACRO_EVAL(GRID_MACRO_MAP(GRID_MACRO_WRITE_MEMBER,__VA_ARGS__)) \
126template <typename T>\
127static inline void read(::Grid::Reader<T> &RD,const std::string &s, cname &obj){ \
130 std::cout << ::Grid::GridLogWarning << "IO: Cannot open node '" << s << "'" << std::endl; \
133 GRID_MACRO_EVAL(GRID_MACRO_MAP(GRID_MACRO_READ_MEMBER,__VA_ARGS__)) \
136friend inline std::ostream & operator << (std::ostream &os, const cname &obj ) { \
137 os<<"class "<<#cname<<" {"<<std::endl;\
138 GRID_MACRO_EVAL(GRID_MACRO_MAP(GRID_MACRO_OS_WRITE_MEMBER,__VA_ARGS__)) \
142friend inline bool operator==(const cname &lhs, const cname &rhs) {\
144 GRID_MACRO_EVAL(GRID_MACRO_MAP(GRID_MACRO_COMP_MEMBER,__VA_ARGS__))\
148#define GRID_ENUM_TYPE(obj) std::remove_reference<decltype(obj)>::type
149#define GRID_MACRO_ENUMVAL(A,B) A = B,
150#define GRID_MACRO_ENUMCASE(A,B) case GRID_ENUM_TYPE(obj)::A: ::Grid::write(WR,s,#A); break;
151#define GRID_MACRO_ENUMTEST(A,B) else if (buf == #A) {obj = GRID_ENUM_TYPE(obj)::A;}
152#define GRID_MACRO_ENUMCASEIO(A,B) case GRID_ENUM_TYPE(obj)::A: os << #A; break;
154#define GRID_SERIALIZABLE_ENUM(name,undefname,...)\
155class name: public ::Grid::Serializable \
160 GRID_MACRO_EVAL(GRID_MACRO_MAP(GRID_MACRO_ENUMVAL,__VA_ARGS__))\
164 accelerator name(void) : value_(undefname) {}; \
165 accelerator name(int value): value_(value) {}; \
166 static inline std::string SerialisableClassName(void) {return std::string(#name);}\
167 static constexpr bool isEnum = true; \
168 template <typename T>\
169 static inline void write(::Grid::Writer<T> &WR,const std::string &s, const name &obj) \
173 GRID_MACRO_EVAL(GRID_MACRO_MAP(GRID_MACRO_ENUMCASE,__VA_ARGS__))\
174 default: ::Grid::write(WR,s,#undefname); break;\
178 template <typename T>\
179 static inline void read(::Grid::Reader<T> &RD,const std::string &s, name &obj)\
182 ::Grid::read(RD, s, buf);\
183 if (buf == #undefname) {obj = name::undefname;}\
184 GRID_MACRO_EVAL(GRID_MACRO_MAP(GRID_MACRO_ENUMTEST,__VA_ARGS__))\
185 else {obj = name::undefname;}\
187 accelerator_inline operator int(void) const\
191 inline friend std::ostream & operator<<(std::ostream &os, const name &obj)\
194 GRID_MACRO_EVAL(GRID_MACRO_MAP(GRID_MACRO_ENUMCASEIO,__VA_ARGS__))\
195 default: os << #undefname; break;\
199 inline friend std::istream & operator>>(std::istream &is, name &obj)\
203 if (buf == #undefname) {obj = name::undefname;}\
204 GRID_MACRO_EVAL(GRID_MACRO_MAP(GRID_MACRO_ENUMTEST,__VA_ARGS__))\
205 else {obj = name::undefname;}\