Skip to content

Commit 76bf7e5

Browse files
committed
new style macros
1 parent 3cbedda commit 76bf7e5

File tree

2 files changed

+57
-110
lines changed

2 files changed

+57
-110
lines changed

include/yorel/yomm2/macros.hpp

Lines changed: 56 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -37,99 +37,67 @@
3737
#define yOMM2_WHEN_STATIC(CODE1, CODE2) CODE1
3838
#define yOMM2_WHEN_NOT_STATIC(CODE1, CODE2) CODE2
3939

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)
4442

4543
// Find method given the arguments. We cannot detect if __VAR_ARGS__ is empty,
4644
// so we cannot express the 'method<...>' type directly. Instead, we wrap
4745
// __VAR_ARGS__ in 'types<...>' and use 'method_macro_aux' find the method.
4846

49-
#define yOMM2_method(RETURN_TYPE, NAME, ARGS, ...) \
47+
#define YOREL_YOMM2_DETAIL_METHOD(RETURN_TYPE, NAME, ARGS, ...) \
5048
::yorel::yomm2::detail::method_macro_aux< \
51-
YOMM2_SYMBOL(NAME), RETURN_TYPE ARGS, \
49+
yorel_yomm2_##NAME, RETURN_TYPE ARGS, \
5250
::yorel::yomm2::detail::types<__VA_ARGS__>>::type
5351

5452
#define YOMM2_DECLARE(RETURN_TYPE, NAME, ARGS, ...) \
5553
yOMM2_DECLARE(yOMM2_WHEN_NOT_STATIC, RETURN_TYPE, NAME, ARGS, __VA_ARGS__)
54+
5655
#define YOMM2_STATIC_DECLARE(RETURN_TYPE, NAME, ARGS, ...) \
5756
yOMM2_DECLARE(yOMM2_WHEN_STATIC, RETURN_TYPE, NAME, ARGS, __VA_ARGS__)
5857

5958
#define yOMM2_DECLARE(IF_STATIC, RETURN_TYPE, NAME, ARGS, ...) \
60-
struct YOMM2_SYMBOL(NAME); \
59+
struct yorel_yomm2_##NAME; \
6160
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__); \
6464
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( \
7166
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)); \
7470
}
7571

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; \
11686
}; \
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, )
133101

134102
#define YOMM2_DECLARE_METHOD_CONTAINER_1(CONTAINER) \
135103
template<typename S> \
@@ -152,26 +120,22 @@
152120
} \
153121
template<> \
154122
struct CONTAINER<RETURN_TYPE ARGS> { \
155-
static NS::_yOMM2_method::next_type next; \
123+
static NS::_YOREL_YOMM2_DETAIL_METHOD::next_type next; \
156124
static RETURN_TYPE fn ARGS; \
157125
}
158126

159127
#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> \
171136
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
175139

176140
#if !BOOST_PP_VARIADICS_MSVC
177141
#define YOMM2_FRIEND(...) \
@@ -198,33 +162,16 @@
198162
__VA_ARGS__, YOMM2_DEFAULT_POLICY> \
199163
YOMM2_GENSYM;
200164

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__>
220167

221168
#define register_classes YOMM2_CLASSES
222169

223170
#define declare_method YOMM2_DECLARE
224171
#define declare_static_method YOMM2_STATIC_DECLARE
225172
#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
228175

229176
#define method_container YOMM2_DECLARE_METHOD_CONTAINER
230177
#define friend_method YOMM2_FRIEND

include/yorel/yomm2/symbols.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88

99
#define YOMM2_STATIC(...) static __VA_ARGS__ YOMM2_GENSYM
1010

11-
#define YOMM2_SYMBOL(ID) BOOST_PP_CAT(YoMm2_S_, ID)
11+
#define YOMM2_SYMBOL(ID) BOOST_PP_CAT(yorel_yomm2_, ID)
1212

1313
#endif

0 commit comments

Comments
 (0)