| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 | // 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
 |