/*============================================================================= 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(BOOST_FUSION_ADAPT_STRUCT_APRIL_2_2007_1158AM) #define BOOST_FUSION_ADAPT_STRUCT_APRIL_2_2007_1158AM #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BOOST_FUSION_ADAPT_STRUCT(name, bseq) \ BOOST_FUSION_ADAPT_STRUCT_I( \ name, BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_X bseq, 0)) \ /***/ #define BOOST_FUSION_ADAPT_STRUCT_X(x, y) ((x, y)) BOOST_FUSION_ADAPT_STRUCT_Y #define BOOST_FUSION_ADAPT_STRUCT_Y(x, y) ((x, y)) BOOST_FUSION_ADAPT_STRUCT_X #define BOOST_FUSION_ADAPT_STRUCT_X0 #define BOOST_FUSION_ADAPT_STRUCT_Y0 // BOOST_FUSION_ADAPT_STRUCT_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_STRUCT_I(name, seq) \ namespace boost { namespace fusion { namespace traits \ { \ template <> \ struct tag_of \ { \ typedef struct_tag type; \ }; \ }}} \ namespace boost { namespace fusion { namespace extension \ { \ template <> \ struct struct_size : mpl::int_ {}; \ BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_STRUCT_C, name, seq) \ }}} \ /***/ #define BOOST_FUSION_ADAPT_STRUCT_C(r, name, i, xy) \ template <> \ struct struct_member \ { \ typedef BOOST_PP_TUPLE_ELEM(2, 0, xy) type; \ static type& call(name& struct_) \ { \ return struct_.BOOST_PP_TUPLE_ELEM(2, 1, xy); \ }; \ }; \ /***/ #endif