diff --git a/include/boost/fusion/adapted.hpp b/include/boost/fusion/adapted.hpp index c343405c..0dd1f0e7 100644 --- a/include/boost/fusion/adapted.hpp +++ b/include/boost/fusion/adapted.hpp @@ -13,5 +13,6 @@ #include #include #include +#include #endif diff --git a/include/boost/fusion/adapted/class.hpp b/include/boost/fusion/adapted/class.hpp index be973831..37ee27ab 100644 --- a/include/boost/fusion/adapted/class.hpp +++ b/include/boost/fusion/adapted/class.hpp @@ -9,8 +9,9 @@ #define BOOST_FUSION_CLASS_OCTOBER_4_2009_839PM #include -#include -#include +#include +#include +#include #include #include diff --git a/include/boost/fusion/adapted/class/adapt_class.hpp b/include/boost/fusion/adapted/class/adapt_class.hpp index 0bfa13df..9622e7b1 100644 --- a/include/boost/fusion/adapted/class/adapt_class.hpp +++ b/include/boost/fusion/adapted/class/adapt_class.hpp @@ -1,5 +1,6 @@ /*============================================================================= Copyright (c) 2001-2009 Joel de Guzman + Copyright (c) 2009-2010 Hartmut Kaiser 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) @@ -28,6 +29,10 @@ #include #include #include +#include +#include +#include +#include #define BOOST_FUSION_ADAPT_CLASS(name, bseq) \ BOOST_FUSION_ADAPT_CLASS_I( \ @@ -75,49 +80,53 @@ { \ template <> \ struct class_size : mpl::int_ {}; \ + template struct class_member_proxy; \ BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_CLASS_C, name, seq) \ }}} \ /***/ -#define BOOST_FUSION_ADAPT_CLASS_C(r, name, i, xy) \ +#define BOOST_FUSION_ADAPT_CLASS_C(r, fullname, i, xy) \ template <> \ - struct class_member \ + struct class_member_proxy \ { \ - typedef BOOST_PP_TUPLE_ELEM(4, 0, xy) type; \ - typedef BOOST_PP_TUPLE_ELEM(4, 1, xy) get_type; \ - struct proxy \ + typedef BOOST_PP_TUPLE_ELEM(4, 0, xy) lvalue; \ + typedef BOOST_PP_TUPLE_ELEM(4, 1, xy) rvalue; \ + typedef remove_const::type>::type type; \ + typedef add_reference::type>::type cref_type; \ + \ + class_member_proxy(fullname& obj) : obj(obj) {} \ + fullname& obj; \ + \ + class_member_proxy& operator=(cref_type val) \ { \ - typedef BOOST_PP_TUPLE_ELEM(4, 0, xy) type; \ - typedef BOOST_PP_TUPLE_ELEM(4, 1, xy) get_type; \ - typedef \ - add_reference::type>::type \ - cref_type; \ + BOOST_PP_TUPLE_ELEM(4, 3, xy); \ + return *this; \ + } \ \ - proxy(name& obj) : obj(obj) {} \ - name& obj; \ - \ - proxy& operator=(cref_type val) \ - { \ - BOOST_PP_TUPLE_ELEM(4, 3, xy); \ - return *this; \ - } \ - \ - operator get_type() \ - { \ - return BOOST_PP_TUPLE_ELEM(4, 2, xy); \ - } \ - }; \ - \ - static get_type call(name const& obj) \ + operator lvalue() \ { \ return BOOST_PP_TUPLE_ELEM(4, 2, xy); \ - }; \ + } \ + }; \ \ - static proxy call(name& obj) \ + template <> \ + struct class_member \ + { \ + typedef class_member_proxy proxy; \ + typedef proxy::type type; \ + typedef proxy::rvalue get_type; \ + \ + static get_type call(fullname const& obj) \ + { \ + return BOOST_PP_TUPLE_ELEM(4, 2, xy); \ + } \ + \ + static proxy call(fullname& obj) \ { \ return proxy(obj); \ - }; \ + } \ }; \ /***/ + #endif diff --git a/include/boost/fusion/adapted/class/adapt_class_named.hpp b/include/boost/fusion/adapted/class/adapt_class_named.hpp new file mode 100644 index 00000000..3878c384 --- /dev/null +++ b/include/boost/fusion/adapted/class/adapt_class_named.hpp @@ -0,0 +1,156 @@ +/*============================================================================= + Copyright (c) 2001-2009 Joel de Guzman + Copyright (c) 2009-2010 Hartmut Kaiser + + 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_ADAPT_CLASS_NAMED_JAN_27_2010_0614PM) +#define BOOST_FUSION_ADAPT_CLASS_NAMED_JAN_27_2010_0614PM + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BOOST_FUSION_ADAPT_CLASS_NAMED(name, newname, bseq) \ + BOOST_FUSION_ADAPT_CLASS_NAMED_I(name, (boost)(fusion)(adapted), newname, \ + BOOST_PP_CAT(BOOST_FUSION_ADAPT_CLASS_NAMED_X bseq, 0)) \ + /***/ + +#define BOOST_FUSION_ADAPT_CLASS_NAMED_NS(name, ns, newname, bseq) \ + BOOST_FUSION_ADAPT_CLASS_NAMED_I(name, ns, newname, \ + BOOST_PP_CAT(BOOST_FUSION_ADAPT_CLASS_NAMED_X bseq, 0)) \ + /***/ + +#define BOOST_FUSION_ADAPT_CLASS_NAMED_X(w, x, y, z) ((w, x, y, z)) BOOST_FUSION_ADAPT_CLASS_NAMED_Y +#define BOOST_FUSION_ADAPT_CLASS_NAMED_Y(w, x, y, z) ((w, x, y, z)) BOOST_FUSION_ADAPT_CLASS_NAMED_X +#define BOOST_FUSION_ADAPT_CLASS_NAMED_X0 +#define BOOST_FUSION_ADAPT_CLASS_NAMED_Y0 + +// BOOST_FUSION_ADAPT_CLASS_I generates the overarching structure and uses +// SEQ_FOR_EACH_I to generate the "linear" substructures. +// Thanks to Paul Mensonides for the PP macro help + +#define BOOST_FUSION_ADAPT_CLASS_NAMED_I(name, ns, newname, seq) \ + BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_CLASS_NAMED_NS_B, _, ns) \ + struct newname \ + { \ + newname(name& s) : obj(s) {} \ + name& obj; \ + }; \ + BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_CLASS_NAMED_NS_E, _, ns) \ + \ + namespace boost { namespace fusion { namespace traits \ + { \ + template <> \ + struct tag_of \ + { \ + typedef class_tag type; \ + }; \ + }}} \ + \ + namespace boost { namespace mpl \ + { \ + template \ + struct sequence_tag; \ + \ + template<> \ + struct sequence_tag \ + { \ + typedef fusion::fusion_sequence_tag type; \ + }; \ + \ + template<> \ + struct sequence_tag \ + { \ + typedef fusion::fusion_sequence_tag type; \ + }; \ + }} \ + \ + namespace boost { namespace fusion { namespace extension \ + { \ + template <> \ + struct class_size \ + : mpl::int_ {}; \ + template struct class_member_proxy; \ + BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_CLASS_NAMED_C, \ + BOOST_FUSION_ADAPT_CLASS_NAMED_NAME(ns, newname),seq) \ + }}} \ + /***/ + +#define BOOST_FUSION_ADAPT_CLASS_NAMED_NAME(ns, newname) \ + BOOST_PP_SEQ_FOR_EACH_R(1, BOOST_FUSION_ADAPT_CLASS_NAMED_NS_D, _, ns) \ + newname \ + /***/ + +#define BOOST_FUSION_ADAPT_CLASS_NAMED_NS_B(r, _, ns) namespace ns { +#define BOOST_FUSION_ADAPT_CLASS_NAMED_NS_D(r, _, ns) ns:: +#define BOOST_FUSION_ADAPT_CLASS_NAMED_NS_E(r, _, ns) } + +#define BOOST_FUSION_ADAPT_CLASS_NAMED_C(r, fullname, i, xy) \ + template <> \ + struct class_member_proxy \ + { \ + typedef BOOST_PP_TUPLE_ELEM(4, 0, xy) lvalue; \ + typedef BOOST_PP_TUPLE_ELEM(4, 1, xy) rvalue; \ + typedef remove_const::type>::type type; \ + typedef add_reference::type>::type cref_type; \ + \ + class_member_proxy(fullname& obj) : obj(obj) {} \ + fullname& obj; \ + \ + class_member_proxy& operator=(cref_type val) \ + { \ + obj.BOOST_PP_TUPLE_ELEM(4, 3, xy); \ + return *this; \ + } \ + \ + operator lvalue() \ + { \ + return obj.BOOST_PP_TUPLE_ELEM(4, 2, xy); \ + } \ + }; \ + \ + template <> \ + struct class_member \ + { \ + typedef class_member_proxy proxy; \ + typedef proxy::type type; \ + typedef proxy::rvalue get_type; \ + \ + static get_type call(fullname const& obj) \ + { \ + return obj.BOOST_PP_TUPLE_ELEM(4, 2, xy); \ + } \ + \ + static proxy call(fullname& obj) \ + { \ + return proxy(obj); \ + } \ + }; \ + /***/ + +#endif diff --git a/include/boost/fusion/include/adapted_class_named.cpp b/include/boost/fusion/include/adapted_class_named.cpp new file mode 100644 index 00000000..0002ad6f --- /dev/null +++ b/include/boost/fusion/include/adapted_class_named.cpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2009 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_CLASS_NAMED) +#define FUSION_INCLUDE_ADAPT_CLASS_NAMED + +#include + +#endif