Skip to content

Commit a3b4ec5

Browse files
committed
more macro work
1 parent 861037f commit a3b4ec5

File tree

7 files changed

+46
-72
lines changed

7 files changed

+46
-72
lines changed

examples/containers/arc_painter.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,12 @@ register_classes(geometries::Arc, geometries::Line);
1919
namespace painter {
2020
namespace paint1d {
2121

22-
define_method(
22+
define_method_in(
2323
painters, paintObject, (Painter & painter, const geometries::Arc& arc),
2424
void) {
2525
++painter.counter;
26-
method_definition(
27-
painters, paintObject,
28-
(Painter&, const geometries::Line&))(painter, arc);
29-
std::cout << " "
30-
<< "painting arc\n";
26+
painters<void(Painter&, const geometries::Line&)>::fn(painter, arc);
27+
std::cout << " " << "painting arc\n";
3128
}
3229

3330
} // namespace paint1d

examples/containers/concrete_shape_painters.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include <iostream>
1010

1111
#include "geometries.hpp"
12-
#include "shape_painter.hpp"
12+
#include "painter.hpp"
1313

1414
register_classes(
1515
geometries::Geometry, geometries::Shape, geometries::Square,
@@ -18,20 +18,17 @@ register_classes(
1818
namespace painter {
1919
namespace paint2d {
2020

21-
define_method(
21+
define_method_in(
2222
painters, paintObject,
2323
(Painter & painter, const geometries::Square& square), void) {
24-
method_definition(
25-
painters, paintObject,
26-
(Painter&, const geometries::Shape&))(painter, square);
24+
next(painter, square);
2725
std::cout << "painting square\n";
2826
}
2927

30-
define_method(
28+
define_method_in(
3129
painters, paintObject,
3230
(Painter & painter, const geometries::Circle& circle), void) {
33-
painters<YOMM2_SYMBOL(paintObject)(Painter&, const geometries::Shape&)>::fn(
34-
painter, circle);
31+
next(painter, circle);
3532
std::cout << "painting Circle\n";
3633
}
3734

examples/containers/painter.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ class Painter {
3636

3737
private:
3838
int counter = 0;
39-
friend_method(paint1d::painters);
40-
friend_method(
41-
paint2d::painters, paintObject, (Painter&, const geometries::Shape&));
39+
template<typename> friend struct paint1d::painters;
40+
friend paint2d::painters<void(Painter&, const geometries::Shape&)>;
4241
};
4342

4443
inline void Painter::paint(const geometries::Geometry& geometry) {

examples/containers/segment_painter.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@ register_classes(geometries::Segment, geometries::Line);
1919
namespace painter {
2020
namespace paint1d {
2121

22-
define_method(
22+
define_method_in(
2323
painters, paintObject,
2424
(Painter & painter, const geometries::Segment& segment), void) {
2525
++painter.counter;
26-
method_definition(painters, paintObject, (Painter&, const geometries::Line&))(
27-
painter, segment);
26+
painters<void(Painter&, const geometries::Line&)>::fn(painter, segment);
2827
std::cout << " "
2928
<< "painting segment\n";
3029
}

examples/containers/shape_painter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ register_classes(geometries::Shape, geometries::Geometry);
1515
namespace painter {
1616
namespace paint2d {
1717

18-
define_method(
18+
define_method_in(
1919
painters, paintObject, (Painter & painter, const geometries::Shape& shape),
2020
void) {
2121
++painter.counter;

examples/containers/shape_painter.hpp

Lines changed: 0 additions & 24 deletions
This file was deleted.

include/yorel/yomm2/macros.hpp

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@
6767
BOOST_PP_REPEAT(BOOST_PP_TUPLE_SIZE(ARGS), yOMM2_ALIST, ARGS)); \
6868
}
6969

70-
#define YOMM2_DEFINE(NAME, ARGS, ...) \
70+
#define YOMM2_DEFINE(NAME, ARGS, ...) \
7171
yOMM2_DEFINE(YOMM2_GENSYM, NAME, ARGS, __VA_ARGS__)
7272

73-
#define YOMM2_DEFINE_IN(CONTAINER, NAME, ARGS, ...) \
73+
#define YOMM2_DEFINE_IN(CONTAINER, NAME, ARGS, ...) \
7474
yOMM2_DEFINE_IN_CONTAINER( \
7575
YOMM2_GENSYM, , CONTAINER, NAME, ARGS, __VA_ARGS__)
7676

@@ -112,25 +112,26 @@
112112
#endif
113113

114114
#define YOMM2_DECLARE_METHOD_CONTAINER_1(CONTAINER) \
115-
template<typename S> \
115+
template<typename> \
116116
struct CONTAINER
117117

118118
#define YOMM2_DECLARE_METHOD_CONTAINER_4(CONTAINER, NAME, ARGS, ...) \
119-
template<typename S> \
119+
template<typename> \
120120
struct CONTAINER; \
121121
YOMM2_DECLARE_METHOD_CONTAINER_4_NS( \
122122
YOMM2_GENSYM, CONTAINER, NAME, ARGS, __VA_ARGS__)
123123

124124
#define YOMM2_DECLARE_METHOD_CONTAINER_4_NS(NS, CONTAINER, NAME, ARGS, ...) \
125-
template<typename S> \
125+
template<typename> \
126126
struct CONTAINER; \
127127
namespace { \
128128
namespace NS { \
129129
yOMM2_SELECT_METHOD(NAME, ARGS); \
130130
} \
131131
} \
132132
template<> \
133-
struct CONTAINER<YOMM2_SYMBOL(NAME) ARGS> { \
133+
struct CONTAINER< \
134+
boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>> ARGS> { \
134135
static NS::_yOMM2_method::next_type next; \
135136
static boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>> fn \
136137
ARGS; \
@@ -143,36 +144,40 @@
143144
#define yOMM2_DEFINE_IN_CONTAINER(NS, INLINE, CONTAINER, NAME, ARGS, ...) \
144145
YOMM2_DECLARE_METHOD_CONTAINER_4_NS( \
145146
NS, CONTAINER, NAME, ARGS, __VA_ARGS__); \
146-
INLINE NS::_yOMM2_method::next_type \
147-
CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::next; \
147+
INLINE NS::_yOMM2_method::next_type CONTAINER< \
148+
boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>>(ARGS)>::next; \
148149
namespace { \
149150
namespace NS { \
150-
INLINE _yOMM2_method::override_fn<CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::fn> \
151-
YOMM2_GENSYM(&CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::next); \
151+
INLINE _yOMM2_method::override_fn<CONTAINER< \
152+
boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>> ARGS>::fn> \
153+
YOMM2_GENSYM( \
154+
&CONTAINER<boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>> \
155+
ARGS>::next); \
152156
} \
153157
} \
154158
INLINE boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>> \
155-
CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::fn ARGS
159+
CONTAINER<boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>>( \
160+
ARGS)>::fn ARGS
156161

157-
#if !BOOST_PP_VARIADICS_MSVC
158-
#define YOMM2_FRIEND(...) \
159-
BOOST_PP_OVERLOAD(YOMM2_FRIEND_, __VA_ARGS__)(__VA_ARGS__)
160-
#else
161-
#define YOMM2_FRIEND(...) \
162-
BOOST_PP_CAT( \
163-
BOOST_PP_OVERLOAD(YOMM2_FRIEND_, __VA_ARGS__)(__VA_ARGS__), \
164-
BOOST_PP_EMPTY())
165-
#endif
162+
// #if !BOOST_PP_VARIADICS_MSVC
163+
// #define YOMM2_FRIEND(...) \
164+
// BOOST_PP_OVERLOAD(YOMM2_FRIEND_, __VA_ARGS__)(__VA_ARGS__)
165+
// #else
166+
// #define YOMM2_FRIEND(...) \
167+
// BOOST_PP_CAT( \
168+
// BOOST_PP_OVERLOAD(YOMM2_FRIEND_, __VA_ARGS__)(__VA_ARGS__), \
169+
// BOOST_PP_EMPTY())
170+
// #endif
166171

167-
#define YOMM2_FRIEND_1(CONTAINER) \
168-
template<typename> \
169-
friend struct CONTAINER
172+
// #define YOMM2_FRIEND_1(CONTAINER) \
173+
// template<typename> \
174+
// friend struct CONTAINER
170175

171-
#define YOMM2_FRIEND_3(CONTAINER, NAME, ARGS) \
172-
friend struct CONTAINER<YOMM2_SYMBOL(NAME) ARGS>
176+
// #define YOMM2_FRIEND_3(CONTAINER, ...) \
177+
// friend struct CONTAINER<__VA_ARGS__>
173178

174-
#define YOMM2_DEFINITION(CONTAINER, NAME, ARGS) \
175-
CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::fn
179+
// #define YOMM2_DEFINITION(CONTAINER, NAME, ARGS) \
180+
// CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::fn
176181

177182
#define YOMM2_CLASSES(...) \
178183
static ::yorel::yomm2::detail::use_classes_macro< \
@@ -187,6 +192,7 @@
187192
#define declare_method YOMM2_DECLARE
188193
#define declare_static_method YOMM2_STATIC_DECLARE
189194
#define define_method YOMM2_DEFINE
195+
#define define_method_in YOMM2_DEFINE_IN
190196
#define define_method_inline YOMM2_DEFINE_INLINE
191197
#define method_class YOMM2_METHOD_CLASS
192198

0 commit comments

Comments
 (0)