diff --git a/include/boost/fusion/adapted/struct.hpp b/include/boost/fusion/adapted/struct.hpp index fa92723c..28a137ae 100644 --- a/include/boost/fusion/adapted/struct.hpp +++ b/include/boost/fusion/adapted/struct.hpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include diff --git a/include/boost/fusion/adapted/struct/adapt_named_struct.hpp b/include/boost/fusion/adapted/struct/adapt_struct_named.hpp similarity index 63% rename from include/boost/fusion/adapted/struct/adapt_named_struct.hpp rename to include/boost/fusion/adapted/struct/adapt_struct_named.hpp index cc177480..b77b9150 100644 --- a/include/boost/fusion/adapted/struct/adapt_named_struct.hpp +++ b/include/boost/fusion/adapted/struct/adapt_struct_named.hpp @@ -5,8 +5,8 @@ Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ -#if !defined(BOOST_FUSION_NAMED_ADAPT_STRUCT_SEP_29_2009_0748PM) -#define BOOST_FUSION_NAMED_ADAPT_STRUCT_SEP_29_2009_0748PM +#if !defined(BOOST_FUSION_ADAPT_STRUCT_NAMED_SEP_29_2009_0748PM) +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_SEP_29_2009_0748PM #include #include @@ -31,41 +31,41 @@ #include #include #include +#include +#include -#define BOOST_FUSION_ADAPT_NAMED_STRUCT(name, newname, bseq) \ - BOOST_FUSION_ADAPT_NAMED_STRUCT_I((())(name)(newname), \ - BOOST_PP_CAT(BOOST_FUSION_ADAPT_NAMED_STRUCT_X bseq, 0)) \ +#define BOOST_FUSION_ADAPT_STRUCT_NAMED(name, newname, bseq) \ + BOOST_FUSION_ADAPT_STRUCT_NAMED_I(name, (boost)(fusion)(adapted), newname, \ + BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_NAMED_X bseq, 0)) \ /***/ -#define BOOST_FUSION_ADAPT_NAMED_STRUCT_NS(name, ns, newname, bseq) \ - BOOST_FUSION_ADAPT_NAMED_STRUCT_I((ns)(name)(newname), \ - BOOST_PP_CAT(BOOST_FUSION_ADAPT_NAMED_STRUCT_X bseq, 0)) \ +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS(name, ns, newname, bseq) \ + BOOST_FUSION_ADAPT_STRUCT_NAMED_I(name, ns, newname, \ + BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_NAMED_X bseq, 0)) \ /***/ -#define BOOST_FUSION_ADAPT_NAMED_STRUCT_X(x, y) ((x, y)) BOOST_FUSION_ADAPT_NAMED_STRUCT_Y -#define BOOST_FUSION_ADAPT_NAMED_STRUCT_Y(x, y) ((x, y)) BOOST_FUSION_ADAPT_NAMED_STRUCT_X -#define BOOST_FUSION_ADAPT_NAMED_STRUCT_X0 -#define BOOST_FUSION_ADAPT_NAMED_STRUCT_Y0 +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_X(x, y) ((x, y)) BOOST_FUSION_ADAPT_STRUCT_NAMED_Y +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_Y(x, y) ((x, y)) BOOST_FUSION_ADAPT_STRUCT_NAMED_X +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_X0 +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_Y0 -// BOOST_FUSION_ADAPT_NAMED_STRUCT_I generates the overarching structure and uses +// BOOST_FUSION_ADAPT_STRUCT_NAMED_I generates the overarching structure and uses // uses SEQ_FOR_EACH_I to generate the "linear" substructures. // Thanks to Paul Mensonides for the PP macro help -#define BOOST_FUSION_ADAPT_NAMED_STRUCT_I(names, seq) \ - BOOST_PP_SEQ_FOR_EACH( \ - BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_B, _, BOOST_PP_SEQ_ELEM(0, names)) \ - struct BOOST_PP_SEQ_ELEM(2, names) \ +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_I(name, ns, newname, seq) \ + BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_B, _, ns) \ + struct newname \ { \ - BOOST_PP_SEQ_ELEM(2, names)(BOOST_PP_SEQ_ELEM(1, names)& s) \ - : s_(s) {} \ - BOOST_PP_SEQ_ELEM(1, names)& s_; \ + newname(name& s) : s_(s) {} \ + name& s_; \ }; \ - BOOST_PP_SEQ_FOR_EACH( \ - BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_E, _, BOOST_PP_SEQ_ELEM(0, names)) \ + BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_E, _, ns) \ + \ namespace boost { namespace fusion { namespace traits \ { \ template <> \ - struct tag_of \ + struct tag_of \ { \ typedef struct_tag type; \ }; \ @@ -77,13 +77,13 @@ struct sequence_tag; \ \ template<> \ - struct sequence_tag \ + struct sequence_tag \ { \ typedef fusion::fusion_sequence_tag type; \ }; \ \ template<> \ - struct sequence_tag \ + struct sequence_tag \ { \ typedef fusion::fusion_sequence_tag type; \ }; \ @@ -92,23 +92,32 @@ namespace boost { namespace fusion { namespace extension \ { \ template <> \ - struct struct_size \ + struct struct_size \ : mpl::int_ {}; \ - BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_NAMED_STRUCT_C, names, seq) \ + template struct class_member_proxy; \ + BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_STRUCT_NAMED_C, \ + (BOOST_FUSION_ADAPT_STRUCT_NAMED_NAME(ns, newname), name), seq) \ }}} \ /***/ -#define BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_B(r, _, ns) namespace ns { \ - /***/ -#define BOOST_FUSION_ADAPT_NAMED_STRUCT_NS_E(r, _, ns) } \ +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NAME(ns, newname) \ + BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_D, _, ns) \ + newname \ /***/ -#define BOOST_FUSION_ADAPT_NAMED_STRUCT_C(r, names, i, xy) \ +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_B(r, _, ns) namespace ns { +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_D(r, _, ns) ns:: +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS_E(r, _, ns) } + +#define BOOST_FUSION_ADAPT_STRUCT_NAMED_C(r, names, i, xy) \ template <> \ - struct struct_member \ + struct struct_member \ { \ - typedef BOOST_PP_TUPLE_ELEM(2, 0, xy) type; \ - static type& call(BOOST_PP_SEQ_ELEM(1, names)& struct_) \ + typedef boost::mpl::if_< \ + boost::is_const \ + , boost::add_const::type \ + , BOOST_PP_TUPLE_ELEM(2, 0, xy)>::type type; \ + static type& call(BOOST_PP_TUPLE_ELEM(2, 0, names)& struct_) \ { \ return struct_.s_.BOOST_PP_TUPLE_ELEM(2, 1, xy); \ } \ diff --git a/include/boost/fusion/include/adapt_struct_named.hpp b/include/boost/fusion/include/adapt_struct_named.hpp new file mode 100644 index 00000000..67b6235f --- /dev/null +++ b/include/boost/fusion/include/adapt_struct_named.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 Joel de Guzman + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +==============================================================================*/ +#if !defined(FUSION_INCLUDE_ADAPT_STRUCT_NAMED) +#define FUSION_INCLUDE_ADAPT_STRUCT_NAMED + +#include + +#endif