You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
195 lines
6.8 KiB
195 lines
6.8 KiB
/*============================================================================== |
|
Copyright (c) 2005-2010 Joel de Guzman |
|
Copyright (c) 2010-2011 Thomas Heller |
|
|
|
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_PHOENIX_SCOPE_LOCAL_VARIABLE_HPP |
|
#define BOOST_PHOENIX_SCOPE_LOCAL_VARIABLE_HPP |
|
|
|
#include <boost/phoenix/core/limits.hpp> |
|
#include <boost/phoenix/core/call.hpp> |
|
#include <boost/phoenix/core/expression.hpp> |
|
#include <boost/phoenix/core/reference.hpp> |
|
#include <boost/phoenix/core/value.hpp> |
|
#include <boost/phoenix/scope/scoped_environment.hpp> |
|
#include <boost/phoenix/scope/detail/local_variable.hpp> |
|
#include <boost/phoenix/statement/sequence.hpp> |
|
|
|
namespace boost { namespace phoenix |
|
{ |
|
namespace detail |
|
{ |
|
} |
|
|
|
namespace expression |
|
{ |
|
template <typename Key> |
|
struct local_variable |
|
: expression::terminal<detail::local<Key> > |
|
{ |
|
typedef typename expression::terminal<detail::local<Key> >::type type; |
|
|
|
static type make() |
|
{ |
|
type const e = {}; |
|
return e; |
|
} |
|
}; |
|
} |
|
|
|
namespace rule |
|
{ |
|
struct local_variable |
|
: expression::local_variable<proto::_> |
|
{}; |
|
|
|
struct local_var_def |
|
: proto::assign<local_variable, meta_grammar> |
|
{}; |
|
} |
|
|
|
namespace result_of |
|
{ |
|
template <typename Key> |
|
struct is_nullary<custom_terminal<detail::local<Key> > > |
|
: mpl::false_ |
|
{}; |
|
} |
|
|
|
namespace detail |
|
{ |
|
struct scope_is_nullary_actions |
|
{ |
|
template <typename Rule, typename Dummy = void> |
|
struct when |
|
: boost::phoenix::is_nullary::when<Rule, Dummy> |
|
{}; |
|
}; |
|
|
|
template <typename Dummy> |
|
struct scope_is_nullary_actions::when<boost::phoenix::rule::custom_terminal, Dummy> |
|
: proto::or_< |
|
proto::when<boost::phoenix::rule::local_variable, mpl::true_()> |
|
, proto::otherwise< |
|
is_nullary::when<boost::phoenix::rule::custom_terminal, Dummy> |
|
> |
|
> |
|
{}; |
|
|
|
struct local_var_not_found |
|
{ |
|
}; |
|
} |
|
|
|
template<typename Key> |
|
struct is_custom_terminal<detail::local<Key> > |
|
: mpl::true_ |
|
{}; |
|
|
|
template <typename Key> |
|
struct custom_terminal<detail::local<Key> > |
|
{ |
|
template <typename Sig> |
|
struct result; |
|
|
|
template <typename This, typename Local, typename Context> |
|
struct result<This(Local, Context)> |
|
: result<This(Local const &, Context)> |
|
{}; |
|
|
|
template <typename This, typename Local, typename Context> |
|
struct result<This(Local &, Context)> |
|
{ |
|
typedef |
|
typename remove_reference< |
|
typename result_of::env<Context>::type |
|
>::type |
|
env_type; |
|
|
|
typedef typename detail::apply_local<detail::local<Key>, env_type>::type type; |
|
}; |
|
|
|
template <typename Local, typename Context> |
|
typename result<custom_terminal(Local const &, Context const&)>::type |
|
operator()(Local, Context const & ctx) |
|
{ |
|
typedef |
|
typename remove_reference< |
|
typename result_of::env<Context>::type |
|
>::type |
|
env_type; |
|
|
|
typedef typename detail::apply_local<detail::local<Key>, env_type>::type return_type; |
|
|
|
static const int index_value = detail::get_index<typename env_type::map_type, detail::local<Key> >::value; |
|
|
|
typedef detail::eval_local<Key> eval_local; |
|
|
|
return eval_local::template get<return_type, index_value>( |
|
phoenix::env(ctx)); |
|
} |
|
}; |
|
|
|
namespace local_names |
|
{ |
|
typedef expression::local_variable<struct _a_key>::type _a_type; |
|
typedef expression::local_variable<struct _b_key>::type _b_type; |
|
typedef expression::local_variable<struct _c_key>::type _c_type; |
|
typedef expression::local_variable<struct _d_key>::type _d_type; |
|
typedef expression::local_variable<struct _e_key>::type _e_type; |
|
typedef expression::local_variable<struct _f_key>::type _f_type; |
|
typedef expression::local_variable<struct _g_key>::type _g_type; |
|
typedef expression::local_variable<struct _h_key>::type _h_type; |
|
typedef expression::local_variable<struct _i_key>::type _i_type; |
|
typedef expression::local_variable<struct _j_key>::type _j_type; |
|
typedef expression::local_variable<struct _k_key>::type _k_type; |
|
typedef expression::local_variable<struct _l_key>::type _l_type; |
|
typedef expression::local_variable<struct _m_key>::type _m_type; |
|
typedef expression::local_variable<struct _n_key>::type _n_type; |
|
typedef expression::local_variable<struct _o_key>::type _o_type; |
|
typedef expression::local_variable<struct _p_key>::type _p_type; |
|
typedef expression::local_variable<struct _q_key>::type _q_type; |
|
typedef expression::local_variable<struct _r_key>::type _r_type; |
|
typedef expression::local_variable<struct _s_key>::type _s_type; |
|
typedef expression::local_variable<struct _t_key>::type _t_type; |
|
typedef expression::local_variable<struct _u_key>::type _u_type; |
|
typedef expression::local_variable<struct _v_key>::type _v_type; |
|
typedef expression::local_variable<struct _w_key>::type _w_type; |
|
typedef expression::local_variable<struct _x_key>::type _x_type; |
|
typedef expression::local_variable<struct _y_key>::type _y_type; |
|
typedef expression::local_variable<struct _z_key>::type _z_type; |
|
|
|
#ifndef BOOST_PHOENIX_NO_PREDEFINED_TERMINALS |
|
_a_type const _a = {{{}}}; |
|
_b_type const _b = {{{}}}; |
|
_c_type const _c = {{{}}}; |
|
_d_type const _d = {{{}}}; |
|
_e_type const _e = {{{}}}; |
|
_f_type const _f = {{{}}}; |
|
_g_type const _g = {{{}}}; |
|
_h_type const _h = {{{}}}; |
|
_i_type const _i = {{{}}}; |
|
_j_type const _j = {{{}}}; |
|
_k_type const _k = {{{}}}; |
|
_l_type const _l = {{{}}}; |
|
_m_type const _m = {{{}}}; |
|
_n_type const _n = {{{}}}; |
|
_o_type const _o = {{{}}}; |
|
_p_type const _p = {{{}}}; |
|
_q_type const _q = {{{}}}; |
|
_r_type const _r = {{{}}}; |
|
_s_type const _s = {{{}}}; |
|
_t_type const _t = {{{}}}; |
|
_u_type const _u = {{{}}}; |
|
_v_type const _v = {{{}}}; |
|
_w_type const _w = {{{}}}; |
|
_x_type const _x = {{{}}}; |
|
_y_type const _y = {{{}}}; |
|
_z_type const _z = {{{}}}; |
|
#endif |
|
} |
|
}} |
|
|
|
#endif
|
|
|