Skip to content

Commit

Permalink
more macro work
Browse files Browse the repository at this point in the history
  • Loading branch information
jll63 committed Sep 21, 2024
1 parent 861037f commit a3b4ec5
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 72 deletions.
9 changes: 3 additions & 6 deletions examples/containers/arc_painter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,12 @@ register_classes(geometries::Arc, geometries::Line);
namespace painter {
namespace paint1d {

define_method(
define_method_in(
painters, paintObject, (Painter & painter, const geometries::Arc& arc),
void) {
++painter.counter;
method_definition(
painters, paintObject,
(Painter&, const geometries::Line&))(painter, arc);
std::cout << " "
<< "painting arc\n";
painters<void(Painter&, const geometries::Line&)>::fn(painter, arc);
std::cout << " " << "painting arc\n";
}

} // namespace paint1d
Expand Down
13 changes: 5 additions & 8 deletions examples/containers/concrete_shape_painters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include <iostream>

#include "geometries.hpp"
#include "shape_painter.hpp"
#include "painter.hpp"

register_classes(
geometries::Geometry, geometries::Shape, geometries::Square,
Expand All @@ -18,20 +18,17 @@ register_classes(
namespace painter {
namespace paint2d {

define_method(
define_method_in(
painters, paintObject,
(Painter & painter, const geometries::Square& square), void) {
method_definition(
painters, paintObject,
(Painter&, const geometries::Shape&))(painter, square);
next(painter, square);
std::cout << "painting square\n";
}

define_method(
define_method_in(
painters, paintObject,
(Painter & painter, const geometries::Circle& circle), void) {
painters<YOMM2_SYMBOL(paintObject)(Painter&, const geometries::Shape&)>::fn(
painter, circle);
next(painter, circle);
std::cout << "painting Circle\n";
}

Expand Down
5 changes: 2 additions & 3 deletions examples/containers/painter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,8 @@ class Painter {

private:
int counter = 0;
friend_method(paint1d::painters);
friend_method(
paint2d::painters, paintObject, (Painter&, const geometries::Shape&));
template<typename> friend struct paint1d::painters;
friend paint2d::painters<void(Painter&, const geometries::Shape&)>;
};

inline void Painter::paint(const geometries::Geometry& geometry) {
Expand Down
5 changes: 2 additions & 3 deletions examples/containers/segment_painter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,11 @@ register_classes(geometries::Segment, geometries::Line);
namespace painter {
namespace paint1d {

define_method(
define_method_in(
painters, paintObject,
(Painter & painter, const geometries::Segment& segment), void) {
++painter.counter;
method_definition(painters, paintObject, (Painter&, const geometries::Line&))(
painter, segment);
painters<void(Painter&, const geometries::Line&)>::fn(painter, segment);
std::cout << " "
<< "painting segment\n";
}
Expand Down
2 changes: 1 addition & 1 deletion examples/containers/shape_painter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ register_classes(geometries::Shape, geometries::Geometry);
namespace painter {
namespace paint2d {

define_method(
define_method_in(
painters, paintObject, (Painter & painter, const geometries::Shape& shape),
void) {
++painter.counter;
Expand Down
24 changes: 0 additions & 24 deletions examples/containers/shape_painter.hpp

This file was deleted.

60 changes: 33 additions & 27 deletions include/yorel/yomm2/macros.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@
BOOST_PP_REPEAT(BOOST_PP_TUPLE_SIZE(ARGS), yOMM2_ALIST, ARGS)); \
}

#define YOMM2_DEFINE(NAME, ARGS, ...) \
#define YOMM2_DEFINE(NAME, ARGS, ...) \
yOMM2_DEFINE(YOMM2_GENSYM, NAME, ARGS, __VA_ARGS__)

#define YOMM2_DEFINE_IN(CONTAINER, NAME, ARGS, ...) \
#define YOMM2_DEFINE_IN(CONTAINER, NAME, ARGS, ...) \
yOMM2_DEFINE_IN_CONTAINER( \
YOMM2_GENSYM, , CONTAINER, NAME, ARGS, __VA_ARGS__)

Expand Down Expand Up @@ -112,25 +112,26 @@
#endif

#define YOMM2_DECLARE_METHOD_CONTAINER_1(CONTAINER) \
template<typename S> \
template<typename> \
struct CONTAINER

#define YOMM2_DECLARE_METHOD_CONTAINER_4(CONTAINER, NAME, ARGS, ...) \
template<typename S> \
template<typename> \
struct CONTAINER; \
YOMM2_DECLARE_METHOD_CONTAINER_4_NS( \
YOMM2_GENSYM, CONTAINER, NAME, ARGS, __VA_ARGS__)

#define YOMM2_DECLARE_METHOD_CONTAINER_4_NS(NS, CONTAINER, NAME, ARGS, ...) \
template<typename S> \
template<typename> \
struct CONTAINER; \
namespace { \
namespace NS { \
yOMM2_SELECT_METHOD(NAME, ARGS); \
} \
} \
template<> \
struct CONTAINER<YOMM2_SYMBOL(NAME) ARGS> { \
struct CONTAINER< \
boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>> ARGS> { \
static NS::_yOMM2_method::next_type next; \
static boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>> fn \
ARGS; \
Expand All @@ -143,36 +144,40 @@
#define yOMM2_DEFINE_IN_CONTAINER(NS, INLINE, CONTAINER, NAME, ARGS, ...) \
YOMM2_DECLARE_METHOD_CONTAINER_4_NS( \
NS, CONTAINER, NAME, ARGS, __VA_ARGS__); \
INLINE NS::_yOMM2_method::next_type \
CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::next; \
INLINE NS::_yOMM2_method::next_type CONTAINER< \
boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>>(ARGS)>::next; \
namespace { \
namespace NS { \
INLINE _yOMM2_method::override_fn<CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::fn> \
YOMM2_GENSYM(&CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::next); \
INLINE _yOMM2_method::override_fn<CONTAINER< \
boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>> ARGS>::fn> \
YOMM2_GENSYM( \
&CONTAINER<boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>> \
ARGS>::next); \
} \
} \
INLINE boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>> \
CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::fn ARGS
CONTAINER<boost::mp11::mp_first<boost::mp11::mp_list<__VA_ARGS__>>( \
ARGS)>::fn ARGS

#if !BOOST_PP_VARIADICS_MSVC
#define YOMM2_FRIEND(...) \
BOOST_PP_OVERLOAD(YOMM2_FRIEND_, __VA_ARGS__)(__VA_ARGS__)
#else
#define YOMM2_FRIEND(...) \
BOOST_PP_CAT( \
BOOST_PP_OVERLOAD(YOMM2_FRIEND_, __VA_ARGS__)(__VA_ARGS__), \
BOOST_PP_EMPTY())
#endif
// #if !BOOST_PP_VARIADICS_MSVC
// #define YOMM2_FRIEND(...) \
// BOOST_PP_OVERLOAD(YOMM2_FRIEND_, __VA_ARGS__)(__VA_ARGS__)
// #else
// #define YOMM2_FRIEND(...) \
// BOOST_PP_CAT( \
// BOOST_PP_OVERLOAD(YOMM2_FRIEND_, __VA_ARGS__)(__VA_ARGS__), \
// BOOST_PP_EMPTY())
// #endif

#define YOMM2_FRIEND_1(CONTAINER) \
template<typename> \
friend struct CONTAINER
// #define YOMM2_FRIEND_1(CONTAINER) \
// template<typename> \
// friend struct CONTAINER

#define YOMM2_FRIEND_3(CONTAINER, NAME, ARGS) \
friend struct CONTAINER<YOMM2_SYMBOL(NAME) ARGS>
// #define YOMM2_FRIEND_3(CONTAINER, ...) \
// friend struct CONTAINER<__VA_ARGS__>

#define YOMM2_DEFINITION(CONTAINER, NAME, ARGS) \
CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::fn
// #define YOMM2_DEFINITION(CONTAINER, NAME, ARGS) \
// CONTAINER<YOMM2_SYMBOL(NAME) ARGS>::fn

#define YOMM2_CLASSES(...) \
static ::yorel::yomm2::detail::use_classes_macro< \
Expand All @@ -187,6 +192,7 @@
#define declare_method YOMM2_DECLARE
#define declare_static_method YOMM2_STATIC_DECLARE
#define define_method YOMM2_DEFINE
#define define_method_in YOMM2_DEFINE_IN
#define define_method_inline YOMM2_DEFINE_INLINE
#define method_class YOMM2_METHOD_CLASS

Expand Down

0 comments on commit a3b4ec5

Please sign in to comment.