|
Boost Users : |
Subject: Re: [Boost-users] [Fusion] Associate arbitrary compile/runtime annotations with members of fusion sequence
From: Kozlov Taras (kozlov.taras_at_[hidden])
Date: 2013-02-24 17:31:14
24.02.2013 6:46, Joel de Guzman пиÑеÑ:
>> 7. Generic question about adapt macroses in fusion.
>>
>> I used BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF to define has_annotations
>> metafunction that
>> determine if type members were defined with CPPAN_DECLARE_AND_ANNOTATE.
>> Then I wrote fusion extension which enables for arbitraty type if
>> has_annotations<T> is true.
>>
>> This approach allowed to move CPPAN_DECLARE_AND_ANNOTATE inside of
>> struct definition.
>>
>> Can BOOST_FUSION_DEFINE_STRUCT be reimplemented in that way? This will
>> allow to get rid of
>> namespaces sequence and struct_name parameters. I believe this will
>> also make needless
>> _TPL and _INLINE versions of BOOST_FUSION_DEFINE_STRUCT macroses.
>>
>> Are there any compiler portability or design problems with such approach.
>
> I'm not sure at the moment about the implications. If the tests pass,
> then that's
> a good indication that it's good.
>
> To be honest, the fusion macros need a lot of time, attention and love
> right
> now. I'm not quite happy with the way they are implemented, to be frank.
> Just
> reading the code drives me nuts! It seems that you know your way around the
> macros. If you could find a good way to clean them up, then we should talk.
>
> I'd love to see your extensions added, of course if you are interested in
> contributing and maintaining them; along with the other adapt/define macro-
> siblings. If you are interested, it would be crucial to have symmetry and
> uniformity. Thus to follow up on my answer above (***), if you intend to
> somehow have your code assimilated in fusion, then we cannot break the
> precedent and have a new way of doing things because that will confuse
> users.
>
> Regards,
Well, I guess most of people would be happy to contribute something
usefull into Boost, and I`m not an exception here :)
Here is how I see next generation of define and adapt macroses in fusion:
1. Intrusive.
BOOST_FUSION_DECLARE_MEMBERS(
(base_type0)(base_type1)...,
(member_type0, member_name0)
(member_type1, member_name1)
...
)
BOOST_FUSION_DECLARE_ASSOC_MEMBERS(
(base_type0)(base_type1)...,
(member_type0, member_name0, key_type0)
(member_type1, member_name1, key_type1)
...
)
Example:
struct name_key;
struct age_key;
struct D : B1, B2 {
BOOST_FUSION_DECLARE_ASSOC_MEMBERS(
(B1)(B2),
(std::string, name_, name_key)
(int, age_, age_key)
)
};
I believe we can easily reimplement current adapt macroses
BOOST_FUSION_DEFINE_STRUCT
BOOST_FUSION_DEFINE_TPL_STRUCT
BOOST_FUSION_DEFINE_STRUCT_INLINE
BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE
BOOST_FUSION_DEFINE_ASSOC_STRUCT
BOOST_FUSION_DEFINE_ASSOC_TPL_STRUCT
on top of them
Having BOOST_FUSION_DECLARE_ASSOC_MEMBERS will also make implementation
of CPPAN_DECLARE_AND_ANNOTATE trivial.
2. Non-intrusive
As far as I see, each BOOST_FUSION_ADAPT_* macro should have _WITH_BASE
paired macro with additional base type sequence parameter.
BOOST_FUSION_ADAPT_STRUCT_WITH_BASE(
struct_name,
(base_type0)(base_type1)...,
(member_type0, member_name0)
(member_type1, member_name1)
...
)
I think I should move forward step by step:
1. Implement
BOOST_FUSION_DECLARE_MEMBERS
BOOST_FUSION_DECLARE_ASSOC_MEMBERS
2. Implement the most complex case from non-instrusive macroses. I guess
that can be
BOOST_FUSION_ADAPT_ASSOC_TPL_ADT_WITH_BASE
Hope this will help to get complete view of common implementation
details between instrusive and non-instrusive macroses.
3. Reimplement current instrusive macroses based on new
BOOST_FUSION_DECLARE_MEMBERS
4. Other version of _WITH_BASE non-intrusive macroses
5. Trivial reimplementation of current non-intrusive macroses based on
_WITH_BASE versions.
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net