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.
356 lines
13 KiB
356 lines
13 KiB
// 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>, |
|
get_state_name<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::_value |
|
> |
|
> |
|
{}; |
|
|
|
struct BuildGuards |
|
: proto::switch_<BuildGuardsCases> |
|
{}; |
|
|
|
}}}} |
|
|
|
#endif //BOOST_MSM_FRONT_EUML_GUARD_GRAMMAR_H
|
|
|