From 78e4e01edacd4fdd946fda793b6129a7db05e202 Mon Sep 17 00:00:00 2001 From: Nikolaus Demmel Date: Wed, 16 Jan 2019 00:13:16 +0100 Subject: [PATCH 1/3] Add VISITABLE_INIT --- include/visit_struct/visit_struct_intrusive.hpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/include/visit_struct/visit_struct_intrusive.hpp b/include/visit_struct/visit_struct_intrusive.hpp index fed65bd..a89fa67 100644 --- a/include/visit_struct/visit_struct_intrusive.hpp +++ b/include/visit_struct/visit_struct_intrusive.hpp @@ -382,6 +382,22 @@ static inline ::visit_struct::detail::Append_t); \ static_assert(true, "") +#define VISITABLE_INIT(TYPE, NAME, VALUE) \ +TYPE NAME = VALUE; \ +struct VISIT_STRUCT_MAKE_MEMBER_NAME(NAME) : \ + visit_struct::detail::member_ptr_helper \ +{ \ + static VISIT_STRUCT_CONSTEXPR const ::visit_struct::detail::char_array & member_name() { \ + return #NAME; \ + } \ +}; \ +static inline ::visit_struct::detail::Append_t \ + Visit_Struct_Get_Visitables__(::visit_struct::detail::Rank); \ +static_assert(true, "") + #define END_VISITABLES \ typedef VISIT_STRUCT_GET_REGISTERED_MEMBERS Visit_Struct_Registered_Members_List__; \ typedef ::visit_struct::detail::intrusive_tag Visit_Struct_Visitable_Structure_Tag__; \ From 7b70ef10c90d18034f62ecfe926a7fd8c335c1d1 Mon Sep 17 00:00:00 2001 From: Nikolaus Demmel Date: Wed, 27 Feb 2019 20:20:12 +0100 Subject: [PATCH 2/3] Add VISITABLE_DIRECT_INIT --- .../visit_struct/visit_struct_intrusive.hpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/include/visit_struct/visit_struct_intrusive.hpp b/include/visit_struct/visit_struct_intrusive.hpp index a89fa67..c7d543e 100644 --- a/include/visit_struct/visit_struct_intrusive.hpp +++ b/include/visit_struct/visit_struct_intrusive.hpp @@ -398,6 +398,24 @@ static inline ::visit_struct::detail::Append_t); \ static_assert(true, "") +// use variadic macro to allow passing initializer lists with commas, e.g.: +// VISITABLE_DIRECT_INIT(std::vector, foo, {1, 2, 3}) +#define VISITABLE_DIRECT_INIT(TYPE, NAME, INITIALIZER...) \ +TYPE NAME INITIALIZER; \ +struct VISIT_STRUCT_MAKE_MEMBER_NAME(NAME) : \ + visit_struct::detail::member_ptr_helper \ +{ \ + static VISIT_STRUCT_CONSTEXPR const ::visit_struct::detail::char_array & member_name() { \ + return #NAME; \ + } \ +}; \ +static inline ::visit_struct::detail::Append_t \ + Visit_Struct_Get_Visitables__(::visit_struct::detail::Rank); \ +static_assert(true, "") + #define END_VISITABLES \ typedef VISIT_STRUCT_GET_REGISTERED_MEMBERS Visit_Struct_Registered_Members_List__; \ typedef ::visit_struct::detail::intrusive_tag Visit_Struct_Visitable_Structure_Tag__; \ From d74cde48d71a5af8d5f2a6457297d7fb96d6525f Mon Sep 17 00:00:00 2001 From: Nikolaus Demmel Date: Mon, 17 Jan 2022 14:02:47 +0100 Subject: [PATCH 3/3] VISITABLE_DIRECT_INIT: make variadic macro standard conformant - fixes compilation on MS compiler --- include/visit_struct/visit_struct_intrusive.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/visit_struct/visit_struct_intrusive.hpp b/include/visit_struct/visit_struct_intrusive.hpp index c7d543e..d1adbce 100644 --- a/include/visit_struct/visit_struct_intrusive.hpp +++ b/include/visit_struct/visit_struct_intrusive.hpp @@ -400,8 +400,8 @@ static_assert(true, "") // use variadic macro to allow passing initializer lists with commas, e.g.: // VISITABLE_DIRECT_INIT(std::vector, foo, {1, 2, 3}) -#define VISITABLE_DIRECT_INIT(TYPE, NAME, INITIALIZER...) \ -TYPE NAME INITIALIZER; \ +#define VISITABLE_DIRECT_INIT(TYPE, NAME, ...) \ +TYPE NAME __VA_ARGS__; \ struct VISIT_STRUCT_MAKE_MEMBER_NAME(NAME) : \ visit_struct::detail::member_ptr_helper