os/ossrv/ossrv_pub/boost_apis/boost/spirit/attribute/closure.hpp
changeset 0 bde4ae8d615e
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/os/ossrv/ossrv_pub/boost_apis/boost/spirit/attribute/closure.hpp	Fri Jun 15 03:10:57 2012 +0200
     1.3 @@ -0,0 +1,1079 @@
     1.4 +/*=============================================================================
     1.5 +    Copyright (c) 2001-2003 Joel de Guzman
     1.6 +    Copyright (c) 2002-2003 Hartmut Kaiser
     1.7 +    http://spirit.sourceforge.net/
     1.8 +
     1.9 +    Use, modification and distribution is subject to the Boost Software
    1.10 +    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
    1.11 +    http://www.boost.org/LICENSE_1_0.txt)
    1.12 +=============================================================================*/
    1.13 +#ifndef BOOST_SPIRIT_CLOSURE_HPP
    1.14 +#define BOOST_SPIRIT_CLOSURE_HPP
    1.15 +
    1.16 +///////////////////////////////////////////////////////////////////////////////
    1.17 +#include <boost/spirit/core/parser.hpp>
    1.18 +#include <boost/spirit/core/composite/composite.hpp>
    1.19 +#include <boost/spirit/core/non_terminal/parser_context.hpp>
    1.20 +#include <boost/spirit/attribute/parametric.hpp>
    1.21 +#include <boost/spirit/attribute/closure_context.hpp>
    1.22 +#include <boost/spirit/attribute/closure_fwd.hpp>
    1.23 +
    1.24 +#include <boost/spirit/phoenix/closures.hpp>
    1.25 +#include <boost/spirit/phoenix/primitives.hpp>
    1.26 +#include <boost/spirit/phoenix/casts.hpp>
    1.27 +#include <boost/spirit/phoenix/operators.hpp>
    1.28 +#include <boost/spirit/phoenix/tuple_helpers.hpp>
    1.29 +
    1.30 +#include <boost/static_assert.hpp>
    1.31 +
    1.32 +///////////////////////////////////////////////////////////////////////////////
    1.33 +//
    1.34 +//  Spirit predefined maximum closure limit. This limit defines the maximum
    1.35 +//  number of elements a closure can hold. This number defaults to 3. The
    1.36 +//  actual maximum is rounded up in multiples of 3. Thus, if this value
    1.37 +//  is 4, the actual limit is 6. The ultimate maximum limit in this
    1.38 +//  implementation is 15.
    1.39 +//
    1.40 +//  It should NOT be greater than PHOENIX_LIMIT!
    1.41 +//
    1.42 +///////////////////////////////////////////////////////////////////////////////
    1.43 +
    1.44 +#if !defined(BOOST_SPIRIT_CLOSURE_LIMIT)
    1.45 +#define BOOST_SPIRIT_CLOSURE_LIMIT PHOENIX_LIMIT
    1.46 +#endif
    1.47 +
    1.48 +///////////////////////////////////////////////////////////////////////////////
    1.49 +//
    1.50 +// ensure BOOST_SPIRIT_CLOSURE_LIMIT <= PHOENIX_LIMIT and SPIRIT_CLOSURE_LIMIT <= 15
    1.51 +//
    1.52 +///////////////////////////////////////////////////////////////////////////////
    1.53 +BOOST_STATIC_ASSERT(BOOST_SPIRIT_CLOSURE_LIMIT <= PHOENIX_LIMIT);
    1.54 +BOOST_STATIC_ASSERT(BOOST_SPIRIT_CLOSURE_LIMIT <= 15);
    1.55 +
    1.56 +///////////////////////////////////////////////////////////////////////////////
    1.57 +namespace boost { namespace spirit {
    1.58 +
    1.59 +    ///////////////////////////////////////////////////////////////////////////
    1.60 +    //
    1.61 +    //  closure_context class
    1.62 +    //
    1.63 +    ///////////////////////////////////////////////////////////////////////////
    1.64 +    template <typename ClosureT>
    1.65 +    class closure_context : public parser_context_base
    1.66 +    {
    1.67 +    public:
    1.68 +
    1.69 +        typedef typename phoenix::tuple_element<0,
    1.70 +            typename ClosureT::tuple_t>::type attr_t;
    1.71 +        typedef ClosureT base_t;
    1.72 +        typedef closure_context_linker<closure_context<ClosureT> >
    1.73 +        context_linker_t;
    1.74 +
    1.75 +        closure_context(ClosureT const& clos)
    1.76 +        : frame(clos) {}
    1.77 +
    1.78 +        ~closure_context() {}
    1.79 +
    1.80 +        template <typename ParserT, typename ScannerT>
    1.81 +        void pre_parse(ParserT const&, ScannerT const&) {}
    1.82 +
    1.83 +        template <typename ResultT, typename ParserT, typename ScannerT>
    1.84 +        ResultT& post_parse(ResultT& hit, ParserT const&, ScannerT const&)
    1.85 +        { hit.value(frame[phoenix::tuple_index<0>()]); return hit; }
    1.86 +
    1.87 +    private:
    1.88 +
    1.89 +        phoenix::closure_frame<typename ClosureT::phoenix_closure_t> frame;
    1.90 +    };
    1.91 +
    1.92 +    ///////////////////////////////////////////////////////////////////////////
    1.93 +    //
    1.94 +    //  init_closure_context class
    1.95 +    //
    1.96 +    //      The init_closure_context class is a special parser context type
    1.97 +    //      which additionally initializes a closure contained in the derived
    1.98 +    //      parser with values from a given tuple. Please note, that this
    1.99 +    //      given tuple does not contain the required values directly, it
   1.100 +    //      contains phoenix::actor objects. These actors have to be
   1.101 +    //      dereferenced to gain the values to be used for initialization
   1.102 +    //      (this is done by the help of the phoenix::convert_actors<>
   1.103 +    //      template).
   1.104 +    //
   1.105 +    ///////////////////////////////////////////////////////////////////////////
   1.106 +
   1.107 +    template <typename ClosureT>
   1.108 +    class init_closure_context : public parser_context_base
   1.109 +    {
   1.110 +        typedef typename ClosureT::tuple_t      tuple_t;
   1.111 +        typedef typename ClosureT::closure_t    closure_t;
   1.112 +
   1.113 +    public:
   1.114 +
   1.115 +        init_closure_context(ClosureT const& clos)
   1.116 +        : frame(clos.subject(), phoenix::convert_actors<tuple_t>(clos.init)) {}
   1.117 +
   1.118 +        ~init_closure_context() {}
   1.119 +
   1.120 +        template <typename ParserT, typename ScannerT>
   1.121 +        void pre_parse(ParserT const& /*p*/, ScannerT const&) {}
   1.122 +
   1.123 +        template <typename ResultT, typename ParserT, typename ScannerT>
   1.124 +        ResultT& post_parse(ResultT& hit, ParserT const&, ScannerT const&)
   1.125 +        { hit.value(frame[phoenix::tuple_index<0>()]); return hit; }
   1.126 +
   1.127 +    private:
   1.128 +
   1.129 +        phoenix::closure_frame<closure_t> frame;
   1.130 +    };
   1.131 +
   1.132 +    ///////////////////////////////////////////////////////////////////////////
   1.133 +    //
   1.134 +    //  init_closure_parser class
   1.135 +    //
   1.136 +    ///////////////////////////////////////////////////////////////////////////
   1.137 +    template <typename ParserT, typename ActorTupleT>
   1.138 +    struct init_closure_parser
   1.139 +    : public unary<ParserT, parser<init_closure_parser<ParserT, ActorTupleT> > >
   1.140 +    {
   1.141 +        typedef init_closure_parser<ParserT, ActorTupleT>           self_t;
   1.142 +        typedef unary<ParserT, parser<self_t> >                     base_t;
   1.143 +        typedef typename ParserT::phoenix_closure_t                 closure_t;
   1.144 +        typedef typename ParserT::tuple_t                           tuple_t;
   1.145 +        typedef typename phoenix::tuple_element<0, tuple_t>::type   attr_t;
   1.146 +
   1.147 +        template <typename ScannerT>
   1.148 +        struct result
   1.149 +        {
   1.150 +            typedef typename match_result<ScannerT, attr_t>::type type;
   1.151 +        };
   1.152 +
   1.153 +        init_closure_parser(ParserT const& p, ActorTupleT const& init_)
   1.154 +        : base_t(p), init(init_) {}
   1.155 +
   1.156 +        template <typename ScannerT>
   1.157 +        typename parser_result<self_t, ScannerT>::type
   1.158 +        parse_main(ScannerT const& scan) const
   1.159 +        {
   1.160 +            return this->subject().parse_main(scan);
   1.161 +        }
   1.162 +
   1.163 +        template <typename ScannerT>
   1.164 +        typename parser_result<self_t, ScannerT>::type
   1.165 +        parse(ScannerT const& scan) const
   1.166 +        {
   1.167 +            typedef init_closure_context<self_t> init_context_t;
   1.168 +            typedef parser_scanner_linker<ScannerT> scanner_t;
   1.169 +            typedef closure_context_linker<init_context_t> context_t;
   1.170 +            typedef typename parser_result<self_t, ScannerT>::type result_t;
   1.171 +            BOOST_SPIRIT_CONTEXT_PARSE(
   1.172 +                scan, *this, scanner_t, context_t, result_t);
   1.173 +        }
   1.174 +
   1.175 +        ActorTupleT init;
   1.176 +    };
   1.177 +
   1.178 +    ///////////////////////////////////////////////////////////////////////////
   1.179 +    //
   1.180 +    //  closure class
   1.181 +    //
   1.182 +    ///////////////////////////////////////////////////////////////////////////
   1.183 +    template <
   1.184 +            typename DerivedT
   1.185 +        ,   typename T0
   1.186 +        ,   typename T1
   1.187 +        ,   typename T2
   1.188 +
   1.189 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
   1.190 +        ,   typename T3
   1.191 +        ,   typename T4
   1.192 +        ,   typename T5
   1.193 +
   1.194 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
   1.195 +        ,   typename T6
   1.196 +        ,   typename T7
   1.197 +        ,   typename T8
   1.198 +
   1.199 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
   1.200 +        ,   typename T9
   1.201 +        ,   typename T10
   1.202 +        ,   typename T11
   1.203 +
   1.204 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
   1.205 +        ,   typename T12
   1.206 +        ,   typename T13
   1.207 +        ,   typename T14
   1.208 +    #endif
   1.209 +    #endif
   1.210 +    #endif
   1.211 +    #endif
   1.212 +    >
   1.213 +    struct closure :
   1.214 +        public phoenix::closure<
   1.215 +            T0, T1, T2
   1.216 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
   1.217 +        ,   T3, T4, T5
   1.218 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
   1.219 +        ,   T6, T7, T8
   1.220 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
   1.221 +        ,   T9, T10, T11
   1.222 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
   1.223 +        ,   T12, T13, T14
   1.224 +    #endif
   1.225 +    #endif
   1.226 +    #endif
   1.227 +    #endif
   1.228 +        >
   1.229 +    {
   1.230 +        typedef phoenix::closure<
   1.231 +                T0, T1, T2
   1.232 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
   1.233 +            ,   T3, T4, T5
   1.234 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
   1.235 +            ,   T6, T7, T8
   1.236 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
   1.237 +            ,   T9, T10, T11
   1.238 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
   1.239 +            ,   T12, T13, T14
   1.240 +    #endif
   1.241 +    #endif
   1.242 +    #endif
   1.243 +    #endif
   1.244 +            > phoenix_closure_t;
   1.245 +
   1.246 +        typedef closure_context<DerivedT> context_t;
   1.247 +
   1.248 +        template <typename DerivedT2>
   1.249 +        struct aux
   1.250 +        {
   1.251 +            DerivedT2& aux_derived()
   1.252 +            { return *static_cast<DerivedT2*>(this); }
   1.253 +
   1.254 +            DerivedT2 const& aux_derived() const
   1.255 +            { return *static_cast<DerivedT2 const*>(this); }
   1.256 +
   1.257 +        // initialization functions
   1.258 +            template <typename A>
   1.259 +            init_closure_parser<
   1.260 +                DerivedT2,
   1.261 +                phoenix::tuple<
   1.262 +                    typename phoenix::as_actor<A>::type
   1.263 +                >
   1.264 +            >
   1.265 +            operator()(A const &a) const
   1.266 +            {
   1.267 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.268 +                typedef phoenix::tuple<a_t> actor_tuple_t;
   1.269 +
   1.270 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.271 +                        aux_derived(),
   1.272 +                        actor_tuple_t(
   1.273 +                            phoenix::as_actor<A>::convert(a)
   1.274 +                        )
   1.275 +                    );
   1.276 +            }
   1.277 +
   1.278 +            template <typename A, typename B>
   1.279 +            init_closure_parser<
   1.280 +                DerivedT2,
   1.281 +                phoenix::tuple<
   1.282 +                    typename phoenix::as_actor<A>::type,
   1.283 +                    typename phoenix::as_actor<B>::type
   1.284 +                >
   1.285 +            >
   1.286 +            operator()(A const &a, B const &b) const
   1.287 +            {
   1.288 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.289 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.290 +                typedef phoenix::tuple<a_t, b_t> actor_tuple_t;
   1.291 +
   1.292 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.293 +                        aux_derived(),
   1.294 +                        actor_tuple_t(
   1.295 +                            phoenix::as_actor<A>::convert(a),
   1.296 +                            phoenix::as_actor<B>::convert(b)
   1.297 +                        )
   1.298 +                    );
   1.299 +            }
   1.300 +
   1.301 +            template <typename A, typename B, typename C>
   1.302 +            init_closure_parser<
   1.303 +                DerivedT2,
   1.304 +                phoenix::tuple<
   1.305 +                    typename phoenix::as_actor<A>::type,
   1.306 +                    typename phoenix::as_actor<B>::type,
   1.307 +                    typename phoenix::as_actor<C>::type
   1.308 +                >
   1.309 +            >
   1.310 +            operator()(A const &a, B const &b, C const &c) const
   1.311 +            {
   1.312 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.313 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.314 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.315 +                typedef phoenix::tuple<a_t, b_t, c_t> actor_tuple_t;
   1.316 +
   1.317 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.318 +                        aux_derived(),
   1.319 +                        actor_tuple_t(
   1.320 +                            phoenix::as_actor<A>::convert(a),
   1.321 +                            phoenix::as_actor<B>::convert(b),
   1.322 +                            phoenix::as_actor<C>::convert(c)
   1.323 +                        )
   1.324 +                    );
   1.325 +            }
   1.326 +
   1.327 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 3
   1.328 +
   1.329 +            template <
   1.330 +                typename A, typename B, typename C, typename D
   1.331 +            >
   1.332 +            init_closure_parser<
   1.333 +                DerivedT2,
   1.334 +                phoenix::tuple<
   1.335 +                    typename phoenix::as_actor<A>::type,
   1.336 +                    typename phoenix::as_actor<B>::type,
   1.337 +                    typename phoenix::as_actor<C>::type,
   1.338 +                    typename phoenix::as_actor<D>::type
   1.339 +                >
   1.340 +            >
   1.341 +            operator()(
   1.342 +                A const &a, B const &b, C const &c, D const &d
   1.343 +            ) const
   1.344 +            {
   1.345 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.346 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.347 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.348 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.349 +                typedef phoenix::tuple<
   1.350 +                            a_t, b_t, c_t, d_t
   1.351 +                        > actor_tuple_t;
   1.352 +
   1.353 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.354 +                        aux_derived(),
   1.355 +                        actor_tuple_t(
   1.356 +                            phoenix::as_actor<A>::convert(a),
   1.357 +                            phoenix::as_actor<B>::convert(b),
   1.358 +                            phoenix::as_actor<C>::convert(c),
   1.359 +                            phoenix::as_actor<D>::convert(d)
   1.360 +                        )
   1.361 +                    );
   1.362 +            }
   1.363 +
   1.364 +            template <
   1.365 +                typename A, typename B, typename C, typename D, typename E
   1.366 +            >
   1.367 +            init_closure_parser<
   1.368 +                DerivedT2,
   1.369 +                phoenix::tuple<
   1.370 +                    typename phoenix::as_actor<A>::type,
   1.371 +                    typename phoenix::as_actor<B>::type,
   1.372 +                    typename phoenix::as_actor<C>::type,
   1.373 +                    typename phoenix::as_actor<D>::type,
   1.374 +                    typename phoenix::as_actor<E>::type
   1.375 +                >
   1.376 +            >
   1.377 +            operator()(
   1.378 +                A const &a, B const &b, C const &c, D const &d, E const &e
   1.379 +            ) const
   1.380 +            {
   1.381 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.382 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.383 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.384 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.385 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.386 +                typedef phoenix::tuple<
   1.387 +                            a_t, b_t, c_t, d_t, e_t
   1.388 +                        > actor_tuple_t;
   1.389 +
   1.390 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.391 +                        aux_derived(),
   1.392 +                        actor_tuple_t(
   1.393 +                            phoenix::as_actor<A>::convert(a),
   1.394 +                            phoenix::as_actor<B>::convert(b),
   1.395 +                            phoenix::as_actor<C>::convert(c),
   1.396 +                            phoenix::as_actor<D>::convert(d),
   1.397 +                            phoenix::as_actor<E>::convert(e)
   1.398 +                        )
   1.399 +                    );
   1.400 +            }
   1.401 +
   1.402 +            template <
   1.403 +                typename A, typename B, typename C, typename D, typename E,
   1.404 +                typename F
   1.405 +            >
   1.406 +            init_closure_parser<
   1.407 +                DerivedT2,
   1.408 +                phoenix::tuple<
   1.409 +                    typename phoenix::as_actor<A>::type,
   1.410 +                    typename phoenix::as_actor<B>::type,
   1.411 +                    typename phoenix::as_actor<C>::type,
   1.412 +                    typename phoenix::as_actor<D>::type,
   1.413 +                    typename phoenix::as_actor<E>::type,
   1.414 +                    typename phoenix::as_actor<F>::type
   1.415 +                >
   1.416 +            >
   1.417 +            operator()(
   1.418 +                A const &a, B const &b, C const &c, D const &d, E const &e,
   1.419 +                F const &f
   1.420 +            ) const
   1.421 +            {
   1.422 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.423 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.424 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.425 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.426 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.427 +                typedef typename phoenix::as_actor<F>::type f_t;
   1.428 +                typedef phoenix::tuple<
   1.429 +                            a_t, b_t, c_t, d_t, e_t, f_t
   1.430 +                        > actor_tuple_t;
   1.431 +
   1.432 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.433 +                        aux_derived(),
   1.434 +                        actor_tuple_t(
   1.435 +                            phoenix::as_actor<A>::convert(a),
   1.436 +                            phoenix::as_actor<B>::convert(b),
   1.437 +                            phoenix::as_actor<C>::convert(c),
   1.438 +                            phoenix::as_actor<D>::convert(d),
   1.439 +                            phoenix::as_actor<E>::convert(e),
   1.440 +                            phoenix::as_actor<F>::convert(f)
   1.441 +                        )
   1.442 +                    );
   1.443 +            }
   1.444 +
   1.445 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 6
   1.446 +
   1.447 +            template <
   1.448 +                typename A, typename B, typename C, typename D, typename E,
   1.449 +                typename F, typename G
   1.450 +            >
   1.451 +            init_closure_parser<
   1.452 +                DerivedT2,
   1.453 +                phoenix::tuple<
   1.454 +                    typename phoenix::as_actor<A>::type,
   1.455 +                    typename phoenix::as_actor<B>::type,
   1.456 +                    typename phoenix::as_actor<C>::type,
   1.457 +                    typename phoenix::as_actor<D>::type,
   1.458 +                    typename phoenix::as_actor<E>::type,
   1.459 +                    typename phoenix::as_actor<F>::type,
   1.460 +                    typename phoenix::as_actor<G>::type
   1.461 +                >
   1.462 +            >
   1.463 +            operator()(
   1.464 +                A const &a, B const &b, C const &c, D const &d, E const &e,
   1.465 +                F const &f, G const &g
   1.466 +            ) const
   1.467 +            {
   1.468 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.469 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.470 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.471 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.472 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.473 +                typedef typename phoenix::as_actor<F>::type f_t;
   1.474 +                typedef typename phoenix::as_actor<G>::type g_t;
   1.475 +                typedef phoenix::tuple<
   1.476 +                            a_t, b_t, c_t, d_t, e_t, f_t, g_t
   1.477 +                        > actor_tuple_t;
   1.478 +
   1.479 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.480 +                        aux_derived(),
   1.481 +                        actor_tuple_t(
   1.482 +                            phoenix::as_actor<A>::convert(a),
   1.483 +                            phoenix::as_actor<B>::convert(b),
   1.484 +                            phoenix::as_actor<C>::convert(c),
   1.485 +                            phoenix::as_actor<D>::convert(d),
   1.486 +                            phoenix::as_actor<E>::convert(e),
   1.487 +                            phoenix::as_actor<F>::convert(f),
   1.488 +                            phoenix::as_actor<G>::convert(g)
   1.489 +                        )
   1.490 +                    );
   1.491 +            }
   1.492 +
   1.493 +            template <
   1.494 +                typename A, typename B, typename C, typename D, typename E,
   1.495 +                typename F, typename G, typename H
   1.496 +            >
   1.497 +            init_closure_parser<
   1.498 +                DerivedT2,
   1.499 +                phoenix::tuple<
   1.500 +                    typename phoenix::as_actor<A>::type,
   1.501 +                    typename phoenix::as_actor<B>::type,
   1.502 +                    typename phoenix::as_actor<C>::type,
   1.503 +                    typename phoenix::as_actor<D>::type,
   1.504 +                    typename phoenix::as_actor<E>::type,
   1.505 +                    typename phoenix::as_actor<F>::type,
   1.506 +                    typename phoenix::as_actor<G>::type,
   1.507 +                    typename phoenix::as_actor<H>::type
   1.508 +                >
   1.509 +            >
   1.510 +            operator()(
   1.511 +                A const &a, B const &b, C const &c, D const &d, E const &e,
   1.512 +                F const &f, G const &g, H const &h
   1.513 +            ) const
   1.514 +            {
   1.515 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.516 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.517 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.518 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.519 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.520 +                typedef typename phoenix::as_actor<F>::type f_t;
   1.521 +                typedef typename phoenix::as_actor<G>::type g_t;
   1.522 +                typedef typename phoenix::as_actor<H>::type h_t;
   1.523 +                typedef phoenix::tuple<
   1.524 +                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t
   1.525 +                        > actor_tuple_t;
   1.526 +
   1.527 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.528 +                        aux_derived(),
   1.529 +                        actor_tuple_t(
   1.530 +                            phoenix::as_actor<A>::convert(a),
   1.531 +                            phoenix::as_actor<B>::convert(b),
   1.532 +                            phoenix::as_actor<C>::convert(c),
   1.533 +                            phoenix::as_actor<D>::convert(d),
   1.534 +                            phoenix::as_actor<E>::convert(e),
   1.535 +                            phoenix::as_actor<F>::convert(f),
   1.536 +                            phoenix::as_actor<G>::convert(g),
   1.537 +                            phoenix::as_actor<H>::convert(h)
   1.538 +                        )
   1.539 +                    );
   1.540 +            }
   1.541 +
   1.542 +            template <
   1.543 +                typename A, typename B, typename C, typename D, typename E,
   1.544 +                typename F, typename G, typename H, typename I
   1.545 +            >
   1.546 +            init_closure_parser<
   1.547 +                DerivedT2,
   1.548 +                phoenix::tuple<
   1.549 +                    typename phoenix::as_actor<A>::type,
   1.550 +                    typename phoenix::as_actor<B>::type,
   1.551 +                    typename phoenix::as_actor<C>::type,
   1.552 +                    typename phoenix::as_actor<D>::type,
   1.553 +                    typename phoenix::as_actor<E>::type,
   1.554 +                    typename phoenix::as_actor<F>::type,
   1.555 +                    typename phoenix::as_actor<G>::type,
   1.556 +                    typename phoenix::as_actor<H>::type,
   1.557 +                    typename phoenix::as_actor<I>::type
   1.558 +                >
   1.559 +            >
   1.560 +            operator()(
   1.561 +                A const &a, B const &b, C const &c, D const &d, E const &e,
   1.562 +                F const &f, G const &g, H const &h, I const &i
   1.563 +            ) const
   1.564 +            {
   1.565 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.566 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.567 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.568 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.569 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.570 +                typedef typename phoenix::as_actor<F>::type f_t;
   1.571 +                typedef typename phoenix::as_actor<G>::type g_t;
   1.572 +                typedef typename phoenix::as_actor<H>::type h_t;
   1.573 +                typedef typename phoenix::as_actor<I>::type i_t;
   1.574 +                typedef phoenix::tuple<
   1.575 +                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t
   1.576 +                        > actor_tuple_t;
   1.577 +
   1.578 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.579 +                        aux_derived(),
   1.580 +                        actor_tuple_t(
   1.581 +                            phoenix::as_actor<A>::convert(a),
   1.582 +                            phoenix::as_actor<B>::convert(b),
   1.583 +                            phoenix::as_actor<C>::convert(c),
   1.584 +                            phoenix::as_actor<D>::convert(d),
   1.585 +                            phoenix::as_actor<E>::convert(e),
   1.586 +                            phoenix::as_actor<F>::convert(f),
   1.587 +                            phoenix::as_actor<G>::convert(g),
   1.588 +                            phoenix::as_actor<H>::convert(h),
   1.589 +                            phoenix::as_actor<I>::convert(i)
   1.590 +                        )
   1.591 +                    );
   1.592 +            }
   1.593 +
   1.594 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 9
   1.595 +
   1.596 +            template <
   1.597 +                typename A, typename B, typename C, typename D, typename E,
   1.598 +                typename F, typename G, typename H, typename I, typename J
   1.599 +            >
   1.600 +            init_closure_parser<
   1.601 +                DerivedT2,
   1.602 +                phoenix::tuple<
   1.603 +                    typename phoenix::as_actor<A>::type,
   1.604 +                    typename phoenix::as_actor<B>::type,
   1.605 +                    typename phoenix::as_actor<C>::type,
   1.606 +                    typename phoenix::as_actor<D>::type,
   1.607 +                    typename phoenix::as_actor<E>::type,
   1.608 +                    typename phoenix::as_actor<F>::type,
   1.609 +                    typename phoenix::as_actor<G>::type,
   1.610 +                    typename phoenix::as_actor<H>::type,
   1.611 +                    typename phoenix::as_actor<I>::type,
   1.612 +                    typename phoenix::as_actor<J>::type
   1.613 +                >
   1.614 +            >
   1.615 +            operator()(
   1.616 +                A const &a, B const &b, C const &c, D const &d, E const &e,
   1.617 +                F const &f, G const &g, H const &h, I const &i, J const &j
   1.618 +            ) const
   1.619 +            {
   1.620 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.621 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.622 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.623 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.624 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.625 +                typedef typename phoenix::as_actor<F>::type f_t;
   1.626 +                typedef typename phoenix::as_actor<G>::type g_t;
   1.627 +                typedef typename phoenix::as_actor<H>::type h_t;
   1.628 +                typedef typename phoenix::as_actor<I>::type i_t;
   1.629 +                typedef typename phoenix::as_actor<J>::type j_t;
   1.630 +                typedef phoenix::tuple<
   1.631 +                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t
   1.632 +                        > actor_tuple_t;
   1.633 +
   1.634 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.635 +                        aux_derived(),
   1.636 +                        actor_tuple_t(
   1.637 +                            phoenix::as_actor<A>::convert(a),
   1.638 +                            phoenix::as_actor<B>::convert(b),
   1.639 +                            phoenix::as_actor<C>::convert(c),
   1.640 +                            phoenix::as_actor<D>::convert(d),
   1.641 +                            phoenix::as_actor<E>::convert(e),
   1.642 +                            phoenix::as_actor<F>::convert(f),
   1.643 +                            phoenix::as_actor<G>::convert(g),
   1.644 +                            phoenix::as_actor<H>::convert(h),
   1.645 +                            phoenix::as_actor<I>::convert(i),
   1.646 +                            phoenix::as_actor<J>::convert(j)
   1.647 +                        )
   1.648 +                    );
   1.649 +            }
   1.650 +
   1.651 +            template <
   1.652 +                typename A, typename B, typename C, typename D, typename E,
   1.653 +                typename F, typename G, typename H, typename I, typename J,
   1.654 +                typename K
   1.655 +            >
   1.656 +            init_closure_parser<
   1.657 +                DerivedT2,
   1.658 +                phoenix::tuple<
   1.659 +                    typename phoenix::as_actor<A>::type,
   1.660 +                    typename phoenix::as_actor<B>::type,
   1.661 +                    typename phoenix::as_actor<C>::type,
   1.662 +                    typename phoenix::as_actor<D>::type,
   1.663 +                    typename phoenix::as_actor<E>::type,
   1.664 +                    typename phoenix::as_actor<F>::type,
   1.665 +                    typename phoenix::as_actor<G>::type,
   1.666 +                    typename phoenix::as_actor<H>::type,
   1.667 +                    typename phoenix::as_actor<I>::type,
   1.668 +                    typename phoenix::as_actor<J>::type,
   1.669 +                    typename phoenix::as_actor<K>::type
   1.670 +                >
   1.671 +            >
   1.672 +            operator()(
   1.673 +                A const &a, B const &b, C const &c, D const &d, E const &e,
   1.674 +                F const &f, G const &g, H const &h, I const &i, J const &j,
   1.675 +                K const &k
   1.676 +            ) const
   1.677 +            {
   1.678 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.679 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.680 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.681 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.682 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.683 +                typedef typename phoenix::as_actor<F>::type f_t;
   1.684 +                typedef typename phoenix::as_actor<G>::type g_t;
   1.685 +                typedef typename phoenix::as_actor<H>::type h_t;
   1.686 +                typedef typename phoenix::as_actor<I>::type i_t;
   1.687 +                typedef typename phoenix::as_actor<J>::type j_t;
   1.688 +                typedef typename phoenix::as_actor<K>::type k_t;
   1.689 +                typedef phoenix::tuple<
   1.690 +                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
   1.691 +                            k_t
   1.692 +                        > actor_tuple_t;
   1.693 +
   1.694 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.695 +                        aux_derived(),
   1.696 +                        actor_tuple_t(
   1.697 +                            phoenix::as_actor<A>::convert(a),
   1.698 +                            phoenix::as_actor<B>::convert(b),
   1.699 +                            phoenix::as_actor<C>::convert(c),
   1.700 +                            phoenix::as_actor<D>::convert(d),
   1.701 +                            phoenix::as_actor<E>::convert(e),
   1.702 +                            phoenix::as_actor<F>::convert(f),
   1.703 +                            phoenix::as_actor<G>::convert(g),
   1.704 +                            phoenix::as_actor<H>::convert(h),
   1.705 +                            phoenix::as_actor<I>::convert(i),
   1.706 +                            phoenix::as_actor<J>::convert(j),
   1.707 +                            phoenix::as_actor<K>::convert(k)
   1.708 +                        )
   1.709 +                    );
   1.710 +            }
   1.711 +
   1.712 +            template <
   1.713 +                typename A, typename B, typename C, typename D, typename E,
   1.714 +                typename F, typename G, typename H, typename I, typename J,
   1.715 +                typename K, typename L
   1.716 +            >
   1.717 +            init_closure_parser<
   1.718 +                DerivedT2,
   1.719 +                phoenix::tuple<
   1.720 +                    typename phoenix::as_actor<A>::type,
   1.721 +                    typename phoenix::as_actor<B>::type,
   1.722 +                    typename phoenix::as_actor<C>::type,
   1.723 +                    typename phoenix::as_actor<D>::type,
   1.724 +                    typename phoenix::as_actor<E>::type,
   1.725 +                    typename phoenix::as_actor<F>::type,
   1.726 +                    typename phoenix::as_actor<G>::type,
   1.727 +                    typename phoenix::as_actor<H>::type,
   1.728 +                    typename phoenix::as_actor<I>::type,
   1.729 +                    typename phoenix::as_actor<J>::type,
   1.730 +                    typename phoenix::as_actor<K>::type,
   1.731 +                    typename phoenix::as_actor<L>::type
   1.732 +                >
   1.733 +            >
   1.734 +            operator()(
   1.735 +                A const &a, B const &b, C const &c, D const &d, E const &e,
   1.736 +                F const &f, G const &g, H const &h, I const &i, J const &j,
   1.737 +                K const &k, L const &l
   1.738 +            ) const
   1.739 +            {
   1.740 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.741 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.742 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.743 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.744 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.745 +                typedef typename phoenix::as_actor<F>::type f_t;
   1.746 +                typedef typename phoenix::as_actor<G>::type g_t;
   1.747 +                typedef typename phoenix::as_actor<H>::type h_t;
   1.748 +                typedef typename phoenix::as_actor<I>::type i_t;
   1.749 +                typedef typename phoenix::as_actor<J>::type j_t;
   1.750 +                typedef typename phoenix::as_actor<K>::type k_t;
   1.751 +                typedef typename phoenix::as_actor<L>::type l_t;
   1.752 +                typedef phoenix::tuple<
   1.753 +                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
   1.754 +                            k_t, l_t
   1.755 +                        > actor_tuple_t;
   1.756 +
   1.757 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.758 +                        aux_derived(),
   1.759 +                        actor_tuple_t(
   1.760 +                            phoenix::as_actor<A>::convert(a),
   1.761 +                            phoenix::as_actor<B>::convert(b),
   1.762 +                            phoenix::as_actor<C>::convert(c),
   1.763 +                            phoenix::as_actor<D>::convert(d),
   1.764 +                            phoenix::as_actor<E>::convert(e),
   1.765 +                            phoenix::as_actor<F>::convert(f),
   1.766 +                            phoenix::as_actor<G>::convert(g),
   1.767 +                            phoenix::as_actor<H>::convert(h),
   1.768 +                            phoenix::as_actor<I>::convert(i),
   1.769 +                            phoenix::as_actor<J>::convert(j),
   1.770 +                            phoenix::as_actor<K>::convert(k),
   1.771 +                            phoenix::as_actor<L>::convert(l)
   1.772 +                        )
   1.773 +                    );
   1.774 +            }
   1.775 +
   1.776 +    #if BOOST_SPIRIT_CLOSURE_LIMIT > 12
   1.777 +
   1.778 +            template <
   1.779 +                typename A, typename B, typename C, typename D, typename E,
   1.780 +                typename F, typename G, typename H, typename I, typename J,
   1.781 +                typename K, typename L, typename M
   1.782 +            >
   1.783 +            init_closure_parser<
   1.784 +                DerivedT2,
   1.785 +                phoenix::tuple<
   1.786 +                    typename phoenix::as_actor<A>::type,
   1.787 +                    typename phoenix::as_actor<B>::type,
   1.788 +                    typename phoenix::as_actor<C>::type,
   1.789 +                    typename phoenix::as_actor<D>::type,
   1.790 +                    typename phoenix::as_actor<E>::type,
   1.791 +                    typename phoenix::as_actor<F>::type,
   1.792 +                    typename phoenix::as_actor<G>::type,
   1.793 +                    typename phoenix::as_actor<H>::type,
   1.794 +                    typename phoenix::as_actor<I>::type,
   1.795 +                    typename phoenix::as_actor<J>::type,
   1.796 +                    typename phoenix::as_actor<K>::type,
   1.797 +                    typename phoenix::as_actor<L>::type,
   1.798 +                    typename phoenix::as_actor<M>::type
   1.799 +                >
   1.800 +            >
   1.801 +            operator()(
   1.802 +                A const &a, B const &b, C const &c, D const &d, E const &e,
   1.803 +                F const &f, G const &g, H const &h, I const &i, J const &j,
   1.804 +                K const &k, L const &l, M const &m
   1.805 +            ) const
   1.806 +            {
   1.807 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.808 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.809 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.810 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.811 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.812 +                typedef typename phoenix::as_actor<F>::type f_t;
   1.813 +                typedef typename phoenix::as_actor<G>::type g_t;
   1.814 +                typedef typename phoenix::as_actor<H>::type h_t;
   1.815 +                typedef typename phoenix::as_actor<I>::type i_t;
   1.816 +                typedef typename phoenix::as_actor<J>::type j_t;
   1.817 +                typedef typename phoenix::as_actor<K>::type k_t;
   1.818 +                typedef typename phoenix::as_actor<L>::type l_t;
   1.819 +                typedef typename phoenix::as_actor<M>::type m_t;
   1.820 +                typedef phoenix::tuple<
   1.821 +                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
   1.822 +                            k_t, l_t, m_t
   1.823 +                        > actor_tuple_t;
   1.824 +
   1.825 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.826 +                        aux_derived(),
   1.827 +                        actor_tuple_t(
   1.828 +                            phoenix::as_actor<A>::convert(a),
   1.829 +                            phoenix::as_actor<B>::convert(b),
   1.830 +                            phoenix::as_actor<C>::convert(c),
   1.831 +                            phoenix::as_actor<D>::convert(d),
   1.832 +                            phoenix::as_actor<E>::convert(e),
   1.833 +                            phoenix::as_actor<F>::convert(f),
   1.834 +                            phoenix::as_actor<G>::convert(g),
   1.835 +                            phoenix::as_actor<H>::convert(h),
   1.836 +                            phoenix::as_actor<I>::convert(i),
   1.837 +                            phoenix::as_actor<J>::convert(j),
   1.838 +                            phoenix::as_actor<K>::convert(k),
   1.839 +                            phoenix::as_actor<L>::convert(l),
   1.840 +                            phoenix::as_actor<M>::convert(m)
   1.841 +                        )
   1.842 +                    );
   1.843 +            }
   1.844 +
   1.845 +            template <
   1.846 +                typename A, typename B, typename C, typename D, typename E,
   1.847 +                typename F, typename G, typename H, typename I, typename J,
   1.848 +                typename K, typename L, typename M, typename N
   1.849 +            >
   1.850 +            init_closure_parser<
   1.851 +                DerivedT2,
   1.852 +                phoenix::tuple<
   1.853 +                    typename phoenix::as_actor<A>::type,
   1.854 +                    typename phoenix::as_actor<B>::type,
   1.855 +                    typename phoenix::as_actor<C>::type,
   1.856 +                    typename phoenix::as_actor<D>::type,
   1.857 +                    typename phoenix::as_actor<E>::type,
   1.858 +                    typename phoenix::as_actor<F>::type,
   1.859 +                    typename phoenix::as_actor<G>::type,
   1.860 +                    typename phoenix::as_actor<H>::type,
   1.861 +                    typename phoenix::as_actor<I>::type,
   1.862 +                    typename phoenix::as_actor<J>::type,
   1.863 +                    typename phoenix::as_actor<K>::type,
   1.864 +                    typename phoenix::as_actor<L>::type,
   1.865 +                    typename phoenix::as_actor<M>::type,
   1.866 +                    typename phoenix::as_actor<N>::type
   1.867 +                >
   1.868 +            >
   1.869 +            operator()(
   1.870 +                A const &a, B const &b, C const &c, D const &d, E const &e,
   1.871 +                F const &f, G const &g, H const &h, I const &i, J const &j,
   1.872 +                K const &k, L const &l, M const &m, N const &n
   1.873 +            ) const
   1.874 +            {
   1.875 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.876 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.877 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.878 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.879 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.880 +                typedef typename phoenix::as_actor<F>::type f_t;
   1.881 +                typedef typename phoenix::as_actor<G>::type g_t;
   1.882 +                typedef typename phoenix::as_actor<H>::type h_t;
   1.883 +                typedef typename phoenix::as_actor<I>::type i_t;
   1.884 +                typedef typename phoenix::as_actor<J>::type j_t;
   1.885 +                typedef typename phoenix::as_actor<K>::type k_t;
   1.886 +                typedef typename phoenix::as_actor<L>::type l_t;
   1.887 +                typedef typename phoenix::as_actor<M>::type m_t;
   1.888 +                typedef typename phoenix::as_actor<N>::type n_t;
   1.889 +                typedef phoenix::tuple<
   1.890 +                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
   1.891 +                            k_t, l_t, m_t, n_t
   1.892 +                        > actor_tuple_t;
   1.893 +
   1.894 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.895 +                        aux_derived(),
   1.896 +                        actor_tuple_t(
   1.897 +                            phoenix::as_actor<A>::convert(a),
   1.898 +                            phoenix::as_actor<B>::convert(b),
   1.899 +                            phoenix::as_actor<C>::convert(c),
   1.900 +                            phoenix::as_actor<D>::convert(d),
   1.901 +                            phoenix::as_actor<E>::convert(e),
   1.902 +                            phoenix::as_actor<F>::convert(f),
   1.903 +                            phoenix::as_actor<G>::convert(g),
   1.904 +                            phoenix::as_actor<H>::convert(h),
   1.905 +                            phoenix::as_actor<I>::convert(i),
   1.906 +                            phoenix::as_actor<J>::convert(j),
   1.907 +                            phoenix::as_actor<K>::convert(k),
   1.908 +                            phoenix::as_actor<L>::convert(l),
   1.909 +                            phoenix::as_actor<M>::convert(m),
   1.910 +                            phoenix::as_actor<N>::convert(n)
   1.911 +                        )
   1.912 +                    );
   1.913 +            }
   1.914 +
   1.915 +            template <
   1.916 +                typename A, typename B, typename C, typename D, typename E,
   1.917 +                typename F, typename G, typename H, typename I, typename J,
   1.918 +                typename K, typename L, typename M, typename N, typename O
   1.919 +            >
   1.920 +            init_closure_parser<
   1.921 +                DerivedT2,
   1.922 +                phoenix::tuple<
   1.923 +                    typename phoenix::as_actor<A>::type,
   1.924 +                    typename phoenix::as_actor<B>::type,
   1.925 +                    typename phoenix::as_actor<C>::type,
   1.926 +                    typename phoenix::as_actor<D>::type,
   1.927 +                    typename phoenix::as_actor<E>::type,
   1.928 +                    typename phoenix::as_actor<F>::type,
   1.929 +                    typename phoenix::as_actor<G>::type,
   1.930 +                    typename phoenix::as_actor<H>::type,
   1.931 +                    typename phoenix::as_actor<I>::type,
   1.932 +                    typename phoenix::as_actor<J>::type,
   1.933 +                    typename phoenix::as_actor<K>::type,
   1.934 +                    typename phoenix::as_actor<L>::type,
   1.935 +                    typename phoenix::as_actor<M>::type,
   1.936 +                    typename phoenix::as_actor<N>::type,
   1.937 +                    typename phoenix::as_actor<O>::type
   1.938 +                >
   1.939 +            >
   1.940 +            operator()(
   1.941 +                A const &a, B const &b, C const &c, D const &d, E const &e,
   1.942 +                F const &f, G const &g, H const &h, I const &i, J const &j,
   1.943 +                K const &k, L const &l, M const &m, N const &n, O const &o
   1.944 +            ) const
   1.945 +            {
   1.946 +                typedef typename phoenix::as_actor<A>::type a_t;
   1.947 +                typedef typename phoenix::as_actor<B>::type b_t;
   1.948 +                typedef typename phoenix::as_actor<C>::type c_t;
   1.949 +                typedef typename phoenix::as_actor<D>::type d_t;
   1.950 +                typedef typename phoenix::as_actor<E>::type e_t;
   1.951 +                typedef typename phoenix::as_actor<F>::type f_t;
   1.952 +                typedef typename phoenix::as_actor<G>::type g_t;
   1.953 +                typedef typename phoenix::as_actor<H>::type h_t;
   1.954 +                typedef typename phoenix::as_actor<I>::type i_t;
   1.955 +                typedef typename phoenix::as_actor<J>::type j_t;
   1.956 +                typedef typename phoenix::as_actor<K>::type k_t;
   1.957 +                typedef typename phoenix::as_actor<L>::type l_t;
   1.958 +                typedef typename phoenix::as_actor<M>::type m_t;
   1.959 +                typedef typename phoenix::as_actor<N>::type n_t;
   1.960 +                typedef typename phoenix::as_actor<O>::type o_t;
   1.961 +                typedef phoenix::tuple<
   1.962 +                            a_t, b_t, c_t, d_t, e_t, f_t, g_t, h_t, i_t, j_t,
   1.963 +                            k_t, l_t, m_t, n_t, o_t
   1.964 +                        > actor_tuple_t;
   1.965 +
   1.966 +                return init_closure_parser<DerivedT2, actor_tuple_t>(
   1.967 +                        aux_derived(),
   1.968 +                        actor_tuple_t(
   1.969 +                            phoenix::as_actor<A>::convert(a),
   1.970 +                            phoenix::as_actor<B>::convert(b),
   1.971 +                            phoenix::as_actor<C>::convert(c),
   1.972 +                            phoenix::as_actor<D>::convert(d),
   1.973 +                            phoenix::as_actor<E>::convert(e),
   1.974 +                            phoenix::as_actor<F>::convert(f),
   1.975 +                            phoenix::as_actor<G>::convert(g),
   1.976 +                            phoenix::as_actor<H>::convert(h),
   1.977 +                            phoenix::as_actor<I>::convert(i),
   1.978 +                            phoenix::as_actor<J>::convert(j),
   1.979 +                            phoenix::as_actor<K>::convert(k),
   1.980 +                            phoenix::as_actor<L>::convert(l),
   1.981 +                            phoenix::as_actor<M>::convert(m),
   1.982 +                            phoenix::as_actor<N>::convert(n),
   1.983 +                            phoenix::as_actor<O>::convert(o)
   1.984 +                        )
   1.985 +                    );
   1.986 +            }
   1.987 +
   1.988 +    #endif
   1.989 +    #endif
   1.990 +    #endif
   1.991 +    #endif
   1.992 +        };
   1.993 +
   1.994 +        ~closure() {}
   1.995 +    };
   1.996 +
   1.997 +    ///////////////////////////////////////////////////////////////////////////
   1.998 +    //
   1.999 +    //  overloads for chseq_p and str_p taking in phoenix actors
  1.1000 +    //
  1.1001 +    ///////////////////////////////////////////////////////////////////////////
  1.1002 +    template <typename ActorT>
  1.1003 +    struct container_begin
  1.1004 +    {
  1.1005 +        typedef container_begin<ActorT> self_t;
  1.1006 +
  1.1007 +        template <typename TupleT>
  1.1008 +        struct result
  1.1009 +        {
  1.1010 +            typedef typename phoenix::actor_result<ActorT, TupleT>
  1.1011 +                ::plain_type::iterator type;
  1.1012 +        };
  1.1013 +
  1.1014 +        container_begin(ActorT actor_)
  1.1015 +        : actor(actor_) {}
  1.1016 +
  1.1017 +        template <typename TupleT>
  1.1018 +        typename phoenix::actor_result<self_t, TupleT>::type
  1.1019 +        eval(TupleT const& /*args*/) const
  1.1020 +        { return actor().begin(); }
  1.1021 +
  1.1022 +        ActorT actor;
  1.1023 +    };
  1.1024 +
  1.1025 +    template <typename ActorT>
  1.1026 +    struct container_end
  1.1027 +    {
  1.1028 +        typedef container_begin<ActorT> self_t;
  1.1029 +
  1.1030 +        template <typename TupleT>
  1.1031 +        struct result
  1.1032 +        {
  1.1033 +            typedef typename phoenix::actor_result<ActorT, TupleT>
  1.1034 +                ::plain_type::iterator type;
  1.1035 +        };
  1.1036 +
  1.1037 +        container_end(ActorT actor_)
  1.1038 +        : actor(actor_) {}
  1.1039 +
  1.1040 +        template <typename TupleT>
  1.1041 +        typename phoenix::actor_result<self_t, TupleT>::type
  1.1042 +        eval(TupleT const& /*args*/) const
  1.1043 +        { return actor().end(); }
  1.1044 +
  1.1045 +        ActorT actor;
  1.1046 +    };
  1.1047 +
  1.1048 +    template <typename BaseT>
  1.1049 +    inline f_chseq<
  1.1050 +        phoenix::actor<container_begin<phoenix::actor<BaseT> > >,
  1.1051 +        phoenix::actor<container_end<phoenix::actor<BaseT> > >
  1.1052 +    >
  1.1053 +    f_chseq_p(phoenix::actor<BaseT> const& a)
  1.1054 +    {
  1.1055 +        typedef phoenix::actor<container_begin<phoenix::actor<BaseT> > >
  1.1056 +            container_begin_t;
  1.1057 +        typedef phoenix::actor<container_end<phoenix::actor<BaseT> > >
  1.1058 +            container_end_t;
  1.1059 +        typedef f_chseq<container_begin_t, container_end_t> result_t;
  1.1060 +
  1.1061 +        return result_t(container_begin_t(a), container_end_t(a));
  1.1062 +    }
  1.1063 +
  1.1064 +    template <typename BaseT>
  1.1065 +    inline f_strlit<
  1.1066 +        phoenix::actor<container_begin<phoenix::actor<BaseT> > >,
  1.1067 +        phoenix::actor<container_end<phoenix::actor<BaseT> > >
  1.1068 +    >
  1.1069 +    f_str_p(phoenix::actor<BaseT> const& a)
  1.1070 +    {
  1.1071 +        typedef phoenix::actor<container_begin<phoenix::actor<BaseT> > >
  1.1072 +            container_begin_t;
  1.1073 +        typedef phoenix::actor<container_end<phoenix::actor<BaseT> > >
  1.1074 +            container_end_t;
  1.1075 +        typedef f_strlit<container_begin_t, container_end_t> result_t;
  1.1076 +
  1.1077 +        return result_t(container_begin_t(a), container_end_t(a));
  1.1078 +    }
  1.1079 +
  1.1080 +}} // namespace boost::spirit
  1.1081 +
  1.1082 +#endif