357 lines
13 KiB
C++
357 lines
13 KiB
C++
|
// 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
|