Loading...
Searching...
No Matches
byeolMetaExtension.hpp
Go to the documentation of this file.
1
2#pragma once
3
4#include "core/common/dep.hpp"
5
6// INTERFACE:
7// marks that this class is abstract.
8#define __BY__DECL_ADT_1(ME) \
9 __BY__DECL_ME_1(ME) \
10 __BY__DECL_TYPE(ntype) \
11 __BY__DECL_INIT_META(ME)
12#define __BY__DECL_ADT_2(ME, SUPER) __BY__DECL_ADT_3(ME, SUPER, ntype)
13#define __BY__DECL_ADT_3(ME, SUPER, SUPERTYPE) \
14 __BY__DECL_ME_2(ME, SUPER) \
15 __BY__DECL_TYPE(SUPERTYPE) \
16 __BY__DECL_INIT_META(ME)
17#define __BY__DECL_ADT(...) BY_OVERLOAD(__BY__DECL_ADT, __VA_ARGS__)
18
19// CLASS:
20// marks that this class is concrete class.
21#define __BY__DECL_CLASS_1(ME) \
22 __BY__DECL_ADT_1(ME) \
23 __BY__DECL_CLONE(ME)
24#define __BY__DECL_CLASS_2(ME, SUPER) \
25 __BY__DECL_ADT_2(ME, SUPER) \
26 __BY__DECL_CLONE(ME)
27#define __BY__DECL_CLASS_3(ME, SUPER, SUPERTYPE) \
28 __BY__DECL_ADT_3(ME, SUPER, SUPERTYPE) \
29 __BY__DECL_CLONE(ME)
30#define __BY__DECL_CLASS(...) BY_OVERLOAD(__BY__DECL_CLASS, __VA_ARGS__)
31
32// ACCEPT:
33// accept the visitor and let it can iterate sub elements.
34// please check 'visitor' class for more info.
35#define __BY__DECL_VISIT_0() __BY__DECL_VISIT_1(super)
36#define __BY__DECL_VISIT_1(SUPER) \
37public: \
38 using SUPER::accept; \
39 void accept(const visitInfo& i, visitor& v) override; \
40 \
41private:
42#define __BY__DECL_VISIT(...) BY_OVERLOAD(__BY__DECL_VISIT, __VA_ARGS__)
43
44#define __BY__DECL_DEF_VISIT_0() __BY__DECL_DEF_VISIT_1(me)
45#define __BY__DECL_DEF_VISIT_1(ME) \
46 void ME::accept(const visitInfo& i, visitor& v) { v.visit(i, *this); }
47#define __BY__DECL_DEF_VISIT(...) BY_OVERLOAD(__BY__DECL_DEF_VISIT, __VA_ARGS__)
to Top