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