Chris@16: /*============================================================================== Chris@16: Copyright (c) 2001-2010 Joel de Guzman Chris@16: Copyright (c) 2004 Daniel Wallin Chris@16: Copyright (c) 2010 Thomas Heller Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #ifndef BOOST_PHOENIX_SCOPE_DYNAMIC_HPP Chris@16: #define BOOST_PHOENIX_SCOPE_DYNAMIC_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #define BOOST_PHOENIX_DYNAMIC_TEMPLATE_PARAMS(R, DATA, I, ELEM) \ Chris@16: BOOST_PP_COMMA_IF(I) BOOST_PP_TUPLE_ELEM(2, 0, ELEM) \ Chris@16: /**/ Chris@16: Chris@16: #define BOOST_PHOENIX_DYNAMIC_CTOR_INIT(R, DATA, I, ELEM) \ Chris@16: BOOST_PP_COMMA_IF(I) BOOST_PP_TUPLE_ELEM(2, 1, ELEM)(init(this)) \ Chris@16: /**/ Chris@16: Chris@16: #define BOOST_PHOENIX_DYNAMIC_MEMBER(R, DATA, I, ELEM) \ Chris@16: BOOST_PP_CAT(member, BOOST_PP_INC(I)) BOOST_PP_TUPLE_ELEM(2, 1, ELEM); \ Chris@16: /**/ Chris@16: Chris@16: #define BOOST_PHOENIX_DYNAMIC_FILLER_0(X, Y) \ Chris@16: ((X, Y)) BOOST_PHOENIX_DYNAMIC_FILLER_1 \ Chris@16: /**/ Chris@16: Chris@16: #define BOOST_PHOENIX_DYNAMIC_FILLER_1(X, Y) \ Chris@16: ((X, Y)) BOOST_PHOENIX_DYNAMIC_FILLER_0 \ Chris@16: /**/ Chris@16: Chris@16: #define BOOST_PHOENIX_DYNAMIC_FILLER_0_END Chris@16: #define BOOST_PHOENIX_DYNAMIC_FILLER_1_END Chris@16: Chris@16: #define BOOST_PHOENIX_DYNAMIC_BASE(NAME, MEMBER) \ Chris@16: struct NAME \ Chris@16: : ::boost::phoenix::dynamic< \ Chris@16: BOOST_PP_SEQ_FOR_EACH_I( \ Chris@16: BOOST_PHOENIX_DYNAMIC_TEMPLATE_PARAMS \ Chris@16: , _ \ Chris@16: , MEMBER) \ Chris@16: > \ Chris@16: { \ Chris@16: NAME() \ Chris@16: : BOOST_PP_SEQ_FOR_EACH_I(BOOST_PHOENIX_DYNAMIC_CTOR_INIT, _, MEMBER) \ Chris@16: {} \ Chris@16: \ Chris@16: BOOST_PP_SEQ_FOR_EACH_I(BOOST_PHOENIX_DYNAMIC_MEMBER, _, MEMBER) \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: #define BOOST_PHOENIX_DYNAMIC(NAME, MEMBER) \ Chris@16: BOOST_PHOENIX_DYNAMIC_BASE( \ Chris@16: NAME \ Chris@16: , BOOST_PP_CAT(BOOST_PHOENIX_DYNAMIC_FILLER_0 MEMBER,_END) \ Chris@16: ) \ Chris@16: /**/ Chris@16: Chris@16: BOOST_PHOENIX_DEFINE_EXPRESSION( Chris@16: (boost)(phoenix)(dynamic_member) Chris@16: , (proto::terminal) Chris@16: (proto::terminal) Chris@16: ) Chris@16: Chris@16: namespace boost { namespace phoenix Chris@16: { Chris@16: template Chris@16: struct dynamic_frame : noncopyable Chris@16: { Chris@16: typedef typename DynamicScope::tuple_type tuple_type; Chris@16: Chris@16: dynamic_frame(DynamicScope const& s) Chris@16: : tuple() Chris@16: , save(s.frame) Chris@16: , scope(s) Chris@16: { Chris@16: scope.frame = this; Chris@16: } Chris@16: Chris@16: template Chris@16: dynamic_frame(DynamicScope const& s, Tuple const& init) Chris@16: : tuple(init) Chris@16: , save(s.frame) Chris@16: , scope(s) Chris@16: { Chris@16: scope.frame = this; Chris@16: } Chris@16: Chris@16: ~dynamic_frame() Chris@16: { Chris@16: scope.frame = save; Chris@16: } Chris@16: Chris@16: tuple_type& data() { return tuple; } Chris@16: tuple_type const& data() const { return tuple; } Chris@16: Chris@16: private: Chris@16: tuple_type tuple; Chris@16: dynamic_frame *save; Chris@16: DynamicScope const& scope; Chris@16: }; Chris@16: Chris@16: struct dynamic_member_eval Chris@16: { Chris@16: template Chris@16: struct result; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef Chris@16: typename boost::remove_pointer< Chris@16: typename proto::detail::uncvref< Chris@16: typename proto::result_of::value::type Chris@16: >::type Chris@16: >::type Chris@16: scope_type; Chris@16: typedef Chris@16: typename scope_type::dynamic_frame_type::tuple_type Chris@16: tuple_type; Chris@16: Chris@16: typedef Chris@16: typename fusion::result_of::at_c< Chris@16: tuple_type Chris@16: , proto::detail::uncvref< Chris@16: typename proto::result_of::value::type Chris@16: >::type::value Chris@16: >::type Chris@16: type; Chris@16: Chris@16: }; Chris@16: Chris@16: template Chris@16: typename result::type Chris@16: operator()(N, Scope s, Context const &) const Chris@16: { Chris@16: return Chris@16: fusion::at_c< Chris@16: proto::detail::uncvref< Chris@16: typename proto::result_of::value::type Chris@16: >::type::value Chris@16: >( Chris@16: proto::value(s)->frame->data() Chris@16: ); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct default_actions::when Chris@16: : call Chris@16: {}; Chris@16: Chris@16: template < Chris@16: BOOST_PHOENIX_typename_A_void(BOOST_PHOENIX_DYNAMIC_LIMIT) Chris@16: , typename Dummy = void Chris@16: > Chris@16: struct dynamic; Chris@16: Chris@16: // Bring in the rest ... Chris@16: #include Chris@16: }} Chris@16: Chris@16: #endif