Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2003 Joel de Guzman Chris@16: Copyright (c) 2002-2003 Hartmut Kaiser Chris@16: http://spirit.sourceforge.net/ 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_SPIRIT_CLOSURE_HPP Chris@16: #define BOOST_SPIRIT_CLOSURE_HPP Chris@16: 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: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // Spirit predefined maximum closure limit. This limit defines the maximum Chris@16: // number of elements a closure can hold. This number defaults to 3. The Chris@16: // actual maximum is rounded up in multiples of 3. Thus, if this value Chris@16: // is 4, the actual limit is 6. The ultimate maximum limit in this Chris@16: // implementation is 15. Chris@16: // Chris@16: // It should NOT be greater than PHOENIX_LIMIT! Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: #if !defined(BOOST_SPIRIT_CLOSURE_LIMIT) Chris@16: #define BOOST_SPIRIT_CLOSURE_LIMIT PHOENIX_LIMIT Chris@16: #endif Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // ensure BOOST_SPIRIT_CLOSURE_LIMIT <= PHOENIX_LIMIT and SPIRIT_CLOSURE_LIMIT <= 15 Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: BOOST_STATIC_ASSERT(BOOST_SPIRIT_CLOSURE_LIMIT <= PHOENIX_LIMIT); Chris@16: BOOST_STATIC_ASSERT(BOOST_SPIRIT_CLOSURE_LIMIT <= 15); Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: namespace boost { namespace spirit { Chris@16: Chris@16: BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // closure_context class Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: class closure_context : public parser_context_base Chris@16: { Chris@16: public: Chris@16: Chris@16: typedef typename ::phoenix::tuple_element<0, Chris@16: typename ClosureT::tuple_t>::type attr_t; Chris@16: typedef ClosureT base_t; Chris@16: typedef closure_context_linker > Chris@16: context_linker_t; Chris@16: Chris@16: closure_context(ClosureT const& clos) Chris@16: : frame(clos) {} Chris@16: Chris@16: ~closure_context() {} Chris@16: Chris@16: template Chris@16: void pre_parse(ParserT const&, ScannerT const&) {} Chris@16: Chris@16: template Chris@16: ResultT& post_parse(ResultT& hit, ParserT const&, ScannerT const&) Chris@16: { hit.value(frame[::phoenix::tuple_index<0>()]); return hit; } Chris@16: Chris@16: private: Chris@16: Chris@16: ::phoenix::closure_frame frame; Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // init_closure_context class Chris@16: // Chris@16: // The init_closure_context class is a special parser context type Chris@16: // which additionally initializes a closure contained in the derived Chris@16: // parser with values from a given tuple. Please note, that this Chris@16: // given tuple does not contain the required values directly, it Chris@16: // contains phoenix::actor objects. These actors have to be Chris@16: // dereferenced to gain the values to be used for initialization Chris@16: // (this is done by the help of the phoenix::convert_actors<> Chris@16: // template). Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: template Chris@16: class init_closure_context : public parser_context_base Chris@16: { Chris@16: typedef typename ClosureT::tuple_t tuple_t; Chris@16: typedef typename ClosureT::closure_t closure_t; Chris@16: Chris@16: public: Chris@16: Chris@16: init_closure_context(ClosureT const& clos) Chris@16: : frame(clos.subject(), ::phoenix::convert_actors(clos.init)) {} Chris@16: Chris@16: ~init_closure_context() {} Chris@16: Chris@16: template Chris@16: void pre_parse(ParserT const& /*p*/, ScannerT const&) {} Chris@16: Chris@16: template Chris@16: ResultT& post_parse(ResultT& hit, ParserT const&, ScannerT const&) Chris@16: { hit.value(frame[::phoenix::tuple_index<0>()]); return hit; } Chris@16: Chris@16: private: Chris@16: Chris@16: ::phoenix::closure_frame frame; Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // init_closure_parser class Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: struct init_closure_parser Chris@16: : public unary > > Chris@16: { Chris@16: typedef init_closure_parser self_t; Chris@16: typedef unary > base_t; Chris@16: typedef typename ParserT::phoenix_closure_t closure_t; Chris@16: typedef typename ParserT::tuple_t tuple_t; Chris@16: typedef typename ::phoenix::tuple_element<0, tuple_t>::type attr_t; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef typename match_result::type type; Chris@16: }; Chris@16: Chris@16: init_closure_parser(ParserT const& p, ActorTupleT const& init_) Chris@16: : base_t(p), init(init_) {} Chris@16: Chris@16: template Chris@16: typename parser_result::type Chris@16: parse_main(ScannerT const& scan) const Chris@16: { Chris@16: return this->subject().parse_main(scan); Chris@16: } Chris@16: Chris@16: template Chris@16: typename parser_result::type Chris@16: parse(ScannerT const& scan) const Chris@16: { Chris@16: typedef init_closure_context init_context_t; Chris@16: typedef parser_scanner_linker scanner_t; Chris@16: typedef closure_context_linker context_t; Chris@16: typedef typename parser_result::type result_t; Chris@16: BOOST_SPIRIT_CONTEXT_PARSE( Chris@16: scan, *this, scanner_t, context_t, result_t); Chris@16: } Chris@16: Chris@16: ActorTupleT init; Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // closure class Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template < Chris@16: typename DerivedT Chris@16: , typename T0 Chris@16: , typename T1 Chris@16: , typename T2 Chris@16: Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 3 Chris@16: , typename T3 Chris@16: , typename T4 Chris@16: , typename T5 Chris@16: Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 6 Chris@16: , typename T6 Chris@16: , typename T7 Chris@16: , typename T8 Chris@16: Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 9 Chris@16: , typename T9 Chris@16: , typename T10 Chris@16: , typename T11 Chris@16: Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 12 Chris@16: , typename T12 Chris@16: , typename T13 Chris@16: , typename T14 Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: > Chris@16: struct closure : Chris@16: public ::phoenix::closure< Chris@16: T0, T1, T2 Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 3 Chris@16: , T3, T4, T5 Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 6 Chris@16: , T6, T7, T8 Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 9 Chris@16: , T9, T10, T11 Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 12 Chris@16: , T12, T13, T14 Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: > Chris@16: { Chris@16: typedef ::phoenix::closure< Chris@16: T0, T1, T2 Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 3 Chris@16: , T3, T4, T5 Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 6 Chris@16: , T6, T7, T8 Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 9 Chris@16: , T9, T10, T11 Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 12 Chris@16: , T12, T13, T14 Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: > phoenix_closure_t; Chris@16: Chris@16: typedef closure_context context_t; Chris@16: Chris@16: template Chris@16: struct aux Chris@16: { Chris@16: DerivedT2& aux_derived() Chris@16: { return *static_cast(this); } Chris@16: Chris@16: DerivedT2 const& aux_derived() const Chris@16: { return *static_cast(this); } Chris@16: Chris@16: // initialization functions Chris@16: template Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()(A const &a) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef ::phoenix::tuple actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()(A const &a, B const &b) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef ::phoenix::tuple actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()(A const &a, B const &b, C const &c) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef ::phoenix::tuple actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 3 Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e, Chris@16: F const &f Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef typename ::phoenix::as_actor::type f_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t, f_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e), Chris@16: ::phoenix::as_actor::convert(f) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 6 Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e, Chris@16: F const &f, G const &g Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef typename ::phoenix::as_actor::type f_t; Chris@16: typedef typename ::phoenix::as_actor::type g_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t, f_t, g_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e), Chris@16: ::phoenix::as_actor::convert(f), Chris@16: ::phoenix::as_actor::convert(g) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e, Chris@16: F const &f, G const &g, H const &h Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef typename ::phoenix::as_actor::type f_t; Chris@16: typedef typename ::phoenix::as_actor::type g_t; Chris@16: typedef typename ::phoenix::as_actor::type h_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e), Chris@16: ::phoenix::as_actor::convert(f), Chris@16: ::phoenix::as_actor::convert(g), Chris@16: ::phoenix::as_actor::convert(h) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e, Chris@16: F const &f, G const &g, H const &h, I const &i Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef typename ::phoenix::as_actor::type f_t; Chris@16: typedef typename ::phoenix::as_actor::type g_t; Chris@16: typedef typename ::phoenix::as_actor::type h_t; Chris@16: typedef typename ::phoenix::as_actor::type i_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e), Chris@16: ::phoenix::as_actor::convert(f), Chris@16: ::phoenix::as_actor::convert(g), Chris@16: ::phoenix::as_actor::convert(h), Chris@16: ::phoenix::as_actor::convert(i) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 9 Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e, Chris@16: F const &f, G const &g, H const &h, I const &i, J const &j Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef typename ::phoenix::as_actor::type f_t; Chris@16: typedef typename ::phoenix::as_actor::type g_t; Chris@16: typedef typename ::phoenix::as_actor::type h_t; Chris@16: typedef typename ::phoenix::as_actor::type i_t; Chris@16: typedef typename ::phoenix::as_actor::type j_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e), Chris@16: ::phoenix::as_actor::convert(f), Chris@16: ::phoenix::as_actor::convert(g), Chris@16: ::phoenix::as_actor::convert(h), Chris@16: ::phoenix::as_actor::convert(i), Chris@16: ::phoenix::as_actor::convert(j) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e, Chris@16: F const &f, G const &g, H const &h, I const &i, J const &j, Chris@16: K const &k Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef typename ::phoenix::as_actor::type f_t; Chris@16: typedef typename ::phoenix::as_actor::type g_t; Chris@16: typedef typename ::phoenix::as_actor::type h_t; Chris@16: typedef typename ::phoenix::as_actor::type i_t; Chris@16: typedef typename ::phoenix::as_actor::type j_t; Chris@16: typedef typename ::phoenix::as_actor::type k_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t, Chris@16: k_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e), Chris@16: ::phoenix::as_actor::convert(f), Chris@16: ::phoenix::as_actor::convert(g), Chris@16: ::phoenix::as_actor::convert(h), Chris@16: ::phoenix::as_actor::convert(i), Chris@16: ::phoenix::as_actor::convert(j), Chris@16: ::phoenix::as_actor::convert(k) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e, Chris@16: F const &f, G const &g, H const &h, I const &i, J const &j, Chris@16: K const &k, L const &l Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef typename ::phoenix::as_actor::type f_t; Chris@16: typedef typename ::phoenix::as_actor::type g_t; Chris@16: typedef typename ::phoenix::as_actor::type h_t; Chris@16: typedef typename ::phoenix::as_actor::type i_t; Chris@16: typedef typename ::phoenix::as_actor::type j_t; Chris@16: typedef typename ::phoenix::as_actor::type k_t; Chris@16: typedef typename ::phoenix::as_actor::type l_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t, Chris@16: k_t, l_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e), Chris@16: ::phoenix::as_actor::convert(f), Chris@16: ::phoenix::as_actor::convert(g), Chris@16: ::phoenix::as_actor::convert(h), Chris@16: ::phoenix::as_actor::convert(i), Chris@16: ::phoenix::as_actor::convert(j), Chris@16: ::phoenix::as_actor::convert(k), Chris@16: ::phoenix::as_actor::convert(l) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: #if BOOST_SPIRIT_CLOSURE_LIMIT > 12 Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L, typename M Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e, Chris@16: F const &f, G const &g, H const &h, I const &i, J const &j, Chris@16: K const &k, L const &l, M const &m Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef typename ::phoenix::as_actor::type f_t; Chris@16: typedef typename ::phoenix::as_actor::type g_t; Chris@16: typedef typename ::phoenix::as_actor::type h_t; Chris@16: typedef typename ::phoenix::as_actor::type i_t; Chris@16: typedef typename ::phoenix::as_actor::type j_t; Chris@16: typedef typename ::phoenix::as_actor::type k_t; Chris@16: typedef typename ::phoenix::as_actor::type l_t; Chris@16: typedef typename ::phoenix::as_actor::type m_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t, Chris@16: k_t, l_t, m_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e), Chris@16: ::phoenix::as_actor::convert(f), Chris@16: ::phoenix::as_actor::convert(g), Chris@16: ::phoenix::as_actor::convert(h), Chris@16: ::phoenix::as_actor::convert(i), Chris@16: ::phoenix::as_actor::convert(j), Chris@16: ::phoenix::as_actor::convert(k), Chris@16: ::phoenix::as_actor::convert(l), Chris@16: ::phoenix::as_actor::convert(m) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L, typename M, typename N Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e, Chris@16: F const &f, G const &g, H const &h, I const &i, J const &j, Chris@16: K const &k, L const &l, M const &m, N const &n Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef typename ::phoenix::as_actor::type f_t; Chris@16: typedef typename ::phoenix::as_actor::type g_t; Chris@16: typedef typename ::phoenix::as_actor::type h_t; Chris@16: typedef typename ::phoenix::as_actor::type i_t; Chris@16: typedef typename ::phoenix::as_actor::type j_t; Chris@16: typedef typename ::phoenix::as_actor::type k_t; Chris@16: typedef typename ::phoenix::as_actor::type l_t; Chris@16: typedef typename ::phoenix::as_actor::type m_t; Chris@16: typedef typename ::phoenix::as_actor::type n_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t, Chris@16: k_t, l_t, m_t, n_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e), Chris@16: ::phoenix::as_actor::convert(f), Chris@16: ::phoenix::as_actor::convert(g), Chris@16: ::phoenix::as_actor::convert(h), Chris@16: ::phoenix::as_actor::convert(i), Chris@16: ::phoenix::as_actor::convert(j), Chris@16: ::phoenix::as_actor::convert(k), Chris@16: ::phoenix::as_actor::convert(l), Chris@16: ::phoenix::as_actor::convert(m), Chris@16: ::phoenix::as_actor::convert(n) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L, typename M, typename N, typename O Chris@16: > Chris@16: init_closure_parser< Chris@16: DerivedT2, Chris@16: ::phoenix::tuple< Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type, Chris@16: typename ::phoenix::as_actor::type Chris@16: > Chris@16: > Chris@16: operator()( Chris@16: A const &a, B const &b, C const &c, D const &d, E const &e, Chris@16: F const &f, G const &g, H const &h, I const &i, J const &j, Chris@16: K const &k, L const &l, M const &m, N const &n, O const &o Chris@16: ) const Chris@16: { Chris@16: typedef typename ::phoenix::as_actor::type a_t; Chris@16: typedef typename ::phoenix::as_actor::type b_t; Chris@16: typedef typename ::phoenix::as_actor::type c_t; Chris@16: typedef typename ::phoenix::as_actor::type d_t; Chris@16: typedef typename ::phoenix::as_actor::type e_t; Chris@16: typedef typename ::phoenix::as_actor::type f_t; Chris@16: typedef typename ::phoenix::as_actor::type g_t; Chris@16: typedef typename ::phoenix::as_actor::type h_t; Chris@16: typedef typename ::phoenix::as_actor::type i_t; Chris@16: typedef typename ::phoenix::as_actor::type j_t; Chris@16: typedef typename ::phoenix::as_actor::type k_t; Chris@16: typedef typename ::phoenix::as_actor::type l_t; Chris@16: typedef typename ::phoenix::as_actor::type m_t; Chris@16: typedef typename ::phoenix::as_actor::type n_t; Chris@16: typedef typename ::phoenix::as_actor::type o_t; Chris@16: typedef ::phoenix::tuple< Chris@16: a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t, Chris@16: k_t, l_t, m_t, n_t, o_t Chris@16: > actor_tuple_t; Chris@16: Chris@16: return init_closure_parser( Chris@16: aux_derived(), Chris@16: actor_tuple_t( Chris@16: ::phoenix::as_actor::convert(a), Chris@16: ::phoenix::as_actor::convert(b), Chris@16: ::phoenix::as_actor::convert(c), Chris@16: ::phoenix::as_actor::convert(d), Chris@16: ::phoenix::as_actor::convert(e), Chris@16: ::phoenix::as_actor::convert(f), Chris@16: ::phoenix::as_actor::convert(g), Chris@16: ::phoenix::as_actor::convert(h), Chris@16: ::phoenix::as_actor::convert(i), Chris@16: ::phoenix::as_actor::convert(j), Chris@16: ::phoenix::as_actor::convert(k), Chris@16: ::phoenix::as_actor::convert(l), Chris@16: ::phoenix::as_actor::convert(m), Chris@16: ::phoenix::as_actor::convert(n), Chris@16: ::phoenix::as_actor::convert(o) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: }; Chris@16: Chris@16: ~closure() {} Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // overloads for chseq_p and str_p taking in phoenix actors Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: struct container_begin Chris@16: { Chris@16: typedef container_begin self_t; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef typename ::phoenix::actor_result Chris@16: ::plain_type::iterator type; Chris@16: }; Chris@16: Chris@16: container_begin(ActorT actor_) Chris@16: : actor(actor_) {} Chris@16: Chris@16: template Chris@16: typename ::phoenix::actor_result::type Chris@16: eval(TupleT const& /*args*/) const Chris@16: { return actor().begin(); } Chris@16: Chris@16: ActorT actor; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct container_end Chris@16: { Chris@16: typedef container_begin self_t; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef typename ::phoenix::actor_result Chris@16: ::plain_type::iterator type; Chris@16: }; Chris@16: Chris@16: container_end(ActorT actor_) Chris@16: : actor(actor_) {} Chris@16: Chris@16: template Chris@16: typename ::phoenix::actor_result::type Chris@16: eval(TupleT const& /*args*/) const Chris@16: { return actor().end(); } Chris@16: Chris@16: ActorT actor; Chris@16: }; Chris@16: Chris@16: template Chris@16: inline f_chseq< Chris@16: ::phoenix::actor > >, Chris@16: ::phoenix::actor > > Chris@16: > Chris@16: f_chseq_p(::phoenix::actor const& a) Chris@16: { Chris@16: typedef ::phoenix::actor > > Chris@16: container_begin_t; Chris@16: typedef ::phoenix::actor > > Chris@16: container_end_t; Chris@16: typedef f_chseq result_t; Chris@16: Chris@16: return result_t(container_begin_t(a), container_end_t(a)); Chris@16: } Chris@16: Chris@16: template Chris@16: inline f_strlit< Chris@16: ::phoenix::actor > >, Chris@16: ::phoenix::actor > > Chris@16: > Chris@16: f_str_p(::phoenix::actor const& a) Chris@16: { Chris@16: typedef ::phoenix::actor > > Chris@16: container_begin_t; Chris@16: typedef ::phoenix::actor > > Chris@16: container_end_t; Chris@16: typedef f_strlit result_t; Chris@16: Chris@16: return result_t(container_begin_t(a), container_end_t(a)); Chris@16: } Chris@16: Chris@16: BOOST_SPIRIT_CLASSIC_NAMESPACE_END Chris@16: Chris@16: }} // namespace BOOST_SPIRIT_CLASSIC_NS Chris@16: Chris@16: #endif