/*============================================================================= 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_OCTOBER_4_2009_840PM) #define BOOST_FUSION_ADAPT_CLASS_OCTOBER_4_2009_840PM #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(name, bseq) \ BOOST_FUSION_ADAPT_CLASS_I( \ name, BOOST_PP_CAT(BOOST_FUSION_ADAPT_CLASS_X bseq, 0)) \ /***/ #define BOOST_FUSION_ADAPT_CLASS_X(w, x, y, z) ((w, x, y, z)) BOOST_FUSION_ADAPT_CLASS_Y #define BOOST_FUSION_ADAPT_CLASS_Y(w, x, y, z) ((w, x, y, z)) BOOST_FUSION_ADAPT_CLASS_X #define BOOST_FUSION_ADAPT_CLASS_X0 #define BOOST_FUSION_ADAPT_CLASS_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_I(name, seq) \ 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_C, name, seq) \ }}} \ /***/ #define BOOST_FUSION_ADAPT_CLASS_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) \ { \ BOOST_PP_TUPLE_ELEM(4, 3, xy); \ return *this; \ } \ \ operator lvalue() \ { \ return 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 BOOST_PP_TUPLE_ELEM(4, 2, xy); \ } \ \ static proxy call(fullname& obj) \ { \ return proxy(obj); \ } \ }; \ /***/ #endif