// Copyright 2008 Christophe Henry | |
// henry UNDERSCORE christophe AT hotmail DOT com | |
// This is an extended version of the state machine available in the boost::mpl library | |
// Distributed under the same license as the original. | |
// Copyright for the original version: | |
// Copyright 2005 David Abrahams and Aleksey Gurtovoy. 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_MSM_FRONT_EUML_GUARD_GRAMMAR_H | |
#define BOOST_MSM_FRONT_EUML_GUARD_GRAMMAR_H | |
#include <boost/msm/front/euml/common.hpp> | |
#include <boost/msm/front/euml/operator.hpp> | |
#include <boost/msm/front/euml/state_grammar.hpp> | |
namespace boost { namespace msm { namespace front { namespace euml | |
{ | |
struct BuildGuards; | |
struct BuildActions; | |
struct BuildGuardsCases | |
{ | |
// The primary template matches nothing: | |
template<typename Tag> | |
struct case_ | |
: proto::not_<proto::_> | |
{}; | |
}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::logical_or> | |
: proto::when< | |
proto::logical_or<BuildGuards,BuildGuards >, | |
Or_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::logical_and> | |
: proto::when< | |
proto::logical_and<BuildGuards,BuildGuards >, | |
And_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::logical_not> | |
: proto::when< | |
proto::logical_not<BuildGuards >, | |
Not_<BuildGuards(proto::_child)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::less> | |
: proto::when< | |
proto::less<BuildGuards, BuildGuards >, | |
Less_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::less_equal> | |
: proto::when< | |
proto::less_equal<BuildGuards, BuildGuards >, | |
LessEqual_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::greater> | |
: proto::when< | |
proto::greater<BuildGuards, BuildGuards >, | |
Greater_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::greater_equal> | |
: proto::when< | |
proto::greater_equal<BuildGuards, BuildGuards >, | |
GreaterEqual_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::equal_to> | |
: proto::when< | |
proto::equal_to<BuildGuards, BuildGuards >, | |
EqualTo_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::not_equal_to> | |
: proto::when< | |
proto::not_equal_to<BuildGuards, BuildGuards >, | |
NotEqualTo_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::pre_inc> | |
: proto::when< | |
proto::pre_inc<BuildGuards >, | |
Pre_inc_<BuildGuards(proto::_child)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::dereference> | |
: proto::when< | |
proto::dereference<BuildGuards >, | |
Deref_<BuildGuards(proto::_child)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::pre_dec> | |
: proto::when< | |
proto::pre_dec<BuildGuards >, | |
Pre_dec_<BuildGuards(proto::_child)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::post_inc> | |
: proto::when< | |
proto::post_inc<BuildGuards >, | |
Post_inc_<BuildGuards(proto::_child)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::post_dec> | |
: proto::when< | |
proto::post_dec<BuildGuards >, | |
Post_dec_<BuildGuards(proto::_child)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::plus> | |
: proto::when< | |
proto::plus<BuildGuards,BuildGuards >, | |
Plus_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::minus> | |
: proto::when< | |
proto::minus<BuildGuards,BuildGuards >, | |
Minus_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::multiplies> | |
: proto::when< | |
proto::multiplies<BuildGuards,BuildGuards >, | |
Multiplies_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::divides> | |
: proto::when< | |
proto::divides<BuildGuards,BuildGuards >, | |
Divides_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::modulus> | |
: proto::when< | |
proto::modulus<BuildGuards,BuildGuards >, | |
Modulus_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::bitwise_and> | |
: proto::when< | |
proto::bitwise_and<BuildGuards,BuildGuards >, | |
Bitwise_And_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::bitwise_or> | |
: proto::when< | |
proto::bitwise_or<BuildGuards,BuildGuards >, | |
Bitwise_Or_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::subscript> | |
: proto::when< | |
proto::subscript<BuildGuards,BuildGuards >, | |
Subscript_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::plus_assign> | |
: proto::when< | |
proto::plus_assign<BuildGuards,BuildGuards >, | |
Plus_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::minus_assign> | |
: proto::when< | |
proto::minus_assign<BuildGuards,BuildGuards >, | |
Minus_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::multiplies_assign> | |
: proto::when< | |
proto::multiplies_assign<BuildGuards,BuildGuards >, | |
Multiplies_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::divides_assign> | |
: proto::when< | |
proto::divides_assign<BuildGuards,BuildGuards >, | |
Divides_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::modulus_assign> | |
: proto::when< | |
proto::modulus_assign<BuildGuards,BuildGuards >, | |
Modulus_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::shift_left_assign> | |
: proto::when< | |
proto::shift_left_assign<BuildGuards,BuildGuards >, | |
ShiftLeft_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::shift_right_assign> | |
: proto::when< | |
proto::shift_right_assign<BuildGuards,BuildGuards >, | |
ShiftRight_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::shift_left> | |
: proto::when< | |
proto::shift_left<BuildGuards,BuildGuards >, | |
ShiftLeft_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::shift_right> | |
: proto::when< | |
proto::shift_right<BuildGuards,BuildGuards >, | |
ShiftRight_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::assign> | |
: proto::when< | |
proto::assign<BuildGuards,BuildGuards >, | |
Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::bitwise_xor> | |
: proto::when< | |
proto::bitwise_xor<BuildGuards,BuildGuards >, | |
Bitwise_Xor_<BuildGuards(proto::_left),BuildGuards(proto::_right)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::negate> | |
: proto::when< | |
proto::negate<BuildGuards >, | |
Unary_Minus_<BuildGuards(proto::_child)>() | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::function> | |
: proto::or_< | |
proto::when< | |
proto::function<proto::terminal<if_tag>,BuildGuards,BuildGuards,BuildGuards >, | |
If_Else_<BuildGuards(proto::_child_c<1>), | |
BuildGuards(proto::_child_c<2>), | |
BuildGuards(proto::_child_c<3>) >() | |
>, | |
proto::when< | |
proto::function<proto::terminal<proto::_> >, | |
get_fct<proto::_child_c<0> >() | |
>, | |
proto::when< | |
proto::function<proto::terminal<proto::_>,BuildActions >, | |
get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>) >() | |
>, | |
proto::when< | |
proto::function<proto::terminal<proto::_>,BuildActions,BuildActions >, | |
get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) >() | |
>, | |
proto::when< | |
proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions >, | |
get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>) | |
,BuildActions(proto::_child_c<2>),BuildActions(proto::_child_c<3>) >() | |
>, | |
proto::when< | |
proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions >, | |
get_fct<proto::_child_c<0> | |
,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) | |
,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>) >() | |
>, | |
proto::when< | |
proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >, | |
get_fct<proto::_child_c<0> | |
,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) | |
,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>),BuildActions(proto::_child_c<5>) >() | |
> | |
#ifdef BOOST_MSVC | |
,proto::when< | |
proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >, | |
get_fct<proto::_child_c<0> | |
,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) | |
,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>) | |
,BuildActions(proto::_child_c<5>),BuildActions(proto::_child_c<6>) >() | |
> | |
#endif | |
> | |
{}; | |
template<> | |
struct BuildGuardsCases::case_<proto::tag::terminal> | |
: proto::or_< | |
proto::when < | |
proto::terminal<action_tag>, | |
get_action_name<proto::_ >() | |
>, | |
proto::when< | |
proto::terminal<state_tag>, | |
proto::_ | |
>, | |
proto::when< | |
proto::terminal<flag_tag>, | |
proto::_ | |
>, | |
proto::when< | |
proto::terminal<event_tag>, | |
proto::_ | |
>, | |
proto::when< | |
proto::terminal<fsm_artefact_tag>, | |
get_fct<proto::_ >() | |
>, | |
proto::when< | |
proto::terminal<proto::_>, | |
proto::_child | |
> | |
> | |
{}; | |
struct BuildGuards | |
: proto::switch_<BuildGuardsCases> | |
{}; | |
}}}} | |
#endif //BOOST_MSM_FRONT_EUML_GUARD_GRAMMAR_H |