|
37 | 37 | #define yOMM2_WHEN_STATIC(CODE1, CODE2) CODE1
|
38 | 38 | #define yOMM2_WHEN_NOT_STATIC(CODE1, CODE2) CODE2
|
39 | 39 |
|
40 |
| -#define yOMM2_OPEN_BRACE { |
41 |
| -#define yOMM2_CLOSE_BRACE } |
42 |
| - |
43 |
| -#define yOMM2_SELECTOR(NAME) NAME##_yOMM2_selector_ |
| 40 | +#define YOMM2_PREFIX yomm2__ |
| 41 | +#define YOMM2_NAME(NAME) BOOST_PP_CAT(YOMM2_PREFIX, NAME) |
44 | 42 |
|
45 | 43 | // Find method given the arguments. We cannot detect if __VAR_ARGS__ is empty,
|
46 | 44 | // so we cannot express the 'method<...>' type directly. Instead, we wrap
|
47 | 45 | // __VAR_ARGS__ in 'types<...>' and use 'method_macro_aux' find the method.
|
48 | 46 |
|
49 |
| -#define yOMM2_method(RETURN_TYPE, NAME, ARGS, ...) \ |
| 47 | +#define YOREL_YOMM2_DETAIL_METHOD(RETURN_TYPE, NAME, ARGS, ...) \ |
50 | 48 | ::yorel::yomm2::detail::method_macro_aux< \
|
51 |
| - YOMM2_SYMBOL(NAME), RETURN_TYPE ARGS, \ |
| 49 | + yorel_yomm2_##NAME, RETURN_TYPE ARGS, \ |
52 | 50 | ::yorel::yomm2::detail::types<__VA_ARGS__>>::type
|
53 | 51 |
|
54 | 52 | #define YOMM2_DECLARE(RETURN_TYPE, NAME, ARGS, ...) \
|
55 | 53 | yOMM2_DECLARE(yOMM2_WHEN_NOT_STATIC, RETURN_TYPE, NAME, ARGS, __VA_ARGS__)
|
| 54 | + |
56 | 55 | #define YOMM2_STATIC_DECLARE(RETURN_TYPE, NAME, ARGS, ...) \
|
57 | 56 | yOMM2_DECLARE(yOMM2_WHEN_STATIC, RETURN_TYPE, NAME, ARGS, __VA_ARGS__)
|
58 | 57 |
|
59 | 58 | #define yOMM2_DECLARE(IF_STATIC, RETURN_TYPE, NAME, ARGS, ...) \
|
60 |
| - struct YOMM2_SYMBOL(NAME); \ |
| 59 | + struct yorel_yomm2_##NAME; \ |
61 | 60 | IF_STATIC(static, ) \
|
62 |
| - yOMM2_method(RETURN_TYPE, NAME, ARGS, __VA_ARGS__) yOMM2_SELECTOR(NAME)( \ |
63 |
| - BOOST_PP_REPEAT(BOOST_PP_TUPLE_SIZE(ARGS), yOMM2_PLIST, ARGS)); \ |
| 61 | + auto _yorel_yomm2_detail_guide_( \ |
| 62 | + BOOST_PP_REPEAT(BOOST_PP_TUPLE_SIZE(ARGS), yOMM2_PLIST, ARGS)) \ |
| 63 | + ->YOREL_YOMM2_DETAIL_METHOD(RETURN_TYPE, NAME, ARGS, __VA_ARGS__); \ |
64 | 64 | IF_STATIC(static, ) \
|
65 |
| - inline const char* yOMM2_SELECTOR(NAME)( \ |
66 |
| - const yOMM2_method(RETURN_TYPE, NAME, ARGS, __VA_ARGS__)&) { \ |
67 |
| - return #RETURN_TYPE " " #NAME #ARGS; \ |
68 |
| - } \ |
69 |
| - IF_STATIC(static, ) \ |
70 |
| - inline RETURN_TYPE NAME( \ |
| 65 | + BOOST_FORCEINLINE RETURN_TYPE NAME( \ |
71 | 66 | BOOST_PP_REPEAT(BOOST_PP_TUPLE_SIZE(ARGS), yOMM2_PLIST, ARGS)) { \
|
72 |
| - return yOMM2_method(RETURN_TYPE, NAME, ARGS, __VA_ARGS__)::fn( \ |
73 |
| - BOOST_PP_REPEAT(BOOST_PP_TUPLE_SIZE(ARGS), yOMM2_ALIST, ARGS)); \ |
| 67 | + return YOREL_YOMM2_DETAIL_METHOD( \ |
| 68 | + RETURN_TYPE, NAME, ARGS, __VA_ARGS__):: \ |
| 69 | + fn(BOOST_PP_REPEAT(BOOST_PP_TUPLE_SIZE(ARGS), yOMM2_ALIST, ARGS)); \ |
74 | 70 | }
|
75 | 71 |
|
76 |
| -#if defined(YOMM2_ENABLE_TRACE) && (YOMM2_ENABLE_TRACE & 1) || !defined(NDEBUG) |
77 |
| -#define yOMM2_NAME(FROM_TYPEID, HUMAN_READABLE) HUMAN_READABLE |
78 |
| -#else |
79 |
| -#define yOMM2_NAME(FROM_TYPEID, HUMAN_READABLE) FROM_TYPEID |
80 |
| -#endif |
81 |
| - |
82 |
| -#if !BOOST_PP_VARIADICS_MSVC |
83 |
| -#define YOMM2_DEFINE(...) \ |
84 |
| - BOOST_PP_OVERLOAD(YOMM2_DEFINE_, __VA_ARGS__)(__VA_ARGS__) |
85 |
| -#else |
86 |
| -#define YOMM2_DEFINE(...) \ |
87 |
| - BOOST_PP_CAT( \ |
88 |
| - BOOST_PP_OVERLOAD(YOMM2_DEFINE_, __VA_ARGS__)(__VA_ARGS__), \ |
89 |
| - BOOST_PP_EMPTY()) |
90 |
| -#endif |
91 |
| - |
92 |
| -#define YOMM2_DEFINE_3(RETURN_TYPE, NAME, ARGS) \ |
93 |
| - yOMM2_DEFINE(YOMM2_GENSYM, RETURN_TYPE, NAME, ARGS) |
94 |
| - |
95 |
| -#define YOMM2_DEFINE_4(CONTAINER, RETURN_TYPE, NAME, ARGS) \ |
96 |
| - yOMM2_DEFINE_IN_CONTAINER( \ |
97 |
| - YOMM2_GENSYM, , CONTAINER, RETURN_TYPE, NAME, ARGS) |
98 |
| - |
99 |
| -#define yOMM2_SELECT_METHOD(RETURN_TYPE, NAME, ARGS) \ |
100 |
| - template<typename T> \ |
101 |
| - struct _yOMM2_select; \ |
102 |
| - template<typename... A> \ |
103 |
| - struct _yOMM2_select<void(A...)> { \ |
104 |
| - using type = decltype(yOMM2_SELECTOR(NAME)(std::declval<A>()...)); \ |
105 |
| - }; \ |
106 |
| - using _yOMM2_method = _yOMM2_select<void ARGS>::type; \ |
107 |
| - using _yOMM2_return_t = _yOMM2_method::return_type; |
108 |
| - |
109 |
| -#define yOMM2_DEFINE(NS, RETURN_TYPE, NAME, ARGS) \ |
110 |
| - namespace { \ |
111 |
| - namespace NS { \ |
112 |
| - yOMM2_SELECT_METHOD(RETURN_TYPE, NAME, ARGS); \ |
113 |
| - _yOMM2_method::next_type next; \ |
114 |
| - struct _yOMM2_spec { \ |
115 |
| - static NS::_yOMM2_method::return_type yOMM2_body ARGS; \ |
| 72 | +#define YOMM2_DEFINE_X(PREFIX, RETURN_TYPE, NAME, ARGS, SUFFIX) \ |
| 73 | + template<typename...> \ |
| 74 | + struct yorel_yomm2_overriders; \ |
| 75 | + template<> \ |
| 76 | + struct yorel_yomm2_overriders<RETURN_TYPE, yorel_yomm2_##NAME ARGS> { \ |
| 77 | + template<typename> \ |
| 78 | + struct _yorel_yomm2_detail_method_; \ |
| 79 | + template<typename... Parameters> \ |
| 80 | + struct _yorel_yomm2_detail_method_<void(Parameters...)> { \ |
| 81 | + using type = decltype(_yorel_yomm2_detail_guide_( \ |
| 82 | + std::declval<Parameters>()...)); \ |
| 83 | + }; \ |
| 84 | + static _yorel_yomm2_detail_method_<void ARGS>::type::next_type next; \ |
| 85 | + static auto fn ARGS->RETURN_TYPE; \ |
116 | 86 | }; \
|
117 |
| - _yOMM2_method::override_fn<_yOMM2_spec::yOMM2_body> YOMM2_GENSYM(&next); \ |
118 |
| - } \ |
119 |
| - } \ |
120 |
| - NS::_yOMM2_method::return_type NS::_yOMM2_spec::yOMM2_body ARGS |
121 |
| - |
122 |
| -#if !BOOST_PP_VARIADICS_MSVC |
123 |
| -#define YOMM2_DECLARE_METHOD_CONTAINER(...) \ |
124 |
| - BOOST_PP_OVERLOAD(YOMM2_DECLARE_METHOD_CONTAINER_, __VA_ARGS__) \ |
125 |
| - (__VA_ARGS__) |
126 |
| -#else |
127 |
| -#define YOMM2_DECLARE_METHOD_CONTAINER(...) \ |
128 |
| - BOOST_PP_CAT( \ |
129 |
| - BOOST_PP_OVERLOAD(YOMM2_DECLARE_METHOD_CONTAINER_, __VA_ARGS__)( \ |
130 |
| - __VA_ARGS__), \ |
131 |
| - BOOST_PP_EMPTY()) |
132 |
| -#endif |
| 87 | + yorel_yomm2_overriders<RETURN_TYPE, yorel_yomm2_##NAME ARGS>:: \ |
| 88 | + _yorel_yomm2_detail_method_<void ARGS>::type::next_type \ |
| 89 | + yorel_yomm2_overriders< \ |
| 90 | + RETURN_TYPE, yorel_yomm2_##NAME ARGS>::next; \ |
| 91 | + YOMM2_STATIC( \ |
| 92 | + yorel_yomm2_overriders<RETURN_TYPE, yorel_yomm2_##NAME ARGS>:: \ |
| 93 | + _yorel_yomm2_detail_method_<void ARGS>::type::override< \ |
| 94 | + yorel_yomm2_overriders< \ |
| 95 | + RETURN_TYPE, yorel_yomm2_##NAME ARGS>>); \ |
| 96 | + auto yorel_yomm2_overriders<RETURN_TYPE, yorel_yomm2_##NAME ARGS>::fn ARGS \ |
| 97 | + ->RETURN_TYPE |
| 98 | + |
| 99 | +#define YOMM2_DEFINE(RETURN_TYPE, NAME, ARGS) \ |
| 100 | + YOMM2_DEFINE_X(, RETURN_TYPE, NAME, ARGS, ) |
133 | 101 |
|
134 | 102 | #define YOMM2_DECLARE_METHOD_CONTAINER_1(CONTAINER) \
|
135 | 103 | template<typename S> \
|
|
152 | 120 | } \
|
153 | 121 | template<> \
|
154 | 122 | struct CONTAINER<RETURN_TYPE ARGS> { \
|
155 |
| - static NS::_yOMM2_method::next_type next; \ |
| 123 | + static NS::_YOREL_YOMM2_DETAIL_METHOD::next_type next; \ |
156 | 124 | static RETURN_TYPE fn ARGS; \
|
157 | 125 | }
|
158 | 126 |
|
159 | 127 | #define YOMM2_DEFINE_INLINE(CONTAINER, RETURN_TYPE, NAME, ARGS) \
|
160 |
| - yOMM2_DEFINE_IN_CONTAINER( \ |
161 |
| - YOMM2_GENSYM, inline, CONTAINER, RETURN_TYPE, NAME, ARGS) |
162 |
| - |
163 |
| -#define yOMM2_DEFINE_IN_CONTAINER( \ |
164 |
| - NS, Inline, CONTAINER, RETURN_TYPE, NAME, ARGS) \ |
165 |
| - YOMM2_DECLARE_METHOD_CONTAINER_4_NS( \ |
166 |
| - NS, CONTAINER, RETURN_TYPE, NAME, ARGS); \ |
167 |
| - Inline NS::_yOMM2_method::next_type CONTAINER<RETURN_TYPE ARGS>::next; \ |
168 |
| - namespace { \ |
169 |
| - namespace NS { \ |
170 |
| - Inline _yOMM2_method::override_fn<CONTAINER<RETURN_TYPE ARGS>::fn> \ |
| 128 | + yOMM2_DEFINE_IN_CONTAINER(INLINE, CONTAINER, RETURN_TYPE, NAME, ARGS) |
| 129 | + |
| 130 | +#define yOMM2_DEFINE_IN_CONTAINER(INLINE, CONTAINER, RETURN_TYPE, NAME, ARGS) \ |
| 131 | + YOMM2_DECLARE_METHOD_CONTAINER_4_NS(CONTAINER, RETURN_TYPE, NAME, ARGS); \ |
| 132 | + INLINE _YOREL_YOMM2_DETAIL_METHOD::next_type \ |
| 133 | + CONTAINER<RETURN_TYPE ARGS>::next; \ |
| 134 | + INLINE _YOREL_YOMM2_DETAIL_METHOD::override_fn< \ |
| 135 | + CONTAINER<RETURN_TYPE ARGS>::fn> \ |
171 | 136 | YOMM2_GENSYM(&CONTAINER<RETURN_TYPE ARGS>::next); \
|
172 |
| - } \ |
173 |
| - } \ |
174 |
| - Inline NS::_yOMM2_method::return_type CONTAINER<RETURN_TYPE ARGS>::fn ARGS |
| 137 | + INLINE _YOREL_YOMM2_DETAIL_METHOD::return_type \ |
| 138 | + CONTAINER<RETURN_TYPE ARGS>::fn ARGS |
175 | 139 |
|
176 | 140 | #if !BOOST_PP_VARIADICS_MSVC
|
177 | 141 | #define YOMM2_FRIEND(...) \
|
|
198 | 162 | __VA_ARGS__, YOMM2_DEFAULT_POLICY> \
|
199 | 163 | YOMM2_GENSYM;
|
200 | 164 |
|
201 |
| -#define YOMM2_METHOD_CLASS(RETURN_TYPE, NAME, ...) \ |
202 |
| - ::yorel::yomm2::method<YOMM2_SYMBOL(NAME), RETURN_TYPE __VA_ARGS__> |
203 |
| - |
204 |
| -// #if !BOOST_PP_VARIADICS_MSVC |
205 |
| -// #define YOMM2_METHOD_CLASS(...) \ |
206 |
| -// BOOST_PP_OVERLOAD(YOMM2_METHOD_CLASS_, __VA_ARGS__)(__VA_ARGS__) |
207 |
| -// #else |
208 |
| -// #define YOMM2_METHOD_CLASS(...) \ |
209 |
| -// BOOST_PP_CAT( \ |
210 |
| -// BOOST_PP_OVERLOAD(YOMM2_METHOD_CLASS_, __VA_ARGS__)(__VA_ARGS__), \ |
211 |
| -// BOOST_PP_EMPTY()) |
212 |
| -// #endif |
213 |
| - |
214 |
| -// #define YOMM2_METHOD_CLASS_3(RETURN_TYPE, NAME, ARGS) \ |
215 |
| -// ::yorel::yomm2::method< \ |
216 |
| -// YOMM2_SYMBOL(NAME), RETURN_TYPE ARGS, YOMM2_DEFAULT_POLICY> |
217 |
| - |
218 |
| -// #define YOMM2_METHOD_CLASS_4(RETURN_TYPE, NAME, ARGS, POLICY) \ |
219 |
| -// ::yorel::yomm2::method<YOMM2_SYMBOL(NAME), RETURN_TYPE ARGS, POLICY> |
| 165 | +#define YOREL_YOMM2_DETAIL_METHOD_CLASS(RETURN_TYPE, NAME, ...) \ |
| 166 | + ::yorel::yomm2::method<yorel_yomm2_##NAME, RETURN_TYPE __VA_ARGS__> |
220 | 167 |
|
221 | 168 | #define register_classes YOMM2_CLASSES
|
222 | 169 |
|
223 | 170 | #define declare_method YOMM2_DECLARE
|
224 | 171 | #define declare_static_method YOMM2_STATIC_DECLARE
|
225 | 172 | #define define_method YOMM2_DEFINE
|
226 |
| -#define define_method_inline YOMM2_DEFINE_INLINE |
227 |
| -#define method_class YOMM2_METHOD_CLASS |
| 173 | +#define define_method_INLINE YOMM2_DEFINE_INLINE |
| 174 | +#define method_class YOREL_YOMM2_DETAIL_METHOD_CLASS |
228 | 175 |
|
229 | 176 | #define method_container YOMM2_DECLARE_METHOD_CONTAINER
|
230 | 177 | #define friend_method YOMM2_FRIEND
|
|
0 commit comments