blob: 9e76c1eb13b2422576d20991dbc5e0258adbfa33 [file] [log] [blame]
/*=============================================================================
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