blob: c430f8f77145b68623cc9da727ba944e833bd044 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<?oxygen RNGSchema="http://www.oasis-open.org/docbook/xml/5.0/rng/docbook.rng" type="xml"?>
<book xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0">
<info>
<title>Meta State Machine (MSM) V2.12</title>
<author>
<personname>Christophe Henry</personname>
<email>christophe.j.henry@googlemail.com</email>
</author>
<copyright>
<year>2008-2010</year>
<holder>
<phrase> Distributed under the Boost Software License, Version 1.0. (See
accompanying file LICENSE_1_0.txt or copy at <link
xlink:href="http://www.boost.org/LICENSE_1_0.txt"
>http://www.boost.org/LICENSE_1_0.txt</link> ) </phrase>
</holder>
</copyright>
</info>
<preface>
<title>Preface</title>
<para>MSM is a library allowing you to easily and quickly define state machines of very high
performance. From this point, two main questions usually quickly arise, so please allow
me to try answering them upfront.</para>
<para>
<itemizedlist>
<listitem>
<para>When do I need a state machine?</para>
<para>More often that you think. Very often, one defined a state machine
informally without even noticing it. For example, one declares inside a
class some boolean attribute, say to remember that a task has been
completed. Later the boolean actually needs a third value, so it becomes an
int. A few weeks, a second attribute is needed. Then a third. Soon, you find
yourself writing:</para>
<para><code>void incoming_data(data)</code></para>
<para><code>{</code></para>
<para><code> if (data == packet_3 &amp;&amp; flag1 == work_done &amp;&amp; flag2
> step3)...</code></para>
<para><code>}</code></para>
<para>This starts to look like event processing (contained inside data) if some
stage of the object life has been achieved (but is ugly).</para>
<para>This could be a protocol definition and it is a common use case for state
machines. Another common one is a user interface. The stage of the user's
interaction defines if some button is active, a functionality is available,
etc.</para>
<para>But there are many more use cases if you start looking. Actually, a whole
model-driven development method, Executable UML
(http://en.wikipedia.org/wiki/Executable_UML) specifies its complete dynamic
behavior using state machines. Class diagram, state machine diagrams, and an
action language are all you absolutely need in the Executable UML
world.</para>
</listitem>
<listitem>
<para>Another state machine library? What for?</para>
<para>True, there are many state machine libraries. This should already be an
indication that if you're not using any of them, you might be missing
something. Why should you use this one? Unfortunately, when looking for a
good state machine library, you usually pretty fast hit one or several of
the following snags:<itemizedlist>
<listitem>
<para>speed: "state machines are slow" is usually the first
criticism you might hear. While it is often an excuse not to use
any and instead resort to dirty, hand-written implementations (I
mean, no, yours are not dirty of course, I'm talking about other
developers). MSM removes this often feeble excuse because it is
blazingly fast. Most hand-written implementations will be beaten
by MSM.</para>
</listitem>
<listitem>
<para>ease of use: good argument. If you used another library, you
are probably right. Many state machine definitions will look
similar to:</para>
<para><code>state s1 = new State; // a state</code></para>
<para><code>state s2 = new State; // another state</code></para>
<para><code>event e = new Event; // event</code></para>
<para><code>s1->addTransition(e,s2); // transition s1 ->
s2</code></para>
<para>The more transitions you have, the less readable it is. A long
time ago, there was not so much Java yet, and many electronic
systems were built with a state machine defined by a simple
transition table. You could easily see the whole structure and
immediately see if you forgot some transitions. Thanks to our
new OO techniques, this ease of use was gone. MSM gives you back
the transition table and reduces the noise to the
minimum.</para>
</listitem>
<listitem>
<para>expressiveness: MSM offers several front-ends and constantly
tries to improve state machine definition techniques. For
example, you can define a transition with eUML (one of MSM's
front-ends) as:</para>
<para><code>state1 == state2 + event [condition] /
action</code></para>
<para>This is not simply syntactic sugar. Such a formalized,
readable structure allows easy communication with domain experts
of a software to be constructed. Having domain experts
understand your code will greatly reduce the number of
bugs.</para>
</listitem>
<listitem>
<para>model-driven-development: a common difficulty of a
model-driven development is the complexity of making a
round-trip (generating code from model and then model from
code). This is due to the fact that if a state machine structure
is hard for you to read, chances are that your parsing tool will
also have a hard time. MSM's syntax will hopefully help tool
writers.</para>
</listitem>
<listitem>
<para>features: most developers use only 20% of the richly defined
UML standard. Unfortunately, these are never the same 20% for
all. And so, very likely, one will need something from the
standard which is not implemented. MSM offers a very large part
of the standard, with more on the way.</para>
</listitem>
</itemizedlist></para>
<para>Let us not wait any longer, I hope you will enjoy MSM and have fun with
it!</para>
</listitem>
</itemizedlist>
</para>
</preface>
<part>
<title>User' guide</title>
<chapter>
<title>Founding idea</title>
<para>Let's start with an example taken from the C++ Template Metaprogramming
book:</para>
<para>
<code>class player : public state_machine&lt;player></code></para>
<para><code>{ </code></para>
<para><code>// The list of FSM states enum states { Empty, Open, Stopped, Playing,
Paused , initial_state = Empty }; </code></para>
<para><code>// transition actions void start_playback(play const&amp;) { std::cout
&lt;&lt; "player::start_playback\n"; } </code></para>
<para><code>void open_drawer(open_close const&amp;) { std::cout &lt;&lt;
"player::open_drawer\n"; } </code></para>
<para><code>void close_drawer(open_close const&amp;) { std::cout &lt;&lt;
"player::close_drawer\n"; } </code></para>
<para><code>void store_cd_info(cd_detected const&amp;) { std::cout &lt;&lt;
"player::store_cd_info\n"; } </code></para>
<para><code>void stop_playback(stop const&amp;) { std::cout &lt;&lt;
"player::stop_playback\n"; } </code></para>
<para><code>void pause_playback(pause const&amp;) { std::cout &lt;&lt;
"player::pause_playback\n"; } </code></para>
<para><code>void resume_playback(play const&amp;) { std::cout &lt;&lt;
"player::resume_playback\n"; } </code></para>
<para><code>void stop_and_open(open_close const&amp;) { std::cout &lt;&lt;
"player::stop_and_open\n"; } </code></para>
<para><code>friend class state_machine&lt;player>; </code></para>
<para><code>typedef player p; // makes transition table cleaner </code></para>
<para><code>// Transition table </code></para>
<para><code>struct transition_table : mpl::vector11&lt; </code></para>
<para><code>row &lt; Stopped , play , Playing , &amp;p::start_playback >, </code></para>
<para><code>row &lt; Stopped , open_close , Open , &amp;p::open_drawer >, </code></para>
<para><code>row &lt; Open , open_close , Empty , &amp;p::close_drawer >, </code></para>
<para><code>row &lt; Empty , open_close , Open , &amp;p::open_drawer >, </code></para>
<para><code>row &lt; Empty , cd_detected , Stopped , &amp;p::store_cd_info >,
</code></para>
<para><code>row &lt; Playing , stop , Stopped , &amp;p::stop_playback >, </code></para>
<para><code>row &lt; Playing , pause , Paused , &amp;p::pause_playback >, </code></para>
<para><code>row &lt; Playing , open_close , Open , &amp;p::stop_and_open >,
</code></para>
<para><code>row &lt; Paused , play , Playing , &amp;p::resume_playback >, </code></para>
<para><code>row &lt; Paused , stop , Stopped , &amp;p::stop_playback >, </code></para>
<para><code>row &lt; Paused , open_close , Open , &amp;p::stop_and_open > </code></para>
<para><code>> {}; </code></para>
<para><code>// Replaces the default no-transition response. </code></para>
<para><code>template &lt;class Event> int no_transition(int state, Event const&amp; e) {
std::cout &lt;&lt; "no transition from state " &lt;&lt; state &lt;&lt; " on
event " &lt;&lt; typeid(e).name() &lt;&lt; std::endl; return state; } };</code>
</para>
<para><code>void test() { player p; p.process_event(open_close());...}</code></para>
<para>This example is the foundation for the idea driving MSM: a descriptive and
expressive language based on a transition table with as little syntactic noise as
possible, all this while offering as many features from the UML 2.0 standard as
possible. MSM also offers several expressive state machine definition syntaxes with
different trade-offs.</para>
</chapter>
<chapter>
<title>UML Short Guide</title>
<sect1>
<title>What are state machines?</title>
<para>State machines are the description of a thing's lifeline. They describe the
different stages of the lifeline, the events influencing it, and what it does
when a particular event is detected at a particular stage. They offer the
complete specification of the dynamic behavior of the thing.</para>
</sect1>
<sect1>
<title>Concepts</title>
<para>Thinking in terms of state machines is a bit surprising at first, so let us
have a quick glance at the concepts.</para>
<sect2>
<title>State machine, state, transition, event </title>
<para>A state machine is a concrete model describing the behavior of a system.
It is composed of a finite number of states and transitions.</para>
<para>
<inlinemediaobject>
<imageobject>
<imagedata fileref="images/sm.gif"/>
</imageobject>
</inlinemediaobject></para>
<para>A simple state has no sub states. It can have data, entry and exit
behaviors and deferred events. One can provide entry and exit behaviors
(also called actions) to states (or state machines), which are executed
whenever a state is entered or left, no matter how. A state can also have
internal transitions which cause no entry or exit behavior to be called. A
state can mark events as deferred. This means the event cannot be processed
if this state is active, but it must be retained. Next time a state not
deferring this event is active, the event will be processed, as if it had
just been fired. </para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/state.gif"/>
</imageobject>
</inlinemediaobject></para>
<para>A transition is the switching between active states, triggered by an
event. Actions and guard conditions can be attached to the transition. The
action executes when the transition fires, the guard is a Boolean operation
executed first and which can prevent the transition from firing by returning
false.</para>
<para>
<inlinemediaobject>
<imageobject>
<imagedata fileref="images/transition.jpg"/>
</imageobject>
</inlinemediaobject></para>
<para>An initial state marks the first active state of a state machine. It has
no real existence and neither has the transition originating from it.</para>
<para>
<inlinemediaobject>
<imageobject>
<imagedata fileref="images/init_state.gif"/>
</imageobject>
</inlinemediaobject></para>
</sect2>
<sect2>
<title>Submachines, orthogonal regions, pseudostates </title>
<para>A composite state is a state containing a region or decomposed in two or
more regions. A composite state contains its own set of states and regions. </para>
<para>A submachine is a state machine inserted as a state in another state
machine. The same submachine can be inserted more than once. </para>
<para>Orthogonal regions are parts of a composite state or submachine, each
having its own set of mutually exclusive set of states and transitions. </para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/regions.gif" width="60%" scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>UML also defines a number of pseudo states, which are considered important
concepts to model, but not enough to make them first-class citizens. The
terminate pseudo state terminates the execution of a state machine (MSM
handles this slightly differently. The state machine is not destroyed but no
further event processing occurs.). </para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/terminate.gif"/>
</imageobject>
</inlinemediaobject></para>
<para>An exit point pseudo state exits a composite state or a submachine and
forces termination of execution in all contained regions.</para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/exit.gif" width="60%" scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>An entry point pseudo state allows a kind of controlled entry inside a
composite. Precisely, it connects a transition outside the composite to a
transition inside the composite. An important point is that this mechanism
only allows a single region to be entered. In the above diagram, in region1,
the initial state would become active. </para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/entry_point.gif"/>
</imageobject>
</inlinemediaobject></para>
<para>There are also two more ways to enter a submachine (apart the obvious and
more common case of a transition terminating on the submachine as shown in
the region case). An explicit entry means that an inside state is the target
of a transition. Unlike with direct entry, no tentative encapsulation is
made, and only one transition is executed. An explicit exit is a transition
from an inner state to a state outside the submachine (not supported by
MSM). I would not recommend using explicit entry or exit. </para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/explicit.gif"/>
</imageobject>
</inlinemediaobject></para>
<para>The last entry possibility is using fork. A fork is an explicit entry into
one or more regions. Other regions are again activated using their initial
state. </para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/fork.gif" width="70%" scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
</sect2>
<sect2>
<title>
<command xml:id="uml-history"/>History </title>
<para>UML defines two kinds of history, shallow history and deep history.
Shallow history is a pseudo state representing the most recent substate of a
submachine. A submachine can have at most one shallow history. A transition
with a history pseudo state as target is equivalent to a transition with the
most recent substate as target. And very importantly, only one transition
may originate from the history. Deep history is a shallow history
recursively reactivating the substates of the most recent substate. It is
represented like the shallow history with a star (H* inside a
circle).</para>
<para>
<inlinemediaobject>
<imageobject>
<imagedata fileref="images/history.gif" width="60%" scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>History is not a completely satisfying concept. First of all, there can be
just one history pseudo state and only one transition may originate from it.
So they do not mix well with orthogonal regions as only one region can be
“remembered”. Deep history is even worse and looks like a last-minute
addition. History has to be activated by a transition and only one
transition originates from it, so how to model the transition originating
from the deep history pseudo state and pointing to the most recent substate
of the substate? As a bonus, it is also inflexible and does not accept new
types of histories. Let's face it, history sounds great and is useful in
theory, but the UML version is not quite making the cut. And therefore, MSM
provides a different version of this useful concept. </para>
</sect2>
<sect2>
<title><command xml:id="uml-anonymous"/>Completion transitions / anonymous
transitions</title>
<para>Completion events (or transitions), also called anonymous transitions, are
defined as transitions having no defined event triggering them. This means
that such transitions will immediately fire when a state being the source of
an anonymous transition becomes active, provided that a guard allows it.
They are useful in modeling algorithms as an activity diagram would normally
do. In the real-time world, they have the advantage of making it easier to
estimate how long a periodically executed action will last. For example,
consider the following diagram. </para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/completion.gif"/>
</imageobject>
</inlinemediaobject></para>
<para>The designer now knows at any time that he will need a maximum of 4
transitions. Being able to estimate how long a transition takes, he can
estimate how much of a time frame he will need to require (real-time tasks
are often executed at regular intervals). If he can also estimate the
duration of actions, he can even use graph algorithms to better estimate his
timing requirements. </para>
</sect2>
<sect2>
<title><command xml:id="UML-internal-transition"/> Internal transitions </title>
<para>Internal transitions are transitions executing in the scope of the active
state, being a simple state or a submachine. One can see them as a
self-transition of this state, without an entry or exit action
called.</para>
</sect2>
<sect2>
<title>
<command xml:id="transition-conflict"/>Conflicting transitions </title>
<para>If, for a given event, several transitions are enabled, they are said to
be in conflict. There are two kinds of conflicts: <itemizedlist>
<listitem>
<para>For a given source state, several transitions are defined,
triggered by the same event. Normally, the guard condition in
each transition defines which one is fired.</para>
</listitem>
<listitem>
<para>The source state is a submachine or simple state and the
conflict is between a transition internal to this state and a
transition triggered by the same event and having as target
another state.</para>
</listitem>
</itemizedlist>The first one is simple; one only needs to define two or more
rows in the transition table, with the same source and trigger, with a
different guard condition. Beware, however, that the UML standard wants
these conditions to be not overlapping. If they do, the standard says
nothing except that this is incorrect, so the implementer is free to
implement it the way he sees fit. In the case of MSM, the transition
appearing last in the transition table gets selected first, if it returns
false (meaning disabled), the library tries with the previous one, and so
on.</para>
<para>
<inlinemediaobject>
<imageobject>
<imagedata fileref="images/conflict1.gif"/>
</imageobject>
</inlinemediaobject></para>
<para>In the second case, UML defines that the most inner transition gets
selected first, which makes sense, otherwise no exit point pseudo state
would be possible (the inner transition brings us to the exit point, from
where the containing state machine can take over). </para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/conflict2.gif" width="60%" scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>MSM handles both cases itself, so the designer needs only concentrate on
its state machine and the UML subtleties (not overlapping conditions), not
on implementing this behavior himself. </para>
</sect2>
</sect1>
<sect1>
<title>State machine glossary</title>
<para>
<itemizedlist>
<listitem>
<para>state machine: the life cycle of a thing. It is made of states,
regions, transitions and processes incoming events.</para>
</listitem>
<listitem>
<para>state: a stage in the life cycle of a state machine. A state (like
a submachine) can have an entry and exit behaviors.</para>
</listitem>
<listitem>
<para>event: an incident provoking (or not) a reaction of the state
machine</para>
</listitem>
<listitem>
<para>transition: a specification of how a state machine reacts to an
event. It specifies a source state, the event triggering the
transition, the target state (which will become the newly active
state if the transition is triggered), guard and actions.</para>
</listitem>
<listitem>
<para>action: an operation executed during the triggering of the
transition.</para>
</listitem>
<listitem>
<para>guard: a boolean operation being able to prevent the triggering of
a transition which would otherwise fire.</para>
</listitem>
<listitem>
<para>transition table: representation of a state machine. A state
machine diagram is a graphical, but incomplete representation of the
same model. A transition table, on the other hand, is a complete
representation.</para>
</listitem>
<listitem>
<para>initial state: The state in which the state machine starts. Having
several orthogonal regions means having as many initial
states.</para>
</listitem>
<listitem>
<para>submachine: A submachine is a state machine inserted as a state in
another state machine and can be found several times in a same state
machine.</para>
</listitem>
<listitem>
<para>orthogonal regions: (logical) parallel flow of execution of a
state machine. Every region of a state machine gets a chance to
process an incoming event.</para>
</listitem>
<listitem>
<para>terminate pseudo-state: when this state becomes active, it
terminates the execution of the whole state machine. MSM does not
destroy the state machine as required by the UML standard, however,
which lets you keep all the state machine's data.</para>
</listitem>
<listitem>
<para>entry/exit pseudo state: defined for submachines and are defined
as a connection between a transition outside of the submachine and a
transition inside the submachine. It is a way to enter or leave a
submachine through a predefined point.</para>
</listitem>
<listitem>
<para>fork: a fork allows explicit entry into several orthogonal regions
of a submachine.</para>
</listitem>
<listitem>
<para>history: a history is a way to remember the active state of a
submachine so that the submachine can proceed in its last active
state next time it becomes active.</para>
</listitem>
<listitem>
<para>completion events (also called completion/anonymous transitions):
when a transition has no named event triggering it, it automatically
fires when the source state is active, unless a guard forbids
it.</para>
</listitem>
<listitem>
<para>transition conflict: a conflict is present if for a given source
state and incoming event, several transitions are possible. UML
specifies that guard conditions have to solve the conflict.</para>
</listitem>
<listitem>
<para>internal transitions: transition from a state to itself without
having exit and entry actions being called.</para>
</listitem>
</itemizedlist>
</para>
</sect1>
</chapter>
<chapter>
<title>Tutorial</title>
<sect1>
<title>Design</title>
<para>MSM is divided between front–ends and back-ends. At the moment, there is just
one back-end. On the front-end side, you will find three of them which are as
many state machine description languages, with many more possible. For potential
language writers, this document contains a <link
xlink:href="#internals-front-back-interface">description of the interface
between front-end and back-end</link>.</para>
<para>The first front-end is an adaptation of the example provided in the <link
xlink:href="http://boostpro.com/mplbook">MPL book</link> with actions
defined as pointers to state or state machine methods. The second one is based
on functors. The third, eUML (embedded UML) is an experimental language based on
Boost.Proto and Boost.Typeof and hiding most of the metaprogramming to increase
readability. Both eUML and the functor front-end also offer a functional library
(a bit like Boost.Phoenix) for use as action language (UML defining
none).</para>
</sect1>
<sect1>
<title><command xml:id="basic-front-end"/>Basic front-end</title>
<para>This is the historical front-end, inherited from the MPL book. It provides a
transition table made of rows of different names and functionality. Actions and
guards are defined as methods and referenced through a pointer in the
transition. This front-end provides a simple interface making easy state
machines easy to define, but more complex state machines a bit harder.</para>
<sect2>
<title>A simple example</title>
<para>Let us have a look at a state machine diagram of the founding
example:</para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/SimpleTutorial.jpg" width="60%"
scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>We are now going to build it with MSM's basic front-end. An <link
xlink:href="examples/SimpleTutorial.cpp">implementation</link> is also
provided.</para>
</sect2>
<sect2>
<title>Transition table</title>
<para>As previously stated, MSM is based on the transition table, so let us
define one:</para>
<programlisting>
struct transition_table : mpl::vector&lt;
// Start Event Target Action Guard
// +---------+------------+-----------+---------------------------+----------------------------+
a_row&lt; Stopped , play , Playing , &amp;player_::start_playback >,
a_row&lt; Stopped , open_close , Open , &amp;player_::open_drawer >,
_row&lt; Stopped , stop , Stopped >,
// +---------+------------+-----------+---------------------------+----------------------------+
a_row&lt; Open , open_close , Empty , &amp;player_::close_drawer >,
// +---------+------------+-----------+---------------------------+----------------------------+
a_row&lt; Empty , open_close , Open , &amp;player_::open_drawer >,
row&lt; Empty , cd_detected, Stopped , &amp;player_::store_cd_info , &amp;player_::good_disk_format >,
row&lt; Empty , cd_detected, Playing , &amp;player_::store_cd_info , &amp;player_::auto_start >,
// +---------+------------+-----------+---------------------------+----------------------------+
a_row&lt; Playing , stop , Stopped , &amp;player_::stop_playback >,
a_row&lt; Playing , pause , Paused , &amp;player_::pause_playback >,
a_row&lt; Playing , open_close , Open , &amp;player_::stop_and_open >,
// +---------+------------+-----------+---------------------------+----------------------------+
a_row&lt; Paused , end_pause , Playing , &amp;player_::resume_playback >,
a_row&lt; Paused , stop , Stopped , &amp;player_::stop_playback >,
a_row&lt; Paused , open_close , Open , &amp;player_::stop_and_open >
// +---------+------------+-----------+---------------------------+----------------------------+
> {};
</programlisting>
<para>You will notice that this is almost exactly our founding example. The only
change in the transition table is the different types of transitions (rows).
The founding example forces one to define an action method and offers no
guards. You have 4 basic row types:<itemizedlist>
<listitem>
<para><code>row</code> takes 5 arguments: start state, event, target
state, action and guard.</para>
</listitem>
<listitem>
<para><code>a_row</code> (“a” for action) allows defining only the
action and omit the guard condition.</para>
</listitem>
<listitem>
<para><code>g_row</code> (“g” for guard) allows omitting the action
behavior and defining only the guard.</para>
</listitem>
<listitem>
<para><code>_row</code> allows omitting action and guard.</para>
</listitem>
</itemizedlist></para>
<para>The signature for an action methods is void method_name (event
const&amp;), for example:</para>
<programlisting>void stop_playback(stop const&amp;)</programlisting>
<para>Action methods return nothing and take the argument as const reference. Of
course nothing forbids you from using the same action for several
events:</para>
<programlisting>template &lt;class Event> void stop_playback(Eventconst&amp;)</programlisting>
<para>Guards have as only difference the return value, which is a
boolean:</para>
<programlisting>bool good_disk_format(cd_detected const&amp; evt)</programlisting>
<para>The transition table is actually a MPL vector (or list), which brings the
limitation that the default maximum size of the table is 20. If you need
more transitions, overriding this default behavior is necessary, so you need
to add before any header:</para>
<programlisting>#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
#define BOOST_MPL_LIMIT_VECTOR_SIZE 30 //or whatever you need
#define BOOST_MPL_LIMIT_MAP_SIZE 30 //or whatever you need </programlisting>
<para>The other limitation is that the MPL types are defined only up to 50
entries. For the moment, the only solution to achieve more is to add headers
to the MPL (luckily, this is not very complicated).</para>
</sect2>
<sect2>
<title>Defining states with entry/exit actions</title>
<para>While states were enums in the MPL book, they now are classes, which
allows them to hold data, provide entry, exit behaviors and be reusable (as
they do not know anything about the containing state machine). To define a
state, inherit from the desired state type. You will mainly use simple
states:</para>
<para>struct Empty : public msm::front::state&lt;> {};</para>
<para>They can optionally provide entry and exit behaviors:</para>
<programlisting language="C++">
struct Empty : public msm::front::state&lt;>
{
template &lt;class Event, class Fsm>
void on_entry(Event const&amp;, Fsm&amp; )
{std::cout &lt;&lt;"entering: Empty" &lt;&lt; std::endl;}
template &lt;class Event, class Fsm>
void on_exit(Event const&amp;, Fsm&amp; )
{std::cout &lt;&lt;"leaving: Empty" &lt;&lt; std::endl;}
};
</programlisting>
<para>Notice how the entry and exit behaviors are templatized on the event and
state machine. Being generic facilitates reuse. There are more state types
(terminate, interrupt, pseudo states, etc.) corresponding to the UML
standard state types. These will be described in details in the next
sections.</para>
</sect2>
<sect2>
<title>Defining a simple state machine</title>
<para>Declaring a state machine is straightforward and is done with a high
signal / noise ratio. In our player example, we declare the state machine
as:</para>
<programlisting>struct player_ : public msm::front::state_machine_def&lt;player_>{
/* see below */}</programlisting>
<para>This declares a state machine using the basic front-end. We now declare
inside the state machine structure the initial state:</para>
<para>
<programlisting>typedef Empty initial_state;</programlisting>
</para>
<para>And that is about all of what is absolutely needed. In the example, the
states are declared inside the state machine for readability but this is not
a requirements, states can be declared wherever you like.</para>
<para>All what is left to do is to pick a back-end (which is quite simple as
there is only one at the moment):</para>
<para>
<programlisting>typedef msm::back::state_machine&lt;player_> player;</programlisting>
</para>
<para>You now have a ready-to-use state machine with entry/exit actions, guards,
transition actions, a message queue so that processing an event can generate
another event. The state machine also adapted itself to your need and
removed almost all features we didn't use in this simple example. Note that
this is not per default the fastest possible state machine. See the section
"getting more speed" to know how to get the maximum speed. In a nutshell,
MSM cannot know about your usage of some features so you will have to
explicitly tell it.</para>
<para>State objects are built automatically with the state machine. They will
exist until state machine destruction. MSM is using Boost.Fusion behind the
hood. This unfortunately means that if you define more than 10 states, you
will need to extend the default:</para>
<para>
<programlisting>#define FUSION_MAX_VECTOR_SIZE 20 // or whatever you need
</programlisting>
</para>
<para>When an unexpected event is fired, the <code>no_transition(event, state
machine, state id)</code> method of the state machine is called . By
default, this method simply asserts when called. It is possible to overwrite
the <code>no_transition</code> method to define a different handling:</para>
<para>
<programlisting>template &lt;class Fsm,class Event>
void no_transition(Event const&amp; e, Fsm&amp; ,int state){...}</programlisting>
</para>
<para><emphasis role="underline">Note</emphasis>: you might have noticed that
the tutorial calls <code>start()</code> on the state machine just after
creation. The start method will initiate the state machine, meaning it will
activate the initial state, which means in turn that the initial state's
entry behavior will be called. The reason why we need this will be explained
in the <link xlink:href="#backend-start">back-end part</link>. After a call
to start, the state machine is ready to process events.</para>
</sect2>
<sect2>
<title>Defining a submachine</title>
<para>We now want to extend our last state machine by making the Playing state a
state machine itself (a submachine).</para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/CompositeTutorial.jpg" width="60%"
scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>Again, an <link xlink:href="examples/CompositeTutorial.cpp">example</link>
is also provided.</para>
<para>A submachine really is a state machine itself, so we declare Playing as
such, choosing a front-end and a back-end:</para>
<para>
<programlisting>struct Playing_ : public msm::front::state_machine_def&lt;Playing_>{...}
typedef msm::back::state_machine&lt;Playing_> Playing;</programlisting>
</para>
<para>Like for any state machine, one also needs a transition table and an
initial state:</para>
<para>
<programlisting>
struct transition_table : mpl::vector&lt;
// Start Event Target Action Guard
// +--------+---------+--------+---------------------------+------+
a_row&lt; Song1 , NextSong, Song2 , &amp;Playing_::start_next_song >,
a_row&lt; Song2 , NextSong, Song1 , &amp;Playing_::start_prev_song >,
a_row&lt; Song2 , NextSong, Song3 , &amp;Playing_::start_next_song >,
a_row&lt; Song3 , NextSong, Song2 , &amp;Playing_::start_prev_song >
// +--------+---------+--------+---------------------------+------+
> {};
</programlisting>
</para>
<para>
<programlisting>typedef Song1 initial_state; </programlisting>
</para>
<para>This is about all you need to do. MSM will now automatically recognize
Playing as a submachine and all events handled by Playing (NextSong and
PreviousSong) will now be automatically forwarded to Playing whenever this
state is active. All other state machine features described later are also
available. You can even decide to use a state machine sometimes as
submachine or sometimes as an independent state machine.</para>
</sect2>
<sect2>
<title>Orthogonal regions, terminate state, event deferring</title>
<para>It is a very common problem in many state machines to have to handle
errors. It usually involves defining a transition from all the states to a
special error state. Translation: not fun. It is also not practical to find
from which state the error originated. The following diagram shows an
example of what clearly becomes not very readable:</para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/error_no_regions.jpg" width="60%"
scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>This is neither very readable nor beautiful. And we do not even have any
action on the transitions yet to make it even less readable.</para>
<para>Luckily, UML provides a helpful concept, orthogonal regions. See them as
lightweight state machines running at the same time inside a common state
machine and having the capability to influence one another. The effect is
that you have several active states at any time. We can therefore keep our
state machine from the previous example and just define a new region made of
two states, AllOk and ErrorMode. AllOk is most of the time active. But the
error_found error event makes the second region move to the new active state
ErrorMode. This event does not interest the main region so it will simply be
ignored. "<code>no_transition</code>" will be called only if no region at
all handles the event. Also, as UML mandates, every region gets a chance of
handling the event, in the order as declared by the
<code>initial_state</code> type.</para>
<para>Adding an orthogonal region is easy, one only needs to declare more states
in the <code>initial_state</code> typedef. So, adding a new region with
AllOk as the region's initial state is:</para>
<para>
<programlisting>typedef mpl::vector&lt;Empty,AllOk> initial_state;</programlisting>
</para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/Orthogonal-deferred.jpg" width="60%"
scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>Furthermore, when you detect an error, you usually do not want events to
be further processed. To achieve this, we use another UML feature, terminate
states. When any region moves to a terminate state, the state machine
“terminates” (the state machine and all its states stay alive) and all
events are ignored. This is of course not mandatory, one can use orthogonal
regions without terminate states. MSM also provides a small extension to
UML, interrupt states. If you declare ErrorMode as interrupt state instead
of terminate state, the state machine will not handle any event other than
the one which ends the interrupt. So it's like a terminate state, with the
difference that you are allowed to resume the state machine when a condition
(like handling of the original error) is met. </para>
<para><command xml:id="basic-defer"/>Last but not least, this example also shows
here the handling of event deferring. Let's say someone puts a disc and
immediately presses play. The event cannot be handled, yet you'd want it to
be handled at a later point and not force the user to press play again. The
solution is to define it as deferred in the Empty and Open states and get it
handled in the first state where the event is not to be deferred. It can
then be handled or rejected. In this example, when Stopped becomes active,
the event will be handled because only Empty and Open defer the
event.</para>
<para>UML defines event deferring as a state property. To accommodate this, MSM
lets you specify this in states by providing a <code>deferred_events</code>
type:</para>
<programlisting>struct Empty : public msm::front::state&lt;>
{
// if the play event is fired while in this state, defer it until a state
// handles or rejects it
typedef mpl::vector&lt;play> deferred_events;
...
}; </programlisting>
<para>Please have a look at the <link
xlink:href="examples/Orthogonal-deferred.cpp">complete
example</link>.</para>
<para>While this is wanted by UML and is simple, it is not always practical
because one could wish to defer only in certain conditions. One could also
want to make this be part of a transition action with the added bonus of a
guard for more sophisticated behaviors. It would also be conform to the MSM
philosophy to get as much as possible in the transition table, where you
have the whole state machine structure. This is also possible but not
practical with this front-end so we will need to pick a different row from
the functor front-end. For a complete description of the <code>Row</code>
type, please have a look at the <command xlink:href="#functor-front-end"
>functor front-end.</command></para>
<para>First, as there is no state where MSM can automatically find out the usage
of this feature, we need to require deferred events capability explicitly,
by adding a type in the state machine definition:</para>
<programlisting>struct player_ : public msm::front::state_machine_def&lt;player_>
{
typedef int activate_deferred_events;
...
}; </programlisting>
<para>We can now defer an event in any transition of the transition table by
using as action the predefined <code>msm::front::Defer</code> functor, for
example:</para>
<para>
<programlisting>Row &lt; Empty , play , none , Defer , none ></programlisting>
</para>
<para>This is an internal transition row(see <command
xlink:href="#internal-transitions">internal transitions</command>) but
you can ignore this for the moment. It just means that we are not leaving
the Empty state. What matters is that we use Defer as action. This is
roughly equivalent to the previous syntax but has the advantage of giving
you all the information in the transition table with the added power of
transition behavior.</para>
<para>The second difference is that as we now have a transition defined, this
transition can play in the resolution of <command
xlink:href="#transition-conflict">transition conflicts</command>. For
example, we could model an "if (condition2) move to Playing else if
(condition1) defer play event":</para>
<para>
<programlisting>Row &lt; Empty , play , none , Defer , condition1 >,
g_row &lt; Empty , play , Playing , &amp;player_::condition2 ></programlisting>
</para>
<para>Please have a look at <link xlink:href="examples/Orthogonal-deferred2.cpp"
>this possible implementation</link>.</para>
</sect2>
<sect2>
<title>History</title>
<para>UML defines two types of history, Shallow History and Deep History. In the
previous examples, if the player was playing the second song and the user
pressed pause, leaving Playing, at the next press on the play button, the
Playing state would become active and the first song would play again. Soon
would the first client complaints follow. They'd of course demand, that if
the player was paused, then it should remember which song was playing. But
it the player was stopped, then it should restart from the first song. How
can it be done? Of course, you could add a bit of programming logic and
generate extra events to make the second song start if coming from Pause.
Something like: </para>
<para>
<programlisting>if (Event == end_pause)
{
for (int i=0;i&lt; song number;++i) {player.process_event(NextSong()); }
} </programlisting>
</para>
<para>Not much to like in this example, isn't it? To solve this problem, you
define what is called a shallow or a deep history. A shallow history
reactivates the last active substate of a submachine when this submachine
becomes active again. The deep history does the same recursively, so if this
last active substate of the submachine was itself a submachine, its last
active substate would become active and this will continue recursively until
an active state is a normal state. For example, let us have a look at the
following UML diagram: </para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/HistoryTutorial.jpg" width="60%"
scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>Notice that the main difference compared to previous diagrams is that the
initial state is gone and replaced by a History symbol (the H inside a
circle).</para>
<para>As explained in the <command xlink:href="#uml-history">small UML
tutorial</command>, History is a good concept with a not completely
satisfying specification. MSM kept the concept but not the specification and
goes another way by making this a policy and you can add your own history
types (the <link xlink:href="#history-interface">reference</link> explains
what needs to be done). Furthermore, History is a backend policy. This
allows you to reuse the same state machine definition with different history
policies in different contexts.</para>
<para>Concretely, your frontend stays unchanged:</para>
<para>
<programlisting>struct Playing_ : public msm::front::state_machine_def&lt;Playing_></programlisting>
</para>
<para>You then add the policy to the backend as second parameter:</para>
<para>
<programlisting>typedef msm::back::state_machine&lt;Playing_,
msm::back::ShallowHistory&lt;mpl::vector&lt;end_pause> > > Playing;</programlisting>
</para>
<para>This states that a shallow history must be activated if the Playing state
machine gets activated by the end_pause event and only this one (or any
other event added to the mpl::vector). If the state machine was in the
Stopped state and the event play was generated, the history would not be
activated and the normal initial state would become active. By default,
history is disabled. For your convenience the library provides in addition
to ShallowHistory a non-UML standard AlwaysHistory policy (likely to be your
main choice) which always activates history, whatever event triggers the
submachine activation. Deep history is not available as a policy (but could
be added). The reason is that it would conflict with policies which
submachines could define. Of course, if for example, Song1 were a state
machine itself, it could use the ShallowHistory policy itself thus creating
Deep History for itself. An <link xlink:href="examples/History.cpp"
>example</link> is also provided.</para>
</sect2>
<sect2>
<title>Completion (anonymous) transitions</title>
<para><command xml:id="anonymous-transitions"/>The following diagram shows an
example making use of this feature:</para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/Anonymous.jpg" width="60%" scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>Anonymous transitions are transitions without a named event. This means
that the transition automatically fires when the predecessor state is
entered (to be exact, after the entry action). Otherwise it is a normal
transition with actions and guards. Why would you need something like that?
A possible case would be if a part of your state machine implements some
algorithm, where states are steps of the algorithm implementation. Then,
using several anonymous transitions with different guard conditions, you are
actually implementing some if/else statement. Another possible use would be
a real-time system called at regular intervals and always doing the same
thing, meaning implementing the same algorithm. The advantage is that once
you know how long a transition takes to execute on the system, by
calculating the longest path (the number of transitions from start to end),
you can pretty much know how long your algorithm will take in the worst
case, which in turns tells you how much of a time frame you are to request
from a scheduler. </para>
<para>If you are using Executable UML (a good book describing it is "Executable
UML, a foundation for Model-Driven Architecture"), you will notice that it
is common for a state machine to generate an event to itself only to force
leaving a state. Anonymous transitions free you from this constraint.</para>
<para>If you do not use this feature in a concrete state machine, MSM will
deactivate it and you will not pay for it. If you use it, there is however a
small performance penalty as MSM will try to fire a compound event (the
other UML name for anonymous transitions) after every taken transition. This
will therefore double the event processing cost, which is not as bad as it
sounds as MSM’s execution speed is very high anyway.</para>
<para>To define such a transition, use “none” as event in the transition table,
for example:</para>
<para>
<programlisting>row &lt; State3 , none , State4 , &amp;p::State3ToState4 , &amp;p::always_true ></programlisting>
</para>
<para><link xlink:href="examples/AnonymousTutorial.cpp">An implementation</link>
of the state machine diagram is also provided.</para>
</sect2>
<sect2>
<title><command xml:id="internal-transitions"/>Internal transitions</title>
<para>Internal transitions are transitions executing in the scope of the active
state, a simple state or a submachine. One can see them as a self-transition
of this state, without an entry or exit action called. This is useful when
all you want is to execute some code for a given event in a given
state.</para>
<para>Internal transitions are specified as having a higher priority than normal
transitions. While it makes sense for a submachine with exit points, it is
surprising for a simple state. MSM lets you define the transition priority
by setting the transition’s position inside the transition table (see
<command xlink:href="#run-to-completion">internals</command> ). The
difference between "normal" and internal transitions is that internal
transitions have no target state, therefore we need new row types. We had
a_row, g_row, _row and row, we now add a_irow, g_irow, _irow and irow which
are like normal transitions but define no target state. For, example an
internal transition with a guard condition could be:</para>
<para>
<programlisting>g_irow &lt; Empty /*state*/,cd_detected/*event*/,&amp;p::internal_guard/* guard */></programlisting>
</para>
<para>These new row types can be placed anywhere in the transition table so that
you can still have your state machine structure grouped together. The only
difference of behavior with the UML standard is the missing notion of higher
priority for internal transitions. Please have a look at <link
xlink:href="examples/SimpleTutorialInternal.cpp">the
example</link>.</para>
<para>It is also possible to do it the UML-conform way by declaring a transition
table called <code>internal transition_table</code> inside the state itself
and using internal row types. For example:</para>
<programlisting>struct Empty : public msm::front::state&lt;>
{
struct internal_transition_table : mpl::vector&lt;
a_internal &lt; cd_detected , Empty, &amp;Empty::internal_action >
> {};
};</programlisting>
<para>This declares an internal transition table called
internal_transition_table and reacting on the event cd_detected by calling
internal_action on Empty. Let us note a few points:<itemizedlist>
<listitem>
<para>internal tables are NOT called transition_table but
internal_transition_table</para>
</listitem>
<listitem>
<para>they use different but similar row types: a_internal,
g_internal, _internal and internal.</para>
</listitem>
<listitem>
<para>These types take as first template argument the triggering
event and then the action and guard method. Note that the only
real difference to classical rows is the extra argument before
the function pointer. This is the type on which the function
will be called.</para>
</listitem>
<listitem>
<para>This also allows you, if you wish, to use actions and guards
from another state of the state machine or in the state machine
itself.</para>
</listitem>
<listitem>
<para>submachines can have an internal transition table and a
classical transition table.</para>
</listitem>
</itemizedlist></para>
<para>The <link xlink:href="examples/TestInternal.cpp">following example</link>
makes use of an a_internal. It also uses functor-based internal transitions
which will be explained in <command
xlink:href="#functor-internal-transitions">the functor
front-end</command>, please ignore them for the moment. Also note that
the state-defined internal transitions, having the highest priority (as
mandated by the UML standard), are tried before those defined inside the
state machine transition table.</para>
<para>Which method should you use? It depends on what you need:<itemizedlist>
<listitem>
<para>the first version (using irow) is simpler and likely to
compile faster. It also lets you choose the priority of your
internal transition.</para>
</listitem>
<listitem>
<para>the second version is more logical from a UML perspective and
lets you make states more useful and reusable. It also allows
you to call actions and guards on any state of the state
machine.</para>
</listitem>
</itemizedlist>
<command xml:id="internal-transitions-note"/><emphasis role="underline"
><emphasis role="bold">Note</emphasis></emphasis>: There is an added
possibility coming from this feature. The
<code>internal_transition_table</code> transitions being added directly
inside the main state machine's transition table, it is possible, if it is
more to your state, to distribute your state machine definition a bit like
Boost.Statechart, leaving to the state machine itself the only task of
declaring the states it wants to use using the
<code>explicit_creation</code> type definition. While this is not the
author's favorite way, it is still possible. A simplified example using only
two states will show this possibility:<itemizedlist>
<listitem>
<para><link
xlink:href="examples/distributed_table/DistributedTable.cpp"
>state machine definition</link></para>
</listitem>
<listitem>
<para>Empty <link xlink:href="examples/distributed_table/Empty.hpp"
>header</link> and <link
xlink:href="examples/distributed_table/Empty.cpp"
>cpp</link></para>
</listitem>
<listitem>
<para>Open <link xlink:href="examples/distributed_table/Open.hpp"
>header</link> and <link
xlink:href="examples/distributed_table/Open.cpp"
>cpp</link></para>
</listitem>
<listitem>
<para><link xlink:href="examples/distributed_table/Events.hpp"
>events definition</link></para>
</listitem>
</itemizedlist></para>
<para>There is an added bonus offered for submachines, which can have both the
standard transition_table and an internal_transition_table (which has a
higher priority). This makes it easier if you decide to make a full
submachine from a state. It is also slightly faster than the standard
alternative, adding orthogonal regions, because event dispatching will, if
accepted by the internal table, not continue to the subregions. This gives
you a O(1) dispatch instead of O(number of regions). While the example is
with eUML, the same is also possible with any front-end.</para>
</sect2>
<sect2>
<title><command xml:id="basic-row2"/>more row types</title>
<para>It is also possible to write transitions using actions and guards not just
from the state machine but also from its contained states. In this case, one
must specify not just a method pointer but also the object on which to call
it. This transition row is called, not very originally, <code>row2</code>.
They come, like normal transitions in four flavors: <code>a_row2, g_row2,
_row2 and row2</code>. For example, a transition calling an action from
the state Empty could be:</para>
<para>
<programlisting>a_row2&lt;Stopped,open_close,Open,Empty
/*action source*/,&amp;Empty::open_drawer/*action*/></programlisting>
</para>
<para>The same capabilities are also available for internal transitions so that
we have: <code>a_irow2, g_irow2, _irow2 and row2</code>. For transitions
defined as part of the <code>internal_transition_table</code>, you can use
the <command xlink:href="#internal-transitions">a_internal, g_internal,
_internal, internal</command> row types from the previous
sections.</para>
<para>These row types allow us to distribute the state machine code among
states, making them reusable and more useful. Using transition tables inside
states also contributes to this possibility. An <link
xlink:href="examples/SimpleTutorial2.cpp">example</link> of these new
rows is also provided.</para>
</sect2>
<sect2>
<title>Explicit entry / entry and exit pseudo-state / fork</title>
<para>MSM (almost) fully supports these features, described in the <command
xlink:href="#uml-history">small UML tutorial</command>. Almost because
there are currently two limitations: <itemizedlist>
<listitem>
<para>it is only possible to explicitly enter a sub- state of the
target but not a sub-sub state.</para>
</listitem>
<listitem>
<para>it is not possible to explicitly exit. Exit points must be
used.</para>
</listitem>
</itemizedlist></para>
<para>Let us see a concrete example:</para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/entrytutorial.jpg" width="60%"
scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>We find in this diagram:<itemizedlist>
<listitem>
<para>A “normal” activation of SubFsm2, triggered by event1. In each
region, the initial state is activated, i.e. SubState1 and
SubState1b.</para>
</listitem>
<listitem>
<para>An explicit entry into SubFsm2::SubState2 for region “1” with
event2 as trigger, meaning that in region “2” the initial state,
SubState1b, activated.</para>
</listitem>
<listitem>
<para>A fork into regions “1” and “2” to the explicit entries
SubState2 and SubState2b, triggered by event3. Both states
become active so no region is default activated (if we had a
third one, it would be).</para>
</listitem>
<listitem>
<para>A connection of two transitions through an entry pseudo state,
SubFsm2::PseudoEntry1, triggered by event4 and triggering also
the second transition on the same event (both transitions must
be triggered by the same event). Region “2” is default-activated
and SubState1b becomes active.</para>
</listitem>
<listitem>
<para>An exit from SubFsm2 using an exit pseudo-state, PseudoExit1,
triggered by event5 and connecting two transitions using the
same event. Again, the event is forwarded to the second
transition and both regions are exited, as SubFsm2 becomes
inactive. Note that if no transition is defined from
PseudoExit1, an error (as defined in the UML standard) will be
detected and no_transition called.</para>
</listitem>
</itemizedlist></para>
<para>The example is also <link xlink:href="examples/DirectEntryTutorial.cpp"
>fully implemented</link>.</para>
<para>This sounds complicated but the syntax is simple.</para>
<sect3>
<title>Explicit entry</title>
<para>First, to define that a state is an explicit entry, you have to make
it a state and mark it as explicit, giving as template parameters the
region id (the region id starts with 0 and corresponds to the first
initial state of the initial_state type sequence).</para>
<para>
<programlisting>struct SubFsm2_ : public msm::front::state_machine_def&lt;SubFsm2_>
{
struct SubState2 : public msm::front::state&lt;> ,
public msm::front::explicit_entry&lt;0>
{...};
...
};</programlisting>
</para>
<para>And define the submachine as:</para>
<para>
<programlisting>typedef msm::back::state_machine&lt;SubFsm2_> SubFsm2;</programlisting>
</para>
<para>You can then use it as target in a transition with State1 as
source:</para>
<para>
<programlisting>_row &lt; State1, Event2, SubFsm2::direct&lt; SubFsm2_::SubState2> > //SubFsm2_::SubState2: complete name of SubState2 (defined within SubFsm2_)</programlisting>
</para>
<para>The syntax deserves some explanation. SubFsm2_ is a front end.
SubState2 is a nested state, therefore the SubFsm2_::SubState2 syntax.
The containing machine (containing State1 and SubFsm2) refers to the
backend instance (SubFsm2). SubFsm2::direct states that an explicit
entry is desired.</para>
<para><emphasis role="underline">Note (also valid for forks)</emphasis>: in
order to make compile time more bearable for the more standard cases,
and unlike initial states, explicit entry states which are also not
found in the transition table of the entered submachine (a rare case) do
NOT get automatically created. To explicitly create such states, you
need to add in the state machine containing the explicit states a simple
typedef giving a sequence of states to be explicitly created
like:</para>
<para>
<programlisting>typedef mpl::vector&lt;SubState2,SubState2b> explicit_creation;</programlisting>
</para>
<para><emphasis role="underline">Note (also valid for forks)</emphasis>: At
the moment, it is not possible to use a submachine as the target of an
explicit entry. Please use entry pseudo states for an almost identical
effect.</para>
</sect3>
<sect3>
<title>Fork</title>
<para>Need a fork instead of an explicit entry? As a fork is an explicit
entry into states of different regions, we do not change the state
definition compared to the explicit entry and specify as target a list
of explicit entry states:</para>
<para>
<programlisting>_row &lt; State1, Event3,
mpl::vector&lt;SubFsm2::direct&lt;SubFsm2_::SubState2>,
SubFsm2::direct &lt;SubFsm2_::SubState2b>
></programlisting>
</para>
<para>With SubState2 defined as before and SubState2b defined as being in
the second region (Caution: MSM does not check that the region is
correct):</para>
<para>
<programlisting>struct SubState2b : public msm::front::state&lt;> ,
public msm::front::explicit_entry&lt;1></programlisting>
</para>
</sect3>
<sect3>
<title>Entry pseudo states</title>
<para> To define an entry pseudo state, you need derive from the
corresponding class and give the region id:</para>
<para>
<programlisting>struct PseudoEntry1 : public msm::front::entry_pseudo_state&lt;0></programlisting>
</para>
<para>And add the corresponding transition in the top-level state machine's
transition table:</para>
<para>
<programlisting>_row &lt; State1, Event4, SubFsm2::entry_pt&lt;SubFsm2_::PseudoEntry1> ></programlisting>
</para>
<para>And another in the SubFsm2_ submachine definition (remember that UML
defines an entry point as a connection between two transitions), for
example this time with an action method:</para>
<para>
<programlisting>_row &lt; PseudoEntry1, Event4, SubState3,&amp;SubFsm2_::entry_action ></programlisting>
</para>
</sect3>
<sect3>
<title> Exit pseudo states </title>
<para>And finally, exit pseudo states are to be used almost the same way,
but defined differently: it takes as template argument the event to be
forwarded (no region id is necessary):</para>
<para>
<programlisting>struct PseudoExit1 : public exit_pseudo_state&lt;event6></programlisting>
</para>
<para>And you need, like for entry pseudo states, two transitions, one in
the submachine:</para>
<para>
<programlisting>_row &lt; SubState3, Event5, PseudoExit1 ></programlisting>
</para>
<para>And one in the containing state machine:</para>
<para>
<programlisting>_row &lt; SubFsm2::exit_pt&lt;SubFsm2_::PseudoExit1>, Event6,State2 ></programlisting>
</para>
<para><emphasis role="underline">Important note 1:</emphasis> UML defines
transiting to an entry pseudo state and having either no second
transition or one with a guard as an error but defines no error
handling. MSM will tolerate this behavior; the entry pseudo state will
simply be the newly active state.</para>
<para><emphasis role="underline">Important note 2</emphasis>: UML defines
transiting to an exit pseudo state and having no second transition as an
error, and also defines no error handling. Therefore, it was decided to
implement exit pseudo state as terminate states and the containing
composite not properly exited will stay terminated as it was technically
“exited”.</para>
<para><emphasis role="underline">Important note 3:</emphasis> UML states
that for the exit point, the same event must be used in both
transitions. MSM relaxes this rule and only wants the event on the
inside transition to be convertible to the one of the outside
transition. In our case, event6 is convertible from event5. Notice that
the forwarded event must be named in the exit point definition. For
example, we could define event6 as simply as:</para>
<para>
<programlisting>struct event6
{
event6(){}
template &lt;class Event>
event6(Event const&amp;){}
}; //convertible from any event</programlisting>
</para>
</sect3>
</sect2>
<sect2>
<title>Flags</title>
<para>This <link xlink:href="examples/Flags.cpp">tutorial</link> is devoted to a
concept not defined in UML: flags. It has been added into MSM after proving
itself useful on many occasions. Please, do not be frightened as we are not
talking about ugly shortcuts made of an improbable collusion of
Booleans.</para>
<para>If you look into the Boost.Statechart documentation you'll find this
code:</para>
<programlisting>if ( ( state_downcast&lt; const NumLockOff * >() != 0 ) &amp;&amp;
( state_downcast&lt; const CapsLockOff * >() != 0 ) &amp;&amp;
( state_downcast&lt; const ScrollLockOff * >() != 0 ) )
</programlisting>
<para>While correct and found in many UML books, this can be error-prone and a
potential time-bomb when your state machine grows and you add new states or
orthogonal regions.</para>
<para>And most of all, it hides the real question, which would be “does my state
machine's current state define a special property”? In this special case
“are my keys in a lock state”? So let's apply the Fundamental Theorem of
Software Engineering and move one level of abstraction higher.</para>
<para>In our player example, let's say we need to know if the player has a
loaded CD. We could do the same:</para>
<programlisting>if ( ( state_downcast&lt; const Stopped * >() != 0 ) &amp;&amp;
( state_downcast&lt; const Open * >() != 0 ) &amp;&amp;
( state_downcast&lt; const Paused * >() != 0 ) &amp;&amp;
( state_downcast&lt; const Playing * >() != 0 )) </programlisting>
<para>Or flag these 4 states as CDLoaded-able. You add a flag_list type into
each flagged state:</para>
<para>
<programlisting>typedef mpl::vector1&lt;CDLoaded> flag_list;</programlisting>
</para>
<para>You can even define a list of flags, for example in Playing:</para>
<para>
<programlisting>typedef mpl::vector2&lt;PlayingPaused,CDLoaded> flag_list;</programlisting>
</para>
<para>This means that Playing supports both properties. To check if your player
has a loaded CD, check if your flag is active in the current state:</para>
<para>
<programlisting>player p; if (p.is_flag_active&lt;CDLoaded>()) ... </programlisting>
</para>
<para>And what if you have orthogonal regions? How to decide if a state machine
is in a flagged state? By default, you keep the same code and the current
states will be OR'ed, meaning if one of the active states has the flag, then
is_flag_active returns true. Of course, in some cases, you might want that
all of the active states are flagged for the state to be active. You can
also AND the active states:</para>
<para>
<programlisting>if (p.is_flag_active&lt;CDLoaded,player::Flag_AND>()) ...</programlisting>
</para>
<para>The following diagram displays the flag situation in the tutorial.</para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/FlagsTutorial.jpg" width="60%"
scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
</sect2>
<sect2>
<title><command xml:id="event-hierarchy"/>Event Hierarchy</title>
<para>There are cases where one needs transitions based on categories of events.
An example is text parsing. Let's say you want to parse a string and use a
state machine to manage your parsing state. You want to parse 4 digits and
decide to use a state for every matched digit. Your state machine could look
like:</para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/ParsingDigits.jpg" width="30%"
scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>But how to detect the digit event? We would like to avoid defining 10
transitions on char_0, char_1... between two states as it would force us to
write 4 x 10 transitions and the compile-time would suffer. To solve this
problem, MSM supports the triggering of a transition on a subclass event.
For example, if we define digits as: </para>
<programlisting>struct digit {};
struct char_0 : public digit {}; </programlisting>
<para>And to the same for other digits, we can now fire char_0, char_1 events
and this will cause a transition with "digit" as trigger to be taken.</para>
<para>An <link xlink:href="examples/ParsingDigits.cpp">example</link> with
performance measurement, taken from the documentation of Boost.Xpressive
illustrates this example. You might notice that the performance is actually
very good (in this case even better).</para>
</sect2>
<sect2>
<title>Customizing a state machine / Getting more speed</title>
<para>MSM is offering many UML features at a high-speed, but sometimes, you just
need more speed and are ready to give up some features in exchange. A
process_event is handling several tasks: <itemizedlist>
<listitem>
<para>checking for terminate/interrupt states</para>
</listitem>
<listitem>
<para>handling the message queue (for entry/exit/transition actions
generating themselves events)</para>
</listitem>
<listitem>
<para>handling deferred events</para>
</listitem>
<listitem>
<para>catching exceptions (or not)</para>
</listitem>
<listitem>
<para>handling the state switching and action calls</para>
</listitem>
</itemizedlist>Of these tasks, only the last one is absolutely necessary to
a state machine (its core job), the other ones are nice-to-haves which cost
CPU time. In many cases, it is not so important, but in embedded systems,
this can lead to ad-hoc state machine implementations. MSM detects by itself
if a concrete state machine makes use of terminate/interrupt states and
deferred events and deactivates them if not used. For the other two, if you
do not need them, you need to help by indicating it in your implementation.
This is done with two simple typedefs:<itemizedlist>
<listitem>
<para><code>no_exception_thrown</code> indicates that behaviors will
never throw and MSM does not need to catch anything</para>
</listitem>
<listitem>
<para><code>no_message_queue</code> indicates that no action will
itself generate a new event and MSM can save us the message
queue.</para>
</listitem>
</itemizedlist>The third configuration possibility, explained <link
xlink:href="#basic-defer">here</link>, is to manually activate deferred
events, using <code>activate_deferred_events</code>. For example, the
following state machine sets all three configuration types:</para>
<programlisting>struct player_ : public msm::front::state_machine_def&lt;player_>
{
// no need for exception handling or message queue
typedef int no_exception_thrown;
typedef int no_message_queue;
// also manually enable deferred events
typedef int activate_deferred_events
...// rest of implementation
};</programlisting>
<para><emphasis role="underline">Important note</emphasis>: As exit pseudo
states are using the message queue to forward events out of a submachine,
the <code>no_message_queue</code> option cannot be used with state machines
containing an exit pseudo state.</para>
</sect2>
<sect2>
<title>Choosing the initial event</title>
<para>A state machine is started using the <code>start</code> method. This
causes the initial state's entry behavior to be executed. Like every entry
behavior, it becomes as parameter the event causing the state to be entered.
But when the machine starts, there was no event triggered. In this case, MSM
sends <code>msm::back::state_machine&lt;...>::InitEvent</code>, which might
not be the default you'd want. For this special case, MSM provides a
configuration mechanism in the form of a typedef. If the state machine's
front-end definition provides an initial_event typedef set to another event,
this event will be used. For example:</para>
<programlisting>struct my_initial_event{};
struct player_ : public msm::front::state_machine_def&lt;player_>{
...
typedef my_initial_event initial_event;
};</programlisting>
</sect2>
<sect2>
<title> Containing state machine (deprecated)</title>
<para>This feature is still supported in MSM for backward compatibility but made
obsolete by the fact that every guard/action/entry action/exit action get
the state machine passed as argument and might be removed at a later
time.</para>
<para>All of the states defined in the state machine are created upon state
machine construction. This has the huge advantage of a reduced syntactic
noise. The cost is a small loss of control for the user on the state
creation and access. But sometimes you needed a way for a state to get
access to its containing state machine. Basically, a state needs to change
its declaration to:</para>
<programlisting>struct Stopped : public msm::front::state&lt;sm_ptr></programlisting>
<para>And to provide a set_sm_ptr function: <code>void set_sm_ptr(player*
pl)</code></para>
<para>to get a pointer to the containing state machine. The same applies to
terminate_state / interrupt_state and entry_pseudo_state /
exit_pseudo_state. </para>
</sect2>
</sect1>
<sect1>
<title><command xml:id="functor-front-end"/>Functor front-end</title>
<para>The functor front-end is the preferred front-end at the moment. It is more
powerful than the standard front-end and has a more readable transition table.
It also makes it easier to reuse parts of state machines. Like <command
xlink:href="#eUML-front-end">eUML</command>, it also comes with a good deal
of predefined actions. Actually, eUML generates a functor front-end through
Boost.Typeof and Boost.Proto so both offer the same functionality.</para>
<para>The rows which MSM offered in the previous front-end come in different
flavors. We saw the a_row, g_row, _row, row, not counting internal rows. This is
already much to know, so why define new rows? These types have some
disadvantages: <itemizedlist>
<listitem>
<para>They are more typing and information than we would wish. This
means syntactic noise and more to learn.</para>
</listitem>
<listitem>
<para>Function pointers are weird in C++.</para>
</listitem>
<listitem>
<para>The action/guard signature is limited and does not allow for more
variations of parameters (source state, target state, current state
machine, etc.)</para>
</listitem>
<listitem>
<para>It is not easy to reuse action code from a state machine to
another.</para>
</listitem>
</itemizedlist></para>
<sect2>
<title> Transition table </title>
<para>We can change the definition of the simple tutorial's transition table
to:</para>
<programlisting>
struct transition_table : mpl::vector&lt;
// Start Event Target Action Guard
// +---------+------------+-----------+---------------------------+----------------------------+
Row &lt; Stopped , play , Playing , start_playback , none >,
Row &lt; Stopped , open_close , Open , open_drawer , none >,
Row &lt; Stopped , stop , Stopped , none , none >,
// +---------+------------+-----------+---------------------------+----------------------------+
Row &lt; Open , open_close , Empty , close_drawer , none >,
// +---------+------------+-----------+---------------------------+----------------------------+
Row &lt; Empty , open_close , Open , open_drawer , none >,
Row &lt; Empty , cd_detected, Stopped , store_cd_info , good_disk_format >,
g_row&lt; Empty , cd_detected, Playing , &amp;player_::store_cd_info , &amp;player_::auto_start >,
// +---------+------------+-----------+---------------------------+----------------------------+
Row &lt; Playing , stop , Stopped , stop_playback , none >,
Row &lt; Playing , pause , Paused , pause_playback , none >,
Row &lt; Playing , open_close , Open , stop_and_open , none >,
// +---------+------------+-----------+---------------------------+----------------------------+
Row &lt; Paused , end_pause , Playing , resume_playback , none >,
Row &lt; Paused , stop , Stopped , stop_playback , none >,
Row &lt; Paused , open_close , Open , stop_and_open , none >
// +---------+------------+-----------+---------------------------+----------------------------+
> {};
</programlisting>
<para>Transitions are now of type "Row" with exactly 5 template arguments:
source state, event, target state, action and guard. Wherever there is
nothing (for example actions and guards), write "none". Actions and guards
are no more methods but functors getting as arguments the detected event,
the state machine, source and target state:</para>
<programlisting>struct store_cd_info
{
template &lt;class Fsm,class Evt,class SourceState,class TargetState>
void operator()(Evt const&amp;, Fsm&amp; fsm, SourceState&amp;,TargetState&amp; )
{
cout &lt;&lt; "player::store_cd_info" &lt;&lt; endl;
fsm.process_event(play());
}
}; </programlisting>
<para>The advantage of functors compared to functions are that functors are
generic and reusable. They also allow passing more parameters than just
events. The guard functors are the same but have an operator() returning a
bool.</para>
<para>It is also possible to mix rows from different front-ends. To show this, a
g_row has been left in the transition table. <emphasis role="underline"
>Note:</emphasis> in case the action functor is used in the transition
table of a state machine contained inside a top-level state machine, the
“fsm” parameter refers to the lowest-level state machine (referencing this
action), not the top-level one.</para>
<para>To illustrate the reusable point, MSM comes with a whole set of predefined
functors. Please refer to eUML for the <link xlink:href="#Reference-begin"
>full list</link>. For example, we are now going to replace the first
action by an action sequence and the guard by a more complex functor.</para>
<para>We decide we now want to execute two actions in the first transition
(Stopped -> Playing). We only need to change the action start_playback to
<programlisting>ActionSequence_&lt; mpl::vector&lt;some_action, start_playback> ></programlisting>and
now will execute some_action and start_playback every time the transition is
taken. ActionSequence_ is a functor calling each action of the mpl::vector
in sequence.</para>
<para>We also want to replace good_disk_format by a condition of the type:
“good_disk_format &amp;&amp; (some_condition || some_other_condition)”. We
can achieve this using And_ and Or_ functors:
<programlisting>And_&lt;good_disk_format,Or_&lt; some_condition , some_other_condition> ></programlisting>It
even starts looking like functional programming. MSM ships with functors for
operators, state machine usage, STL algorithms or container methods.</para>
</sect2>
<sect2>
<title>Defining states with entry/exit actions</title>
<para>You probably noticed that we just showed a different transition table and
that we even mixed rows from different front-ends. This means that you can
do this and leave the definitions for states unchanged. Most examples are
doing this as it is the simplest solution. You still enjoy the simplicity of
the first front-end with the extended power of the new transition types.
This <link xlink:href="examples/SimpleWithFunctors.cpp">tutorial</link>,
adapted from the earlier example does just this.</para>
<para>Of course, it is also possible to define states where entry and exit
actions are also provided as functors as these are generated by eUML and
both front-ends are equivalent. For example, we can define a state
as:</para>
<programlisting>struct Empty_Entry
{
template &lt;class Event,class Fsm,class State>
void operator()(Event const&amp;,Fsm&amp;,State&amp;)
{
...
}
}; // same for Empty_Exit
struct Empty : public msm::front::euml::func_state&lt;Empty_Entry,Empty_Exit>{};</programlisting>
<para>This also means that you can, like in the transition table, write entry /
exit actions made of more complicated action combinations. The previous
example can therefore <link xlink:href="examples/SimpleWithFunctors2.cpp">be
rewritten</link>.</para>
<para>Usually, however, one will probably use the standard state definition as
it provides the same capabilities as this front-end state definition, unless
one needs some of the shipped predefined functors or is a fan of functional
programming.</para>
</sect2>
<sect2>
<title>Defining a simple state machine</title>
<para>Like states, state machines can be defined using the previous front-end,
as the previous example showed, or with the functor front-end, which allows
you to define a state machine entry and exit functions as functors, as in
<link xlink:href="examples/SimpleWithFunctors2.cpp">this
example</link>.</para>
</sect2>
<sect2>
<title>Anonymous transitions</title>
<para>Anonymous (completion) transitions are transitions without a named event.
We saw how this front-end uses <code>none</code> when no action or guard is
required. We can also use <code>none</code> instead of an event to mark an
anonymous transition. For example, the following transition makes an
immediate transition from State1 to State2:</para>
<programlisting>Row &lt; State1 , none , State2 ></programlisting>
<para>The following transition does the same but calling an action in the
process:</para>
<programlisting>Row &lt; State1 , none , State2 , State1ToState2, none ></programlisting>
<para>The following diagram shows an example and its <link
xlink:href="examples/AnonymousTutorialWithFunctors.cpp"
>implementation</link>:</para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/Anonymous.jpg" width="70%" scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
</sect2>
<sect2>
<title><command xml:id="functor-internal-transitions"/>Internal
transitions</title>
<para>The <link xlink:href="examples/SimpleTutorialInternalFunctors.cpp"
>following example</link> uses internal transitions with the functor
front-end. As for the simple standard front-end, both methods of defining
internal transitions are supported:<itemizedlist>
<listitem>
<para>providing a <code>Row</code> in the state machine's transition
table with <code>none</code> as target state defines an internal
transition.</para>
</listitem>
<listitem>
<para>providing an <code>internal_transition_table</code> made of
<code>Internal</code> rows inside a state or submachine
defines UML-conform internal transitions with higher
priority.</para>
</listitem>
<listitem>
<para>transitions defined inside
<code>internal_transition_table</code> require no source or
target state as the source state is known (<code>Internal</code>
really are <code>Row</code> without a source or target state)
.</para>
</listitem>
</itemizedlist>Like for the <command xlink:href="#internal-transitions-note"
>standard front-end internal transitions</command>, internal transition
tables are added into the main state machine's table, thus allowing you to
distribute the transition table definition and reuse states.</para>
<para>There is an added bonus offered for submachines, which can have both the
standard transition_table and an internal_transition_table (which has higher
priority). This makes it easier if you decide to make a full submachine from
a state later. It is also slightly faster than the standard alternative,
adding orthogonal regions, because event dispatching will, if accepted by
the internal table, not continue to the subregions. This gives you a O(1)
dispatch instead of O(number of regions). While the example is with eUML,
the same is also possible with this front-end.</para>
</sect2>
</sect1>
<sect1>
<title><command xml:id="eUML-front-end"/>eUML (experimental)</title>
<para><emphasis role="underline">Important note</emphasis>: eUML requires a compiler
supporting Boost.Typeof. More generally, eUML has experimental status because
most compilers will start crashing when a state machine becomes too big.</para>
<para>The previous front-ends are simple to write but still force an amount of
noise, mostly MPL types, so it would be nice to write code looking like C++
(with a C++ action language) directly inside the transition table, like UML
designers like to do on their state machine diagrams. If it were functional
programming, it would be even better. This is what eUML is for.</para>
<para>eUML is a Boost.Proto and Boost.Typeof-based compile-time domain specific
embedded language. It provides grammars which allow the definition of
actions/guards directly inside the transition table or entry/exit in the state
definition. There are grammars for actions, guards, flags, attributes, deferred
events, initial states.</para>
<para>It also relies on Boost.Typeof as a wrapper around the new decltype C++0x
feature to provide a compile-time evaluation of all the grammars. Unfortunately,
all the underlying Boost libraries are not Typeof-enabled, so for the moment,
you will need a compiler where Typeof is natively implemented (like VC8-9-10,
g++ >= 4.3).</para>
<para>Examples will be provided in the next paragraphs. You need to include eUML
basic features: </para>
<para>
<programlisting>#include &lt;msm/front/euml/euml.hpp></programlisting>
</para>
<para>To add STL support (at possible cost of longer compilation times), include: </para>
<para>
<programlisting>#include &lt;msm/front/euml/stl.hpp></programlisting>
</para>
<para>eUML is defined in the namespace <code>msm::front::euml</code>.</para>
<sect2>
<title>Transition table</title>
<para>A transition can be defined using eUML as: </para>
<para>
<programlisting>source + event [guard] / action == target</programlisting>
</para>
<para>or as</para>
<para>
<programlisting>target == source + event [guard] / action</programlisting>
</para>
<para>The first version looks like a drawn transition in a diagram, the second
one seems natural to a C++ developer.</para>
<para>The simple transition table written with the <command
xlink:href="#functor-front-end">functor front-end</command> can now be
written as:</para>
<programlisting>BOOST_MSM_EUML_TRANSITION_TABLE((
Stopped + play [some_guard] / (some_action , start_playback) == Playing ,
Stopped + open_close/ open_drawer == Open ,
Stopped + stop == Stopped ,
Open + open_close / close_drawer == Empty ,
Empty + open_close / open_drawer == Open ,
Empty + cd_detected [good_disk_format] / store_cd_info == Stopped
),transition_table) </programlisting>
<para>Or, using the alternative notation, it can be:</para>
<programlisting>BOOST_MSM_EUML_TRANSITION_TABLE((
Playing == Stopped + play [some_guard] / (some_action , start_playback) ,
Open == Stopped + open_close/ open_drawer ,
Stopped == Stopped + stop ,
Empty == Open + open_close / close_drawer ,
Open == Empty + open_close / open_drawer ,
Stopped == Empty + cd_detected [good_disk_format] / store_cd_info
),transition_table) </programlisting>
<para>The transition table now looks like a list of (readable) rules with little
noise.</para>
<para>UML defines guards between “[ ]” and actions after a “/”, so the chosen
syntax is already more readable for UML designers. UML also allows designers
to define several actions sequentially (our previous ActionSequence_)
separated by a comma. The first transition does just this: two actions
separated by a comma and enclosed inside parenthesis to respect C++ operator
precedence.</para>
<para>If this seems to you like it will cost you run-time performance, don't
worry, eUML is based on typeof (decltype) which only evaluates the
parameters to BOOST_MSM_EUML_TRANSITION_TABLE and no run-time cost occurs.
Actually, eUML is only a metaprogramming layer on top of "standard" MSM
metaprogramming and this first layer generates the previously-introduced
<command xlink:href="#functor-front-end">functor
front-end</command>.</para>
<para>UML also allows designers to define more complicated guards, like
[good_disk_format &amp;&amp; (some_condition || some_other_condition)]. This
was possible with our previously defined functors, but using a complicated
template syntax. This syntax is now possible exactly as written, which means
without any syntactic noise at all.</para>
</sect2>
<sect2>
<title>Defining events, actions and states with entry/exit actions</title>
<sect3>
<title>Events</title>
<para>Events must be proto-enabled. To achieve this, they must inherit from
a proto terminal (euml_event&lt;event-name>). eUML also provides a macro
to make this easier:</para>
<para>
<programlisting>BOOST_MSM_EUML_EVENT(play)</programlisting>
</para>
<para>This declares an event type and an instance of this type called
<code>play</code>, which is now ready to use in state or transition
behaviors.</para>
<para>There is a second macro, BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES, which
takes as second parameter the attributes an event will contain, using
the <command xlink:href="#eUML-attributes">attribute
syntax</command>.</para>
<para><emphasis role="underline">Note</emphasis>: as we now have events
defined as instances instead of just types, can we still process an
event by creating one on the fly, like:
<code>fsm.process_event(play());</code> or do we have to write:
<code>fsm.process_event(play);</code></para>
<para>The answer is you can do both. The second one is easier but unlike
other front-ends, the second uses a defined operator(), which creates an
event on the fly.</para>
</sect3>
<sect3>
<title>Actions</title>
<para>Actions (returning void) and guards (returning a bool) are defined
like previous functors, with the difference that they also must be
proto-enabled. This can be done by inheriting from euml_action&lt;
functor-name >. eUML also provides a macro:</para>
<programlisting>BOOST_MSM_EUML_ACTION(some_condition)
{
template &lt;class Fsm,class Evt,class SourceState,class TargetState>
bool operator()(Evt const&amp; ,Fsm&amp; ,SourceState&amp;,TargetState&amp; )
{ return true; }
}; </programlisting>
<para>Like for events, this macro declares a functor type and an instance
for use in transition or state behaviors.</para>
<para>It is possible to use the same action grammar from the transition
table to define state entry and exit behaviors. So
<code>(action1,action2)</code> is a valid entry or exit behavior
executing both actions in turn.</para>
<para>The state functors have a slightly different signature as there is no
source and target state but only a current state (entry/exit actions are
transition-independent), for example:</para>
<programlisting>BOOST_MSM_EUML_ACTION(Empty_Entry)
{
template &lt;class Evt,class Fsm,class State>
void operator()(Evt const&amp; ,Fsm&amp; ,State&amp; ) { ... }
}; </programlisting>
<para><command xml:id="eUML-reuse-functor"/>It is also possible to reuse the functors from the functor front-end.
The syntax is however slightly less comfortable as we need to pretend
creating one on the fly for typeof. For example:</para>
<programlisting>struct start_playback
{
template &lt;class Fsm,class Evt,class SourceState,class TargetState>
void operator()(Evt const&amp; ,Fsm&amp;,SourceState&amp; ,TargetState&amp; )
{
...
}
};
BOOST_MSM_EUML_TRANSITION_TABLE((
Playing == Stopped + play / start_playback() ,
...
),transition_table)</programlisting>
</sect3>
<sect3>
<title>States</title>
<para>There is also a macro for states. This macro has 2 arguments, first
the expression defining the state, then the state (instance)
name:</para>
<programlisting>BOOST_MSM_EUML_STATE((),Paused)</programlisting>
<para>This defines a simple state without entry or exit action. You can
provide in the expression parameter the state behaviors (entry and exit)
using the action grammar, like in the transition table:</para>
<programlisting>BOOST_MSM_EUML_STATE(((Empty_Entry,Dummy_Entry)/*2 entryactions*/,
Empty_Exit/*1 exit action*/ ),
Empty)</programlisting>
<para>This means that Empty is defined as a state with an entry action made
of two sub-actions, Empty_Entry and Dummy_Entry (enclosed inside
parenthesis), and an exit action, Empty_Exit.</para>
<para>There are several possibilitites for the <command
xml:id="eUML-build-state"/> expression syntax:<itemizedlist>
<listitem>
<para>(): state without entry or exit action.</para>
</listitem>
<listitem>
<para>(Expr1): state with entry but no exit action.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2): state with entry and exit action.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes): state with entry and exit
action, defining some attributes (read further on).</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes,Configure): state with entry and
exit action, defining some attributes (read further on) and
flags (standard MSM flags) or deferred events (standard MSM
deferred events).</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes,Configure,Base): state with entry
and exit action, defining some attributes (read further on),
flags and deferred events (plain msm deferred events) and a
non-default base state (as defined in standard MSM).</para>
</listitem>
</itemizedlist></para>
<para>no_action is also defined, which does, well, nothing except being a
placeholder (needed for example as entry action if we have no entry but
an exit). Expr1 and Expr2 are a sequence of actions, obeying the same
action grammar as in the transition table (following the “/”
symbol).</para>
<para>The BOOST_MSM_EUML_STATE macro will allow you to define most common
states, but sometimes you will need more, for example provide in your
states some special behavior. In this case, you will have to do the
macro's job by hand, which is not very complicated. The state will need
to inherit from <code>msm::front::state&lt;></code>, like any state, and
from <code>euml_state&lt;state-name></code> to be proto-enabled. You
will then need to declare an instance for use in the transition table.
For example:</para>
<programlisting>struct Empty_impl : public msm::front::state&lt;> , public euml_state&lt;Empty_impl>
{
void activate_empty() {std::cout &lt;&lt; "switching to Empty " &lt;&lt; std::endl;}
template &lt;class Event,class Fsm>
void on_entry(Event const&amp; evt,Fsm&amp;fsm){...}
template &lt;class Event,class Fsm>
void on_exit(Event const&amp; evt,Fsm&amp;fsm){...}
};
//instance for use in the transition table
Empty_impl const Empty;</programlisting>
<para>Notice also that we defined a method named activate_empty. We would
like to call it inside a behavior. This can be done using the
BOOST_MSM_EUML_METHOD macro. </para>
<programlisting>BOOST_MSM_EUML_METHOD(ActivateEmpty_,activate_empty,activate_empty_,void,void)</programlisting>
<para>The first parameter is the name of the underlying functor, which you
could use with the functor front-end, the second is the state method
name, the third is the eUML-generated function, the fourth and fifth the
return value when used inside a transition or a state behavior. You can
now use this inside a transition:</para>
<programlisting>Empty == Open + open_close / (close_drawer,activate_empty_(target_))</programlisting>
</sect3>
</sect2>
<sect2>
<title>Defining a simple state machine</title>
<para>You can reuse the state machine definition method from the standard
front-end and simply replace the transition table by this new one. You can
also use eUML to define a state machine "on the fly" (if, for example, you
need to provide an on_entry/on_exit for this state machine as a functor).
For this, there is also a macro, <command xml:id="eUML-build-sm"
/>BOOST_MSM_EUML_DECLARE_STATE_MACHINE, which has 2 arguments, an expression
describing the state machine and the state machine name. The expression has
up to 8 arguments:<itemizedlist>
<listitem>
<para>(Stt, Init): simplest state machine where only the transition
table and initial state(s) are defined.</para>
</listitem>
<listitem>
<para>(Stt, Init, Expr1): state machine where the transition table,
initial state and entry action are defined.</para>
</listitem>
<listitem>
<para>(Stt, Init, Expr1, Expr2): state machine where the transition
table, initial state, entry and exit actions are defined.</para>
</listitem>
<listitem>
<para>(Stt, Init, Expr1, Expr2, Attributes): state machine where the
transition table, initial state, entry and exit actions are
defined. Furthermore, some attributes are added (read further
on).</para>
</listitem>
<listitem>
<para>(Stt, Init, Expr1, Expr2, Attributes, Configure): state
machine where the transition table, initial state, entry and
exit actions are defined. Furthermore, some attributes (read
further on), flags, deferred events and <link
xlink:href="#eUML-Configuration">configuration
capabilities</link> (no message queue / no exception
catching) are added.</para>
</listitem>
<listitem>
<para>(Stt, Init, Expr1, Expr2, Attributes, Flags, Deferred , Base):
state machine where the transition table, initial state, entry
and exit actions are defined. Furthermore, attributes (read
further on), flags , deferred events and configuration
capabilities (no message queue / no exception catching) are
added and a non-default base state (see the <link
xlink:href="#backend-base-state">back-end
description</link>) is defined.</para>
</listitem>
</itemizedlist>For example, a minimum state machine could be defined
as:</para>
<programlisting>BOOST_MSM_EUML_TRANSITION_TABLE((
),transition_table) </programlisting>
<programlisting>BOOST_MSM_EUML_DECLARE_STATE_MACHINE((transition_table,init_ &lt;&lt; Empty ),
player_)</programlisting>
<para>Please have a look at the player tutorial written using eUML's <link
xlink:href="examples/SimpleTutorialEuml2.cpp">first</link> and <link
xlink:href="examples/SimpleTutorialEuml.cpp">second</link> syntax. The
BOOST_MSM_EUML_DECLARE_ATTRIBUTE macro, to which we will get back shortly,
declares attributes given to an eUML type (state or event) using the
<command xlink:href="#eUML-attributes">attribute
syntax</command>.</para>
</sect2>
<sect2>
<title>Defining a submachine</title>
<para>Defining a submachine (see <link
xlink:href="examples/CompositeTutorialEuml.cpp">tutorial</link>) with
other front-ends simply means using a state which is a state machine in the
transition table of another state machine. This is the same with eUML. One
only needs define a second state machine and reference it in the transition
table of the containing state machine.</para>
<para>Unlike the state or event definition macros,
BOOST_MSM_EUML_DECLARE_STATE_MACHINE defines a type, not an instance because
a type is what the back-end requires. This means that you will need to
declare yourself an instance to reference your submachine into another state
machine, for example:</para>
<programlisting>BOOST_MSM_EUML_DECLARE_STATE_MACHINE(...,Playing_)
typedef msm::back::state_machine&lt;Playing_> Playing_type;
Playing_type const Playing;</programlisting>
<para>We can now use this instance inside the transition table of the containing
state machine:</para>
<programlisting>Paused == Playing + pause / pause_playback</programlisting>
</sect2>
<sect2>
<title>
<command xml:id="eUML-attributes"/>Attributes / Function call</title>
<para>We now want to make our grammar more useful. Very often, one needs only
very simple action methods, for example ++Counter or Counter > 5 where
Counter is usually defined as some attribute of the class containing the
state machine. It seems like a waste to write a functor for such a simple
action. Furthermore, states within MSM are also classes so they can have
attributes, and we would also like to provide them with attributes. </para>
<para>If you look back at our examples using the <link
xlink:href="examples/SimpleTutorialEuml2.cpp">first</link> and <link
xlink:href="examples/SimpleTutorialEuml.cpp">second</link> syntaxes, you
will find a BOOST_MSM_EUML_DECLARE_ATTRIBUTE and a BOOST_MSM_EUML_ATTRIBUTES
macro. The first one declares possible attributes:</para>
<programlisting>BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::string,cd_name)
BOOST_MSM_EUML_DECLARE_ATTRIBUTE(DiskTypeEnum,cd_type)</programlisting>
<para>This declares two attributes: cd_name of type std::string and cd_type of
type DiskTypeEnum. These attributes are not part of any event or state in
particular, we just declared a name and a type. Now, we can add attributes
to our cd_detected event using the second one:</para>
<programlisting>BOOST_MSM_EUML_ATTRIBUTES((attributes_ &lt;&lt; cd_name &lt;&lt; cd_type ),
cd_detected_attributes)</programlisting>
<para>This declares an attribute list which is not linked to anything in
particular yet. It can be attached to a state or an event. For example, if
we want the event cd_detected to have these defined attributes we
write:</para>
<programlisting>BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(cd_detected,cd_detected_attributes)</programlisting>
<para>For states, we use the BOOST_MSM_EUML_STATE macro, which has an expression
form where one can provide attributes. For example:</para>
<programlisting>BOOST_MSM_EUML_STATE((no_action /*entry*/,no_action/*exit*/,
attributes_ &lt;&lt; cd_detected_attributes),
some_state)</programlisting>
<para>OK, great, we now have a way to add attributes to a class, which we could
have done more easily, so what is the point? The point is that we can now
reference these attributes directly, at compile-time, in the transition
table. For example, in the example, you will find this transition:</para>
<programlisting>Stopped==Empty+cd_detected[good_disk_format&amp;&amp;(event_(cd_type)==Int_&lt;DISK_CD>())] </programlisting>
<para>Read event_(cd_type) as event_->cd_type with event_ a type generic for
events, whatever the concrete event is (in this particular case, it happens
to be a cd_detected as the transition shows).</para>
<para>The main advantage of this feature is that you do not need to define a new
functor and you do not need to look inside the functor to know what it does,
you have all at hand.</para>
<para>MSM provides more generic objects for state machine types:<itemizedlist>
<listitem>
<para>event_ : used inside any action, the event triggering the
transition</para>
</listitem>
<listitem>
<para>state_: used inside entry and exit actions, the entered /
exited state</para>
</listitem>
<listitem>
<para>source_: used inside a transition action, the source
state</para>
</listitem>
<listitem>
<para>target_: used inside a transition action, the target
state</para>
</listitem>
<listitem>
<para>fsm_: used inside any action, the (lowest-level) state machine
processing the transition</para>
</listitem>
<listitem>
<para>Int_&lt;int value>: a functor representing an int</para>
</listitem>
<listitem>
<para>Char_&lt;value>: a functor representing a char</para>
</listitem>
<listitem>
<para>Size_t_&lt;value>: a functor representing a size_t</para>
</listitem>
<listitem>
<para>String_&lt;mpl::string> (boost >= 1.40): a functor
representing a string.</para>
</listitem>
</itemizedlist></para>
<para>These helpers can be used in two different ways:<itemizedlist>
<listitem>
<para>helper(attribute_name) returns the attribute with name
attribute_name</para>
</listitem>
<listitem>
<para>helper returns the state / event type itself.</para>
</listitem>
</itemizedlist></para>
<para>The second form is helpful if you want to provide your states with their
own methods, which you also want to use inside the transition table. In the
<link xlink:href="examples/SimpleTutorialEuml.cpp">above
tutorial</link>, we provide Empty with an activate_empty method. We would
like to create a eUML functor and call it from inside the transition table.
This is done using the MSM_EUML_METHOD / MSM_EUML_FUNCTION macros. The first
creates a functor to a method, the second to a free function. In the
tutorial, we write:</para>
<programlisting>MSM_EUML_METHOD(ActivateEmpty_,activate_empty,activate_empty_,void,void)</programlisting>
<para>The first parameter is the functor name, for use with the functor
front-end. The second is the name of the method to call. The third is the
function name for use with eUML, the fourth is the return type of the
function if used in the context of a transition action, the fifth is the
result type if used in the context of a state entry / exit action (usually
fourth and fifth are the same). We now have a new eUML function calling a
method of "something", and this "something" is one of the five previously
shown generic helpers. We can now use this in a transition, for
example:</para>
<programlisting>Empty == Open + open_close / (close_drawer,activate_empty_(target_))</programlisting>
<para>The action is now defined as a sequence of two actions: close_drawer and
activate_empty, which is called on the target itself. The target being Empty
(the state defined left), this really will call Empty::activate_empty().
This method could also have an (or several) argument(s), for example the
event, we could then call activate_empty_(target_ , event_).</para>
<para>More examples can be found in the <link
xlink:href="examples/CompilerStressTestEuml.cpp">terrible compiler
stress test</link>, the <link xlink:href="examples/SimpleTimer.cpp"
>timer example</link> or in the <link
xlink:href="examples/iPodSearchEuml.cpp">iPodSearch with eUML</link>
(for String_ and more).</para>
</sect2>
<sect2>
<title>Orthogonal regions, flags, event deferring</title>
<para>Defining orthogonal regions really means providing more initial states. To
add more initial states, “shift left” some, for example, if we had another
initial state named AllOk :</para>
<programlisting>BOOST_MSM_EUML_DECLARE_STATE_MACHINE((transition_table,
init_ &lt;&lt; Empty &lt;&lt; AllOk ),
player_)</programlisting>
<para>You remember from the <command xlink:href="#eUML-build-state"
>BOOST_MSM_EUML_STATE </command> and <command
xlink:href="#eUML-build-sm"
>BOOST_MSM_EUML_DECLARE_STATE_MACHINE</command> signatures that just
after attributes, we can define flags, like in the basic MSM front-end. To
do this, we have another "shift-left" grammar, for example:</para>
<programlisting>BOOST_MSM_EUML_STATE((no_action,no_action, attributes_ &lt;&lt;no_attributes_,
/* flags */ configure_&lt;&lt; PlayingPaused &lt;&lt; CDLoaded),
Paused)</programlisting>
<para>We now defined that Paused will get two flags, PlayingPaused and CDLoaded,
defined, with another macro:</para>
<programlisting>BOOST_MSM_EUML_FLAG(CDLoaded)</programlisting>
<para>This corresponds to the following basic front-end definition of
Paused:</para>
<programlisting>struct Paused : public msm::front::state&lt;>
{
typedef mpl::vector2&lt;PlayingPaused,CDLoaded> flag_list;
};</programlisting>
<para>Under the hood, what you get really is a mpl::vector2.</para>
<para><emphasis role="underline">Note</emphasis>: As we use the version of
BOOST_MSM_EUML_STATE's expression with 4 arguments, we need to tell eUML
that we need no attributes. Similarly to a <code>cout &lt;&lt; endl</code>,
we need a <code>attributes_ &lt;&lt; no_attributes_</code> syntax.</para>
<para>You can use the flag with the is_flag_active method of a state machine.
You can also use the provided helper function is_flag_ (returning a bool)
for state and transition behaviors. For example, in the <link
xlink:href="examples/iPodEuml.cpp">iPod implementation with eUML</link>,
you find the following transition:</para>
<programlisting>ForwardPressed == NoForward + EastPressed[!is_flag_(NoFastFwd)]</programlisting>
<para>The function also has an optional second parameter which is the state
machine on which the function is called. By default, fsm_ is used (the
current state machine) but you could provide a functor returning a reference
to another state machine.</para>
<para>eUML also supports defining deferred events in the state (state machine)
definition. To this aim, we can reuse the flag grammar. For example:</para>
<programlisting>BOOST_MSM_EUML_STATE((Empty_Entry,Empty_Exit, attributes_ &lt;&lt; no_attributes_,
/* deferred */ configure_&lt;&lt; play ),Empty) </programlisting>
<para>The configure_ left shift is also responsible for deferring events. Shift
inside configure_ a flag and the state will get a flag, shift an event and
it will get a deferred event. This replaces the basic front-end
definition:</para>
<programlisting>typedef mpl::vector&lt;play> deferred_events;</programlisting>
<para>In <link xlink:href="examples/OrthogonalDeferredEuml.cpp">this
tutorial</link>, player is defining a second orthogonal region with
AllOk as initial state. The <code>Empty</code> and <code>Open</code> states
also defer the event <code>play</code>. <code>Open</code>,
<code>Stopped</code> and <code>Pause</code> also support the flag
<code>CDLoaded</code> using the same left shift into
<code>configure_</code>.</para>
<para>In the functor front-end, we also had the possibility to defer an event
inside a transition, which makes possible conditional deferring. This is
also possible with eUML through the use of the defer_ order, as shown in
<link xlink:href="examples/OrthogonalDeferredEuml.cpp">this
tutorial</link>. You will find the following transition:</para>
<programlisting>Open + play / defer_</programlisting>
<para>This is an <command xlink:href="#eUML-internal">internal
transition</command>. Ignore it for the moment. Interesting is, that
when the event <code>play</code> is fired and <code>Open</code> is active,
the event will be deferred. Now add a guard and you can conditionally defer
the event, for example:</para>
<programlisting>Open + play [ some_condition ] / defer_</programlisting>
<para>This is similar to what we did with the functor front-end. This means that
we have the same constraints. Using defer_ instead of a state declaration,
we need to tell MSM that we have deferred events in this state machine. We
do this (again) using a configure_ declaration in the state machine
definition in which we shift the deferred_events configuration flag:</para>
<programlisting>BOOST_MSM_EUML_DECLARE_STATE_MACHINE((transition_table,
init_ &lt;&lt; Empty &lt;&lt; AllOk,
Entry_Action,
Exit_Action,
attributes_ &lt;&lt; no_attributes_,
configure_&lt;&lt; deferred_events ),
player_)</programlisting>
<para>A <link xlink:href="examples/OrthogonalDeferredEuml2.cpp">tutorial</link>
illustrates this possibility.</para>
</sect2>
<sect2>
<title>
<command xml:id="eUML-Configuration"/>Customizing a state machine / Getting
more speed</title>
<para>We just saw how to use configure_ to define deferred events or flags. We
can also use it to configure our state machine like we did with the other front-ends:<itemizedlist>
<listitem>
<para><code>configure_ &lt;&lt; no_exception</code>: disables
exception handling</para>
</listitem>
<listitem>
<para><code>configure_ &lt;&lt; no_msg_queue</code> deactivates the
message queue</para>
</listitem>
<listitem>
<para><code>configure_ &lt;&lt; deferred_events</code> manually
enables event deferring</para>
</listitem>
</itemizedlist></para>
<para>Deactivating the first two features and not activating the third if not
needed greatly improves the event dispatching speed of your state machine.
Our <link xlink:href="examples/EumlSimple.cpp">speed testing</link> example
with eUML does this for the best performance.</para>
<para><emphasis role="underline">Important note</emphasis>: As exit pseudo
states are using the message queue to forward events out of a submachine,
the <code>no_message_queue</code> option cannot be used with state machines
containing an exit pseudo state.</para>
</sect2>
<sect2>
<title>Completion / Anonymous transitions</title>
<para>Anonymous transitions (See <command xlink:href="#uml-anonymous">UML
tutorial</command>) are transitions without a named event, which are
therefore triggered immediately when the source state becomes active,
provided a guard allows it. As there is no event, to define such a
transition, simply omit the “+” part of the transition (the event), for
example: </para>
<programlisting>State3 == State4 [always_true] / State3ToState4
State4 [always_true] / State3ToState4 == State3</programlisting>
<para>Please have a look at <link
xlink:href="examples/AnonymousTutorialEuml.cpp">this example</link>,
which implements the <command xlink:href="#anonymous-transitions">previously
defined</command> state machine with eUML.</para>
</sect2>
<sect2>
<title><command xml:id="eUML-internal"/>Internal transitions</title>
<para>Like both other front-ends, eUML supports two ways of defining internal transitions:<itemizedlist>
<listitem>
<para>in the state machine's transition table. In this case, you
need to specify a source state, event, actions and guards but no
target state, which eUML will interpret as an internal
transition, for example this defines a transition internal to
Open, on the event open_close:</para>
<programlisting>Open + open_close [internal_guard1] / internal_action1</programlisting>
<para><link xlink:href="examples/EumlInternal.cpp">A full
example</link> is also provided.</para>
</listitem>
<listitem>
<para>in a state's <code>internal_transition_table</code>. For
example:</para>
<programlisting>BOOST_MSM_EUML_DECLARE_STATE((Open_Entry,Open_Exit),Open_def)
struct Open_impl : public Open_def
{
BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE((
open_close [internal_guard1] / internal_action1
))
};</programlisting>
<para>Notice how we do not need to repeat that the transition
originates from Open as we already are in Open's context. </para>
<para>The <link xlink:href="examples/EumlInternalDistributed.cpp"
>implementation</link> also shows the added bonus offered
for submachines, which can have both the standard
transition_table and an internal_transition_table (which has
higher priority). This makes it easier if you decide to make a
full submachine from a state. It is also slightly faster than
the standard alternative, adding orthogonal regions, because
event dispatching will, if accepted by the internal table, not
continue to the subregions. This gives you a O(1) dispatch
instead of O(number of regions).</para>
</listitem>
</itemizedlist></para>
</sect2>
<sect2>
<title>Other state types</title>
<para>We saw the <command xlink:href="#eUML-build-state">build_state</command>
function, which creates a simple state. Likewise, eUML provides other
state-building macros for other types of states:<itemizedlist>
<listitem>
<para>BOOST_MSM_EUML_TERMINATE_STATE takes the same arguments as
BOOST_MSM_EUML_STATE and defines, well, a terminate
state.</para>
</listitem>
<listitem>
<para>BOOST_MSM_EUML_INTERRUPT_STATE takes the same arguments as
BOOST_MSM_EUML_STATE and defines an interrupt state. However,
the expression argument must contain as first element the event
ending the interruption, for example:
<code>BOOST_MSM_EUML_INTERRUPT_STATE(( end_error /*end
interrupt event*/,ErrorMode_Entry,ErrorMode_Exit
),ErrorMode)</code></para>
</listitem>
<listitem>
<para>BOOST_MSM_EUML_EXIT_STATE takes the same arguments as
BOOST_MSM_EUML_STATE and defines an exit pseudo state. However,
the expression argument must contain as first element the event
propagated from the exit point:
<code>BOOST_MSM_EUML_EXIT_STATE(( event6 /*propagated
event*/,PseudoExit1_Entry,PseudoExit1_Exit
),PseudoExit1)</code></para>
</listitem>
<listitem>
<para>BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE defines an entry pseudo
state. It takes 3 parameters: the region index to be entered is
defined as an int argument, followed by the configuration
expression like BOOST_MSM_EUML_STATE and the state name, so that
<code>BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE(0 /*region
index*/,( SubState2_Entry,SubState2_Exit ),SubState2)</code>
defines an entry state into the first region of a
submachine.</para>
</listitem>
<listitem>
<para>BOOST_MSM_EUML_ENTRY_STATE defines an entry pseudo state. It
takes 3 parameters: the region index to be entered is defined as
an int argument, followed by the configuration expression like
BOOST_MSM_EUML_STATE and the state name, so that
<code>BOOST_MSM_EUML_ENTRY_STATE(0,(
PseudoEntry1_Entry,PseudoEntry1_Exit ),PseudoEntry1)</code>
defines a pseudo entry state into the first region of a
submachine.</para>
</listitem>
</itemizedlist></para>
<para>To use these states in the transition table, eUML offers the functions
<code>explicit_</code>, <code>exit_pt_</code> and
<code>entry_pt_</code>. For example, a direct entry into the substate
SubState2 from SubFsm2 could be:</para>
<programlisting>explicit_(SubFsm2,SubState2) == State1 + event2</programlisting>
<para>Forks being a list on direct entries, eUML supports a logical syntax
(state1, state2, ...), for example:</para>
<programlisting>(explicit_(SubFsm2,SubState2),
explicit_(SubFsm2,SubState2b),
explicit_(SubFsm2,SubState2c)) == State1 + event3 </programlisting>
<para>An entry point is entered using the same syntax as explicit entries:
<programlisting>entry_pt_(SubFsm2,PseudoEntry1) == State1 + event4</programlisting></para>
<para>For exit points, it is again the same syntax except that exit points are
used as source of the transition:
<programlisting>State2 == exit_pt_(SubFsm2,PseudoExit1) + event6 </programlisting></para>
<para>The <link xlink:href="examples/DirectEntryEuml.cpp">entry tutorial</link>
is also available with eUML.</para>
</sect2>
<sect2>
<title>Helper functions</title>
<para>We saw a few helpers but there are more, so let us have a more complete description:<itemizedlist>
<listitem>
<para>event_ : used inside any action, the event triggering the
transition</para>
</listitem>
<listitem>
<para>state_: used inside entry and exit actions, the entered /
exited state</para>
</listitem>
<listitem>
<para>source_: used inside a transition action, the source
state</para>
</listitem>
<listitem>
<para>target_: used inside a transition action, the target
state</para>
</listitem>
<listitem>
<para>fsm_: used inside any action, the (deepest-level) state
machine processing the transition</para>
</listitem>
<listitem>
<para>These objects can also be used as a function and return an
attribute, for example event_(cd_name)</para>
</listitem>
<listitem>
<para>Int_&lt;int value>: a functor representing an int</para>
</listitem>
<listitem>
<para>Char_&lt;value>: a functor representing a char</para>
</listitem>
<listitem>
<para>Size_t_&lt;value>: a functor representing a size_t</para>
</listitem>
<listitem>
<para>True_ and False_ functors returning true and false
respectively</para>
</listitem>
<listitem>
<para>String_&lt;mpl::string> (boost >= 1.40): a functor
representing a string.</para>
</listitem>
<listitem>
<para>if_then_else_(guard, action, action) where action can be an
action sequence</para>
</listitem>
<listitem>
<para>if_then_(guard, action) where action can be an action
sequence</para>
</listitem>
<listitem>
<para>while_(guard, action) where action can be an action
sequence</para>
</listitem>
<listitem>
<para>do_while_(guard, action) where action can be an action
sequence</para>
</listitem>
<listitem>
<para>for_(action, guard, action, action) where action can be an
action sequence</para>
</listitem>
<listitem>
<para>process_(some_event [, some state machine] [, some state
machine] [, some state machine] [, some state machine]) will
call process_event (some_event) on the current state machine or
on the one(s) passed as 2nd , 3rd, 4th, 5th argument. This allow
sending events to several external machines</para>
</listitem>
<listitem>
<para>process2_(some_event,Value [, some state machine] [, some
state machine] [, some state machine]) will call process_event
(some_event(Value)) on the current state machine or on the
one(s) passed as 3rd, 4th, 5th argument</para>
</listitem>
<listitem>
<para>is_ flag_(some_flag[, some state machine]) will call
is_flag_active on the current state machine or on the one passed
as 2nd argument</para>
</listitem>
<listitem>
<para>Predicate_&lt;some predicate>: Used in STL algorithms. Wraps
unary/binary functions to make them eUML-compatible so that they
can be used in STL algorithms</para>
</listitem>
</itemizedlist></para>
<para>This can be quite fun. For example, </para>
<programlisting>/( if_then_else_(--fsm_(m_SongIndex) > Int_&lt;0>(),/*if clause*/
show_playing_song, /*then clause*/
(fsm_(m_SongIndex)=Int_&lt;1>(),process_(EndPlay))/*else clause*/
)
)</programlisting>
<para>means: if (fsm.SongIndex > 0, call show_playing_song else
{fsm.SongIndex=1; process EndPlay on fsm;}</para>
<para>A few examples are using these features:<itemizedlist>
<listitem>
<para>the iPod example introduced at the BoostCon09 <link
xlink:href="examples/iPodEuml.cpp">has been rewritten</link>
with eUML (weak compilers please move on...)</para>
</listitem>
<listitem>
<para>the iPodSearch example also introduced at the BoostCon09 <link
xlink:href="examples/iPodSearchEuml.cpp">has been
rewritten</link> with eUML. In this example, you will also
find some examples of STL functor usage.</para>
</listitem>
<listitem>
<para><link xlink:href="examples/SimpleTimer.cpp">A simpler
timer</link> example is a good starting point. </para>
</listitem>
</itemizedlist></para>
<para>There is unfortunately a small catch. Defining a functor using
MSM_EUML_METHOD or MSM_EUML_FUNCTION will create a correct functor. Your own
eUML functors written as described at the beginning of this section will
also work well, <emphasis role="underline">except</emphasis>, for the
moment, with the while_, if_then_, if_then_else_ functions.</para>
</sect2>
<sect2>
<title>Phoenix-like STL support</title>
<para>eUML supports most C++ operators (except address-of). For example it is
possible to write event_(some_attribute)++ or [source_(some_bool) &amp;&amp;
fsm_(some_other_bool)]. But a programmer needs more than operators in his
daily programming. The STL is clearly a must have. Therefore, eUML comes in
with a lot of functors to further reduce the need for your own functors for
the transition table. For almost every algorithm or container method of the
STL, a corresponding eUML function is defined. Like Boost.Phoenix, “.” And
“->” of call on objects are replaced by a functional programming paradigm,
for example:<itemizedlist>
<listitem>
<para>begin_(container), end_(container): return iterators of a
container.</para>
</listitem>
<listitem>
<para>empty_(container): returns container.empty()</para>
</listitem>
<listitem>
<para>clear_(container): container.clear()</para>
</listitem>
<listitem>
<para>transform_ : std::transform</para>
</listitem>
</itemizedlist></para>
<para>In a nutshell, almost every STL method or algorithm is matched by a
corresponding functor, which can then be used in the transition table or
state actions. The <link xlink:href="#Reference-begin">reference</link>
lists all eUML functions and the underlying functor (so that this
possibility is not reserved to eUML but also to the functor-based
front-end). The file structure of this Phoenix-like library matches the one
of Boost.Phoenix. All functors for STL algorithms are to be found in:</para>
<programlisting>#include &lt;msm/front/euml/algorithm.hpp></programlisting>
<para>The algorithms are also divided into sub-headers, matching the phoenix
structure for simplicity:</para>
<programlisting>#include &lt; msm/front/euml/iteration.hpp>
#include &lt; msm/front/euml/transformation.hpp>
#include &lt; msm/front/euml/querying.hpp> </programlisting>
<para>Container methods can be found in:</para>
<programlisting>#include &lt; msm/front/euml/container.hpp></programlisting>
<para>Or one can simply include the whole STL support (you will also need to
include euml.hpp):</para>
<programlisting>#include &lt; msm/front/euml/stl.hpp></programlisting>
<para>A few examples (to be found in <link
xlink:href="examples/iPodSearchEuml.cpp">this tutorial</link>):<itemizedlist>
<listitem>
<para><code>push_back_(fsm_(m_tgt_container),event_(m_song))</code>:
the state machine has an attribute m_tgt_container of type
std::vector&lt;OneSong> and the event has an attribute m_song of
type OneSong. The line therefore pushes m_song at the end of
m_tgt_container</para>
</listitem>
<listitem>
<para><code>if_then_( state_(m_src_it) !=
end_(fsm_(m_src_container)),
process2_(OneSong(),*(state_(m_src_it)++)) )</code>: the
current state has an attribute m_src_it (an iterator). If this
iterator != fsm.m_src_container.end(), process OneSong on fsm,
copy-constructed from state.m_src_it which we
post-increment</para>
</listitem>
</itemizedlist></para>
</sect2>
</sect1>
<sect1>
<title>Back-end</title>
<para>There is, at the moment, one back-end. This back-end contains the library
engine and defines the performance and functionality trade-offs. The currently
available back-end implements most of the functionality defined by the UML 2.0
standard at very high runtime speed, in exchange for longer compile-time. The
runtime speed is due to a constant-time double-dispatch and self-adapting
capabilities allowing the framework to adapt itself to the features used by a
given concrete state machine. All unneeded features either disable themselves or
can be manually disabled. See section 5.1 for a complete description of the
run-to-completion algorithm.</para>
<sect2>
<title>Creation </title>
<para>MSM being divided between front and back-end, one needs to first define a
front-end. Then, to create a real state machine, the back-end must be
declared:
<programlisting>typedef msm::back::state_machine&lt;my_front_end> my_fsm;</programlisting></para>
<para>We now have a fully functional state machine type. The next sections will
describe what can be done with it.</para>
</sect2>
<sect2>
<title><command xml:id="backend-start"/>Starting a state machine</title>
<para>The <code>start</code> method starts the state machine, meaning it will
activate the initial state, which means in turn that the initial state's
entry behavior will be called. We need the start method because you do not
always want the entry behavior of the initial state to be called immediately
but only when your state machine is ready to process events. A good example
of this is when you use a state machine to write an algorithm and each loop
back to the initial state is an algorithm call. Each call to start will make
the algorithm run once. The <link xlink:href="examples/iPodSearch.cpp"
>iPodSearch</link> example uses this possibility.</para>
</sect2>
<sect2>
<title>Event dispatching</title>
<para>The main reason to exist for a state machine is to dispatch events. For
MSM, events are objects of a given event type. The object itself can contain
data, but the event type is what decides of the transition to be taken. For
MSM, if some_event is a given type (a simple struct for example) and e1 and
e2 concrete instances of some_event, e1 and e2 are equivalent, from a
transition perspective. Of course, e1 and e2 can have different values and
you can use them inside actions. Events are dispatched as const reference,
so actions cannot modify events for obvious side-effect reasons. To dispatch
an event of type some_event, you can simply create one on the fly or
instantiate if before processing: </para>
<programlisting>my_fsm fsm; fsm.process_event(some_event());
some_event e1; fsm.process_event(e1)</programlisting>
<para>Creating an event on the fly will be optimized by the compiler so the
performance will not degrade.</para>
</sect2>
<sect2>
<title>Active state(s)</title>
<para>The backend also offers a way to know which state is active, though you
will normally only need this for debugging purposes. If what you need simply
is doing something with the active state, <command
xlink:href="#UML-internal-transition">internal transitions</command> or
<command xlink:href="#backend-visitor">visitors</command> are a better
alternative. If you need to know what state is active, const int*
current_state() will return an array of state ids. Please refer to the
<command xlink:href="#internals-state-id">internals section</command> to
know how state ids are generated.</para>
</sect2>
<sect2>
<title><command xml:id="back-end-serialization"/>Serialization</title>
<para>A common need is the ability to save a state machine and restore it at a
different time. MSM supports this feature for the basic and functor
front-ends, and in a more limited manner for eUML. MSM supports
boost::serialization out of the box (by offering a <code>serialize</code>
function). Actually, for basic serialization, you need not do much, a MSM
state machine is serializable almost like any other type. Without any
special work, you can make a state machine remember its state, for
example:</para>
<para>
<programlisting>MyFsm fsm;
// write to archive
std::ofstream ofs("fsm.txt");
// save fsm to archive
{
boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa &lt;&lt; fsm;
} </programlisting>
</para>
<para>Loading back is very similar:</para>
<para>
<programlisting>MyFsm fsm;
{
// create and open an archive for input
std::ifstream ifs("fsm.txt");
boost::archive::text_iarchive ia(ifs);
// read class state from archive
ia >> fsm;
} </programlisting>
</para>
<para>This will (de)serialize the state machine itself but not the concrete
states' data. This can be done on a per-state basis to reduce the amount of
typing necessary. To allow serialization of a concrete state, provide a
do_serialize typedef and implement the serialize function:</para>
<para>
<programlisting>struct Empty : public msm::front::state&lt;>
{
// we want Empty to be serialized. First provide the typedef
typedef int do_serialize;
// then implement serialize
template&lt;class Archive>
void serialize(Archive &amp; ar, const unsigned int /* version */)
{
ar &amp; some_dummy_data;
}
Empty():some_dummy_data(0){}
int some_dummy_data;
}; </programlisting>
</para>
<para>You can also serialize data contained in the front-end class. Again, you
need to provide the typedef and implement serialize:</para>
<para>
<programlisting>struct player_ : public msm::front::state_machine_def&lt;player_>
{
//we might want to serialize some data contained by the front-end
int front_end_data;
player_():front_end_data(0){}
// to achieve this, provide the typedef
typedef int do_serialize;
// and implement serialize
template&lt;class Archive>
void serialize(Archive &amp; ar, const unsigned int )
{
ar &amp; front_end_data;
}
...
}; </programlisting>
</para>
<para>The saving of the back-end data (the current state(s)) is valid for all
front-ends, so a front-end written using eUML can be serialized. However, to
serialize a concrete state, the macros like
<code>BOOST_MSM_EUML_STATE</code> cannot be used, so the state will have
to be implemented by directly inheriting from
<code>front::euml::euml_state</code>.</para>
<para>The only limitiation is that the event queues cannot be serialized so
serializing must be done in a stable state, when no event is being
processed. You can serialize during event processing only if using no queue
(deferred or event queue).</para>
<para>This <link
xlink:href="examples/Serialize.cpp">example</link> shows a state machine which we serialize after processing an
event. The <code>Empty</code> state also has some data to serialize.</para>
</sect2>
<sect2>
<title><command xml:id="backend-base-state"/>Base state type </title>
<para>Sometimes, one needs to customize states to avoid repetition and provide a
common functionality, for example in the form of a virtual method. You might
also want to make your states polymorphic so that you can call typeid on
them for logging or debugging. It is also useful if you need a visitor, like
the next section will show. You will notice that all front-ends offer the
possibility of adding a base type. Note that all states and state machines
must have the same base state, so this could reduce reuse. For example,
using the basic front end, you need to:<itemizedlist>
<listitem>
<para>Add the non-default base state in your msm::front::state&lt;>
definition, as first template argument (except for
interrupt_states for which it is the second argument, the first
one being the event ending the interrupt), for example,
my_base_state being your new base state for all states in a
given state machine:
<programlisting>struct Empty : public msm::front::state&lt;my_base_state></programlisting>
Now, my_base_state is your new base state. If it has a virtual
function, your states become polymorphic. MSM also provides a
default polymorphic base type,
<code>msm::front::polymorphic_state</code>
</para>
</listitem>
<listitem>
<para>Add the user-defined base state in the state machine frontend
definition, as a second template argument, for example:
<programlisting>struct player_ : public msm::front::state_machine&lt;player_,my_base_state> </programlisting></para>
</listitem>
</itemizedlist></para>
<para>You can also ask for a state with a given id (which you might have gotten
from current_state()) using <code>const base_state* get_state_by_id(int id)
const</code> where base_state is the one you just defined. You can now
do something polymorphically.</para>
</sect2>
<sect2>
<title><command xml:id="backend-visitor"/>Visitor</title>
<para>In some cases, having a pointer-to-base of the currently active states is
not enough. You might want to call non-virtually a method of the currently
active states. It will not be said that MSM forces the virtual keyword down
your throat!</para>
<para>To achieve this goal, MSM provides its own variation of a visitor pattern
using the previously described user-defined state technique. If you add to
your user-defined base state an <code>accept_sig</code> typedef giving the
return value (unused for the moment) and parameters and provide an accept
method with this signature, calling visit_current_states will cause accept
to be called on the currently active states. Typically, you will also want
to provide an empty default accept in your base state in order in order not
to force all your states to implement accept. For example your base state
could be:</para>
<programlisting>struct my_visitable_state
{
// signature of the accept function
typedef args&lt;void> accept_sig;
// we also want polymorphic states
virtual ~my_visitable_state() {}
// default implementation for states who do not need to be visited
void accept() const {}
};</programlisting>
<para>This makes your states polymorphic and visitable. In this case, accept is
made const and takes no argument. It could also be:</para>
<programlisting>struct SomeVisitor {…};
struct my_visitable_state
{
// signature of the accept function
typedef args&lt;void,SomeVisitor&amp;> accept_sig;
// we also want polymorphic states
virtual ~my_visitable_state() {}
// default implementation for states who do not need to be visited
void accept(SomeVisitor&amp;) const {}
};</programlisting>
<para>And now, <code>accept</code> will take one argument (it could also be
non-const). By default, <code>accept</code> takes up to 2 arguments. To get
more, set #define BOOST_MSM_VISITOR_ARG_SIZE to another value before
including state_machine.hpp. For example:</para>
<programlisting>#define BOOST_MSM_VISITOR_ARG_SIZE 3
#include &lt;boost/msm/back/state_machine.hpp></programlisting>
<para>Note that accept will be called on ALL active states <emphasis
role="underline">and also automatically on sub-states of a
submachine</emphasis>.</para>
<para><emphasis role="underline">Important warning</emphasis>: The method
visit_current_states takes its parameter by value, so if the signature of
the accept function is to contain a parameter passed by reference, pass this
parameter with a boost:ref/cref to avoid undesired copies or slicing. So,
for example, in the above case, call:</para>
<programlisting>SomeVisitor vis; sm.visit_current_states(boost::ref(vis));</programlisting>
<para>This <link xlink:href="examples/SM-2Arg.cpp">example</link> uses a
visiting function with 2 arguments.</para>
</sect2>
<sect2>
<title>Flags</title>
<para>Flags is a MSM-only concept, supported by all front-ends, which base
themselves on the functions: </para>
<programlisting>template &lt;class Flag> bool is_flag_active()
template &lt;class Flag,class BinaryOp> bool is_flag_active()</programlisting>
<para>These functions return true if the currently active state(s) support the
Flag property. The first variant ORs the result if there are several
orthogonal regions, the second one expects OR or AND, for example:</para>
<programlisting>my_fsm.is_flag_active&lt;MyFlag>()
my_fsm.is_flag_active&lt;MyFlag,my_fsm_type::Flag_OR>()</programlisting>
<para>Please refer to the front-ends sections for usage examples.</para>
</sect2>
<sect2>
<title>Getting a state</title>
<para>It is sometimes necessary to have the client code get access to the
states' data. After all, the states are created once for good and hang
around as long as the state machine does so why not use it? You simply just
need sometimes to get information about any state, even inactive ones. An
example is if you want to write a coverage tool and know how many times a
state was visited. To get a state, use the get_state method giving the state
name, for example: </para>
<programlisting>player::Stopped* tempstate = p.get_state&lt;player::Stopped*>();</programlisting>
<para> or </para>
<programlisting>player::Stopped&amp; tempstate2 = p.get_state&lt;player::Stopped&amp;>();</programlisting>
<para>depending on your personal taste. </para>
</sect2>
<sect2>
<title><command xml:id="backend-fsm-constructor-args"/> State machine constructor with arguments </title>
<para>You might want to define a state machine with a non-default constructor.
For example, you might want to write: </para>
<programlisting>struct player_ : public msm::front::state_machine_def&lt;player_>
{
player_(int some_value){…}
}; </programlisting>
<para>This is possible, using the back-end as forwarding object: </para>
<programlisting>typedef msm::back::state_machine&lt;player_ > player; player p(3);</programlisting>
<para>The back-end will call the corresponding front-end constructor upon
creation.</para>
<para>You can pass arguments up to the value of the
BOOST_MSM_CONSTRUCTOR_ARG_SIZE macro (currently 5) arguments. Change this
value before including any header if you need to overwrite the default. </para>
<para>You can also pass arguments by reference (or const-reference) using
boost::ref (or boost::cref):</para>
<programlisting>struct player_ : public msm::front::state_machine_def&lt;player_>
{
player_(SomeType&amp; t, int some_value){…}
};
typedef msm::back::state_machine&lt;player_ > player;
SomeType data;
player p(boost::ref(data),3);
</programlisting>
<para>Normally, MSM default-constructs all its states or submachines. There are
however cases where you might not want this. An example is when you use a
state machine as submachine, and this submachine used the above defined
constructors. You can add as first argument of the state machine constructor
an expression where existing states are passed and copied:</para>
<programlisting>player p( back::states_ &lt;&lt; state_1 &lt;&lt; ... &lt;&lt; state_n , boost::ref(data),3);</programlisting>
<para>Where state_1..n are instances of some or all of the states of the state
machine. Submachines being state machines, this can recurse, for example, if
Playing is a submachine containing a state Song1 having itself a constructor
where some data is passed:</para>
<programlisting>player p( back::states_ &lt;&lt; Playing(back::states_ &lt;&lt; Song1(some_Song1_data)) ,
boost::ref(data),3);</programlisting>
<para>It is also possible to replace a given state by a new instance at any time
using <code>set_states()</code> and the same syntax, for example:
<programlisting>p.set_states( back::states_ &lt;&lt; state_1 &lt;&lt; ... &lt;&lt; state_n );</programlisting></para>
<para>An <link xlink:href="examples/Constructor.cpp"
>example</link> making intensive use of this capability is provided.</para>
</sect2>
<sect2>
<title><command xml:id="backend-tradeof-rt-ct"/>Trading run-time speed for
better compile-time / multi-TU compilation</title>
<para>MSM is optimized for run-time speed at the cost of longer compile-time.
This can become a problem with older compilers and big state machines,
especially if you don't really care about run-time speed that much and would
be satisfied by a performance roughly the same as most state machine
libraries. MSM offers a back-end policy to help there. But before you try
it, if you are using a VC compiler, deactivate the /Gm compiler option
(default for debug builds). This option can cause builds to be 3 times
longer... If the compile-time still is a problem, read further. MSM offers a
policy which will speed up compiling in two main cases:<itemizedlist>
<listitem>
<para>many transition conflicts</para>
</listitem>
<listitem>
<para>submachines</para>
</listitem>
</itemizedlist></para>
<para>The back-end <code>msm::back::state_machine</code> has a third template
argument (first is the front-end, second is the history policy) defaulting
to <code>favor_runtime_speed</code>. To switch to
<code>favor_compile_time</code>, which is declared in
<code>&lt;msm/back/favor_compile_time.hpp></code>, you need to:<itemizedlist>
<listitem>
<para>switch the policy to <code>favor_compile_time</code> for the
main state machine (and possibly submachines)</para>
</listitem>
<listitem>
<para>move the submachine declarations into their own header which
includes
<code>&lt;msm/back/favor_compile_time.hpp></code></para>
</listitem>
<listitem>
<para>add for each submachine a cpp file including your header and
calling a macro, which generates helper code, for
example:</para>
<programlisting>#include "mysubmachine.hpp"
BOOST_MSM_BACK_GENERATE_PROCESS_EVENT(mysubmachine)</programlisting>
</listitem>
<listitem>
<para>configure your compiler for multi-core compilation</para>
</listitem>
</itemizedlist></para>
<para>You will now compile your state machine on as many cores as you have
submachines, which will greatly speed up the compilation if you factor your
state machine into smaller submachines.</para>
<para>Independently, transition conflicts resolution will also be much
faster.</para>
<para>This policy uses boost.any behind the hood, which means that we will lose
one feature which MSM offers with the default policy, <link
xlink:href="#event-hierarchy">event hierarchy</link>. The following
example takes our iPod example and speeds up compile-time by using this
technique. We have:<itemizedlist>
<listitem>
<para><link xlink:href="examples/iPod_distributed/iPod.cpp">our main
state machine and main function</link></para>
</listitem>
<listitem>
<para><link xlink:href="examples/iPod_distributed/PlayingMode.hpp"
>PlayingMode moved to a separate header</link></para>
</listitem>
<listitem>
<para><link xlink:href="examples/iPod_distributed/PlayingMode.cpp">a
cpp for PlayingMode</link></para>
</listitem>
<listitem>
<para><link xlink:href="examples/iPod_distributed/MenuMode.hpp"
>MenuMode moved to a separate header</link></para>
</listitem>
<listitem>
<para><link xlink:href="examples/iPod_distributed/MenuMode.cpp">a
cpp for MenuMode</link></para>
</listitem>
<listitem>
<para><link xlink:href="examples/iPod_distributed/Events.hpp">events
move to a separate header as all machines use
it</link></para>
</listitem>
</itemizedlist>
</para>
</sect2>
</sect1>
</chapter>
<chapter>
<title> Performance / Compilers</title>
<para>Tests were made on different PCs running Windows XP and Vista and compiled with
VC9 SP1 or Ubuntu and compiled with g++ 4.2 and 4.3. For these tests, the same
player state machine was written using Boost.Statechart, as a <link
xlink:href="examples/SCSimple.cpp">state machine with only simple states</link>
and as a <link xlink:href="examples/SCComposite.cpp">state machine with a composite
state</link>. The same simple and composite state machines are implemented with
MSM with a standard frontend <link xlink:href="examples/MsmSimple.cpp"
>(simple)</link><link xlink:href="examples/MsmComposite.cpp">(composite)</link>,
the simple one also with <link xlink:href="examples/MsmSimpleFunctors.cpp"
>functors</link> and with <link xlink:href="examples/EumlSimple.cpp"
>eUML</link>. As these simple machines need no terminate/interrupt states, no
message queue and have no-throw guarantee on their actions, the MSM state machines
are defined with minimum functionality. Test machine is a Q6600 2.4GHz, Vista
64.</para>
<sect1>
<title>Speed</title>
<para>VC9:<itemizedlist>
<listitem>
<para>The simple test completes 90 times faster with MSM than with
Boost.Statechart</para>
</listitem>
<listitem>
<para>The composite test completes 25 times faster with MSM</para>
</listitem>
</itemizedlist></para>
<para>gcc 4.2.3 (Ubuntu 8.04 in VMWare, same PC):<itemizedlist>
<listitem>
<para>The simple test completes 46 times faster with MSM</para>
</listitem>
<listitem>
<para>The composite test completes 19 times faster with Msm</para>
</listitem>
</itemizedlist></para>
</sect1>
<sect1>
<title>Executable size</title>
<para>There are some worries that MSM generates huge code. Is it true? The 2
compilers I tested disagree with this claim. On VC9, the test state machines
used in the performance section produce executables of 14kB (for simple and
eUML) and 21kB (for the composite). This includes the test code and iostreams.
By comparison, an empty executable with iostreams generated by VC9 has a size of
7kB. Boost.Statechart generates executables of 43kB and 54kB. As a bonus, eUML
comes for “free” in terms of executable size. You even get a speed gain. With
g++ 4.3, it strongly depends on the compiler options (much more than VC). A good
size state machine with –O3 can generate an executable of 600kB, and with eUML
you can get to 1.5MB. Trying with –Os –s I come down to 18kB and 30kB for the
test state machines, while eUML will go down to 1MB (which is still big), so in
this case eUML does not come for free.</para>
</sect1>
<sect1>
<title>Supported compilers</title>
<para>For a current status, have a look at the <link
xlink:href="http://www.boost.org/development/tests/trunk/developer/msm.html"
>regression tests</link>.</para>
<para>MSM was successfully tested with: <itemizedlist>
<listitem>
<para>VC8 (partly), VC9, VC10</para>
</listitem>
<listitem>
<para>g++ 4.0.1 and higher</para>
</listitem>
<listitem>
<para>Intel 10.1 and higher</para>
</listitem>
<listitem>
<para>Clang 2.9</para>
</listitem>
<listitem>
<para>Green Hills Software MULTI for ARM v5.0.5 patch 4416 (Simple and
Composite tutorials)</para>
</listitem>
<listitem>
<para>Partial support for IBM compiler</para>
</listitem>
</itemizedlist></para>
<para>VC8 and to some lesser extent VC9 suffer from a bug. Enabling the option
"Enable Minimal Rebuild" (/Gm) will cause much higher compile-time (up to three
times with VC8!). This option being activated per default in Debug mode, this
can be a big problem.</para>
</sect1>
<sect1>
<title> Limitations </title>
<para>
<itemizedlist>
<listitem>
<para>Compilation times of state machines with > 80 transitions that are
going to make you storm the CFO's office and make sure you get a
shiny octocore with 12GB RAM by next week, unless he's interested in
paying you watch the compiler agonize for hours... (Make sure you
ask for dual 24" as well, it doesn't hurt).</para>
</listitem>
<listitem>
<para>eUML allows very long constructs but will also quickly increase
your compile time on some compilers (VC9, VC10) with buggy decltype
support (I suspect some at least quadratic algorithms there). Even
g++ 4.4 shows some regression compared to 4.3 and will crash if the
constructs become too big.</para>
</listitem>
<listitem>
<para>Need to overwrite the mpl::vector/list default-size-limit of 20
and fusion default vector size of 10 if more than 10 states found in
a state machine</para>
</listitem>
</itemizedlist>
</para>
</sect1>
<sect1>
<title> Compilers corner </title>
<para>Compilers are sometimes full of surprises and such strange errors happened in
the course of the development that I wanted to list the most fun for readers’
entertainment.</para>
<para><emphasis role="underline">VC8</emphasis>: </para>
<programlisting>template &lt;class StateType>
typename ::boost::enable_if&lt;
typename ::boost::mpl::and_&lt;
typename ::boost::mpl::not_&lt;
typename has_exit_pseudo_states&lt;StateType>::type
>::type,
typename ::boost::mpl::not_&lt;
typename is_pseudo_exit&lt;StateType>::type
>::type
>::type,
BaseState*>::type </programlisting>
<para>I get the following error:</para>
<para>error C2770: invalid explicit template argument(s) for '`global
namespace'::boost::enable_if&lt;...>::...' </para>
<para>If I now remove the first “::” in ::boost::mpl , the compiler shuts up. So in
this case, it is not possible to follow Boost’s guidelines.</para>
<para><emphasis role="underline">VC9</emphasis>:<itemizedlist>
<listitem>
<para>This one is my all times’ favorite. Do you know why the exit
pseudo states are referenced in the transition table with a
“submachine::exit_pt” ? Because “exit” will crash the compiler.
“Exit” is not possible either because it will crash the compiler on
one machine, but not on another (the compiler was installed from the
same disk).</para>
</listitem>
<listitem>
<para>Sometimes, removing a policy crashes the compiler, so some
versions are defining a dummy policy called WorkaroundVC9.</para>
</listitem>
<listitem>
<para>Typeof: While g++ and VC9 compile “standard” state machines in
comparable times, Typeof (while in both ways natively supported)
seems to behave in a quadratic complexity with VC9 and VC10.</para>
</listitem>
<listitem>
<para>eUML: in case of a compiler crash, changing the order of state
definitions (first states without entry or exit) sometimes solves
the problem.</para>
</listitem>
</itemizedlist></para>
<para><emphasis role="underline">g++ 4.x</emphasis>: Boring compiler, almost all is
working almost as expected. Being not a language lawyer I am unsure about the
following “Typeof problem”. VC9 and g++ disagree on the question if you can
derive from the BOOST_TYPEOF generated type without first defining a typedef. I
will be thankful for an answer on this. I only found two ways to break the compiler:<itemizedlist>
<listitem>
<para>Add more eUML constructs until something explodes (especially with
g++-4.4) </para>
</listitem>
<listitem>
<para>The build_terminate function uses 2 mpl::push_back instead of
mpl::insert_range because g++ would not accept insert_range.</para>
</listitem>
</itemizedlist></para>
<para>You can test your compiler’s decltype implementation with the <link
xlink:href="examples/CompilerStressTestEuml.cpp">following stress
test</link> and reactivate the commented-out code until the compiler
crashes.</para>
</sect1>
</chapter>
<chapter>
<title>Questions &amp; Answers</title>
<para><emphasis role="underline">Question</emphasis>: on_entry gets as argument, the
sent event. What event do I get when the state becomes default-activated (because it
is an initial state)?</para>
<para>
<emphasis role="underline">Answer</emphasis>: To allow you to know that the state
was default-activated, MSM generates a boost::msm::InitEvent default event. </para>
<para><emphasis role="underline">Question</emphasis>: Why do I see no call to
no_transition in my submachine? </para>
<para><emphasis role="underline">Answer</emphasis>: Because of the priority rule defined
by UML. It says that in case of transition conflict, the most inner state has a
higher priority. So after asking the inner state, the containing composite has to be
also asked to handle the transition and could find a possible transition.</para>
<para><emphasis role="underline">Question</emphasis>: Why do I get a compile error
saying the compiler cannot convert to a function ...Fsm::*(some_event)? </para>
<para><emphasis role="underline">Answer</emphasis>: You probably defined a transition
triggered by the event some_event, but used a guard/action method taking another
event. </para>
<para><emphasis role="underline">Question</emphasis>: Why do I get a compile error
saying something like “too few” or “too many” template arguments? </para>
<para><emphasis role="underline">Answer</emphasis>: You probably defined a transition in
form of a a_row or g_row where you wanted just a _row or the other way around. With
Row, it could mean that you forgot a "none". </para>
<para><emphasis role="underline">Question</emphasis>: Why do I get a very long compile
error when I define more than 20 rows in the transition table? </para>
<para><emphasis role="underline">Answer</emphasis>: MSM uses Boost.MPL under the hood
and this is the default maximum size. Please define the following 3 macros before
including any MSM headers: </para>
<programlisting>#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
#define BOOST_MPL_LIMIT_VECTOR_SIZE 30 // or whatever you need
#define BOOST_MPL_LIMIT_MAP_SIZE 30 // or whatever you need </programlisting>
<para><emphasis role="underline">Question</emphasis>: Why do I get this error: ”error
C2977: 'boost::mpl::vector' : too many template arguments”? </para>
<para><emphasis role="underline">Answer</emphasis>: The first possibility is that you
defined a transition table as, say, vector17 and have 18 entries. The second is that
you have 17 entries and have a composite state. Under the hood, MSM adds a row for
every event in the composite transition table. The third one is that you used a
mpl::vector without the number of entries but are close to the MPL default of 50 and
have a composite, thus pushing you above 50. Then you need mpl/vector60/70….hpp and
a mpl/map60/70….hpp </para>
<para><emphasis role="underline">Question</emphasis>: Why do I get a very long compile
error when I define more than 10 states in a state machine? </para>
<para><emphasis role="underline">Answer</emphasis>: MSM uses Boost.Fusion under the hood
and this is the default maximum size. Please define the following macro before
including any MSM headers: </para>
<programlisting>#define FUSION_MAX_VECTOR_SIZE 20 // or whatever you need </programlisting>
</chapter>
<chapter>
<title>Internals</title>
<para>This chapter describes the internal machinery of the back-end, which can be useful
for UML experts but can be safely ignored for most users. For implementers, the
interface between front- and back- end is also described in detail.</para>
<sect1>
<title><command xml:id="run-to-completion"/>Backend: Run To Completion</title>
<para>The back-end implements the following run-to completion algorithm:<itemizedlist>
<listitem>
<para>Check if one region of the concrete state machine is in a
terminate or interrupt state. If yes, event processing is disabled
while the condition lasts (forever for a terminate pseudo-state,
while active for an interrupt pseudo-state).</para>
</listitem>
<listitem>
<para>If the message queue feature is enabled and if the state machine
is already processing an event, push the currently processed event
into the queue and end processing. Otherwise, remember that the
state machine is now processing an event and continue.</para>
</listitem>
<listitem>
<para>If the state machine detected that no deferred event is used, skip
this step. Otherwise, mark the first deferred event from the
deferred queue as active.</para>
</listitem>
<listitem>
<para>Now start the core of event dispatching. If exception handling is
activated, this will happen inside a try/catch block and the
front-end <code>exception_caught</code> is called if an exception
occurs. </para>
</listitem>
<listitem>
<para>The event is now dispatched in turn to every region, in the order
defined by the initial state front-end definition. This will, for
every region, call the corresponding front-end transition definition
(the "row" or "Row" of the transition table).</para>
</listitem>
<listitem>
<para>Without transition conflict, if for a given region a transition is
possible, the guard condition is checked. If it returns
<code>true</code>, the transition processing continues and the
current state's exit action is called, followed by the transition
action behavior and the new active state's entry behavior.</para>
</listitem>
<listitem>
<para>With transition conflicts (several possible transitions,
disambiguated by mutually exclusive guard conditions), the guard
conditions are tried in reverse order of their transition definition
in the transition table. The first one returning <code>true</code>
selects its transition. Note that this is not defined by the UML
standard, which simply specifies that if the guard conditions are
not mutually exclusive, the state machine is ill-formed and the
behaviour undefined. Relying on this implementation-specific
behaviour will make it harder for the developer to support another
state machine framework.</para>
</listitem>
<listitem>
<para>If at least one region processes the event, this event is seen as
having been accepted. If not, the library calls
<code>no_transition</code> on the state machine for every
contained region.</para>
</listitem>
<listitem>
<para>If the currently active state is a submachine, the behaviour is
slightly different. The UML standard specifies that internal
transitions have to be tried first, so the event is first dispatched
to the submachine. Only if the submachine does not accept the event
are other (non internal) transitions tried.</para>
</listitem>
<listitem>
<para>This back-end supports simple states' and submachines' internal
transitions. These are provided in the state's
<code>internal_transition_table</code> type. Transitions defined
in this table are added at the end of the main state machine's
transition table, but with a lesser priority than the submachine's
transitions (defined in <code>transition_table</code>). This means,
for simple states, that these transitions have higher priority than
non-internal transitions, conform to the UML standard which gives
higher priority to deeper-level transitions. For submachines, this
is a non-standard addition which can help make event processing
faster by giving a chance to bypass subregion processing. With
standard UML, one would need to add a subregion only to process
these internal transitions, which would be slower.</para>
</listitem>
<listitem>
<para>After the dispatching itself, the deferred event marked in step 3
(if any) now gets a chance of processing.</para>
</listitem>
<listitem>
<para>Then, events queued in the message queue also get a dispatching
chance</para>
</listitem>
<listitem>
<para>Finally, completion / anonymous transitions, if to be found in the
transition table, also get their dispatching chance.</para>
</listitem>
</itemizedlist></para>
<para>This algorithm illustrates how the back-end configures itself at compile-time
as much as possible. Every feature not found in a given state machine definition
is deactivated and has therefore no runtime cost. Completion events, deferred
events, terminate states, dispatching to several regions, internal transitions
are all deactivated if not used. User configuration is only for exception
handling and message queue necessary.</para>
</sect1>
<sect1>
<title><command xml:id="internals-front-back-interface"/>Frontend / Backend
interface</title>
<para>The design of MSM tries to make front-ends and back-ends (later) to be as
interchangeable as possible. Of course, no back-end will ever implement every
feature defined by any possible front-end and inversely, but the goal is to make
it as easy as possible to extend the current state of the library.</para>
<para>To achieve this, MSM divides the functionality between both sides: the
front-end is a sort of user interface and is descriptive, the back-end
implements the state machine engine.</para>
<para>MSM being based on a transition table, a concrete state machine (or a given
front-end) must provide a transition_table. This transition table must be made
of rows. And each row must tell what kind of transition it is and implement the
calls to the actions and guards. A state machine must also define its regions
(marked by initial states) And that is about the only constraints for
front-ends. How the rows are described is implementer's choice. </para>
<para>Every row must provide:</para>
<itemizedlist>
<listitem>
<para>A <code>Source</code> typedef indicating, well, the type of the source
state.</para>
</listitem>
<listitem>
<para>A <code>Target</code> typedef indicating, well, the type of the target
state.</para>
</listitem>
<listitem>
<para>A <code>Evt</code> typedef indicating the type of the event triggering
the transition.</para>
</listitem>
<listitem>
<para>A <code>row_type_tag</code> typedef indicating the type of the
transition.</para>
</listitem>
<listitem>
<para>Rows having a type requiring transition actions must provide a static
function <code>action_call</code> with the following signature: <code>
template &lt;class Fsm,class SourceState,class TargetState,class
AllStates> </code></para>
<para><code>static void action_call (Fsm&amp; fsm, Event const&amp; evt,
SourceState&amp;, TargetState&amp;, AllStates&amp;) </code></para>
<para>The function gets as parameters the (back-end) state machine, the
event, source and target states and a container (in the current
back-end, a fusion::set) of all the states defined in the state machine.
For example, as the back-end has the front-end as basic class,
<code>action_call</code> is simply defined as
<code>(fsm.*action)(evt)</code>.</para>
</listitem>
<listitem>
<para>Rows having a type requiring a guard must provide a static function
<code>guard_call</code> with the following signature:<code
> </code></para>
<para><code>template &lt;class Fsm,class SourceState,class TargetState,class
AllStates></code></para>
<para><code>static bool guard_call (Fsm&amp;, Event const&amp;,
SourceState&amp;, TargetState&amp;, AllStates&amp;)</code></para>
</listitem>
<listitem>
<para>The possible transition (row) types are:<itemizedlist>
<listitem>
<para>a_row_tag: a transition with actions and no guard</para>
</listitem>
<listitem>
<para>g_row_type: a transition with a guard and no
actions</para>
</listitem>
<listitem>
<para>_row_tag: a transition without actions or guard</para>
</listitem>
<listitem>
<para>row_tag: a transition with guard and actions</para>
</listitem>
<listitem>
<para>a_irow_tag: an internal transition (defined inside the
<code>transition_table</code>) with actions</para>
</listitem>
<listitem>
<para>g_irow_tag: an internal transition (defined inside the
<code>transition_table</code>) with guard</para>
</listitem>
<listitem>
<para>irow_tag: an internal transition (defined inside the
<code>transition_table</code>) with actions and
guards</para>
</listitem>
<listitem>
<para>_irow_tag: an internal transition (defined inside the
<code>transition_table</code>) without action or guard.
Due to higher priority for internal transitions, this is
equivalent to a "ignore event"</para>
</listitem>
<listitem>
<para>sm_a_i_row_tag: an internal transition (defined inside the
<code>internal_transition_table</code>) with
actions</para>
</listitem>
<listitem>
<para>sm_g_i_row_tag: an internal transition (defined inside the
<code>internal_transition_table</code>) with
guard</para>
</listitem>
<listitem>
<para>sm_i_row_tag: an internal transition (defined inside the
<code>internal_transition_table</code>) with actions and
guards</para>
</listitem>
<listitem>
<para>sm__i_row_tag: an internal transition (defined inside the
<code>internal_transition_table</code>) without action
or guard. Due to higher priority for internal transitions,
this is quivalent to a "ignore event"</para>
</listitem>
</itemizedlist></para>
</listitem>
</itemizedlist>
<para>Furthermore, a front-end must provide the definition of states and state
machines. State machine definitions must provide (the implementer is free to
provide it or let it be done by every concrete state machine. Different MSM
front-ends took one or the other approach):<itemizedlist>
<listitem>
<para><code>initial_state</code>: This typedef can be a single state or
a mpl container and provides the initial states defining one or
several orthogonal regions.</para>
</listitem>
<listitem>
<para><code>transition_table</code>: This typedef is a MPL sequence of
transition rows.</para>
</listitem>
<listitem>
<para><code>configuration</code>: this typedef is a MPL sequence of
known types triggering special behavior in the back-end, for example
if a concrete fsm requires a message queue or exception
catching.</para>
</listitem>
</itemizedlist></para>
<para>States and state machines must both provide a (possibly empty) definition of:<itemizedlist>
<listitem>
<para><code>flag_list</code>: the flags being active when this state or
state machine become the current state of the fsm.</para>
</listitem>
<listitem>
<para><code>deferred_events</code>: events being automatically deferred
when the state is the current state of the fsm.</para>
</listitem>
<listitem>
<para><code>internal_transition_table</code>: the internal transitions
of this state.</para>
</listitem>
<listitem>
<para><code>on_entry</code> and <code>on_exit</code> methods.</para>
</listitem>
</itemizedlist></para>
</sect1>
<sect1>
<title><command xml:id="internals-state-id"/> Generated state ids </title>
<para>Normally, one does not need to know the ids are generated for all the states
of a state machine, unless for debugging purposes, like the pstate function does
in the tutorials in order to display the name of the current state. This section
will show how to automatically display typeid-generated names, but these are not
very readable on all platforms, so it can help to know how the ids are
generated. The ids are generated using the transition table, from the “Start”
column up to down, then from the “Next” column, up to down, as shown in the next
image: </para>
<para><inlinemediaobject>
<imageobject>
<imagedata fileref="images/AnnexA.jpg" width="90%" scalefit="1"/>
</imageobject>
</inlinemediaobject></para>
<para>Stopped will get id 0, Open id 1, ErrorMode id 6 and SleepMode (seen only in
the “Next” column) id 7. If you have some implicitly created states, like
transition-less initial states or states created using the explicit_creation
typedef, these will be added as a source at the end of the transition table. If
you have submachine states, a row will be added for them at the end of the
table, after the automatically or explicitly created states, which can change
their id. The next help you will need for debugging would be to call the
current_state method of the state_machine class, then the display_type helper to
generate a readable name from the id. If you do not want to go through the
transition table to fill an array of names, the library provides another helper,
fill_state_names, which, given an array of sufficient size (please see next
section to know how many states are defined in the state machine), will fill it
with typeid-generated names. </para>
</sect1>
<sect1>
<title>Metaprogramming tools</title>
<para>We can find for the transition table more uses than what we have seen so far.
Let's suppose you need to write a coverage tool. A state machine would be
perfect for such a job, if only it could provide some information about its
structure. Thanks to the transition table and Boost.MPL, it does.</para>
<para>What is needed for a coverage tool? You need to know how many states are
defined in the state machine, and how many events can be fired. This way you can
log the fired events and the states visited in the life of a concrete machine
and be able to perform some coverage analysis, like “fired 65% of all possible
events and visited 80% of the states defined in the state machine”. To achieve
this, MSM provides a few useful tools:<itemizedlist>
<listitem>
<para>generate_state_set&lt;transition table>: returns a mpl::set of all
the states defined in the table.</para>
</listitem>
<listitem>
<para>generate_event_set&lt;transition table>: returns a mpl::set of all
the events defined in the table.</para>
</listitem>
<listitem>
<para>using mpl::size&lt;>::value you can get the number of elements in
the set.</para>
</listitem>
<listitem>
<para>display_type defines an operator() sending typeid(Type).name() to
cout.</para>
</listitem>
<listitem>
<para>fill_state_names fills an array of char const* with names of all
states (found by typeid)</para>
</listitem>
<listitem>
<para>using mpl::for_each on the result of generate_state_set and
generate_event_set passing display_type as argument will display all
the states of the state machine.</para>
</listitem>
<listitem>
<para>let's suppose you need to recursively find the states and events
defined in the composite states and thus also having a transition
table. Calling recursive_get_transition_table&lt;Composite> will
return you the transition table of the composite state, recursively
adding the transition tables of all sub-state machines and
sub-sub...-sub-state machines. Then call generate_state_set or
generate_event_set on the result to get the full list of states and
events. </para>
</listitem>
</itemizedlist></para>
<para> An <link xlink:href="examples/BoostCon09Full.cpp">example</link> shows the
tools in action. </para>
</sect1>
</chapter>
<chapter>
<title>Acknowledgements</title>
<para>I am in debt to the following people who helped MSM along the way.</para>
<sect1>
<title>MSM v2</title>
<para>
<itemizedlist>
<listitem>
<para>Thanks to Dave Abrahams for managing the review</para>
</listitem>
<listitem>
<para>Thanks to Eric Niebler for his patience correcting my grammar
errors</para>
</listitem>
<listitem>
<para>Special thanks to Joel de Guzman who gave me very good ideas at
the BoostCon09. These ideas were the starting point of the redesign.
Any time again, Joel ☺</para>
</listitem>
<listitem>
<para>Thanks to Richard O’Hara for making Green Hills bring a patch in
less than 1 week, thus adding one more compiler to the supported
list.</para>
</listitem>
<listitem>
<para>Big thanks to those who took the time to write a review: Franz
Alt, David Bergman, Michael Caisse, Barend Gehrels, Darryl Greene,
Juraj Ivancic, Erik Nelson, Kenny Riddile.</para>
</listitem>
<listitem>
<para>Thanks to Matt Calabrese, Juraj Ivancic, Adam Merz and Joseph Wu
for reporting bugs.</para>
</listitem>
</itemizedlist>
</para>
</sect1>
<sect1>
<title> MSM v1</title>
<para>
<itemizedlist>
<listitem>
<para>The original version of this framework is based on the brilliant
work of David Abrahams and Aleksey Gurtovoy who laid down the base
and the principles of the framework in their excellent book, “C++
template Metaprogramming”. The implementation also makes heavy use
of the boost::mpl.</para>
</listitem>
<listitem>
<para>Thanks to Jeff Flinn for his idea of the user-defined base state
and his review which allowed MSM to be presented at the
BoostCon09.</para>
</listitem>
<listitem>
<para>Thanks to my MSM v1 beta testers, Christoph Woskowski and Franz
Alt for using the framework with little documentation and to my
private reviewer, Edouard Alligand</para>
</listitem>
</itemizedlist>
</para>
</sect1>
</chapter>
<chapter>
<title>Version history</title>
<sect1>
<title>From V2.10 to V2.12</title>
<para>
<itemizedlist>
<listitem>
<para>Support for <command xlink:href="#back-end-serialization">serialization</command></para>
</listitem>
<listitem>
<para><command xlink:href="#eUML-reuse-functor">Possibility to use
normal functors</command> (from functor front-end) in
eUML.</para>
</listitem>
<listitem>
<para><command xlink:href="#backend-fsm-constructor-args">New constructors</command> where substates / submachines can be taken as
arguments. This allows passing arguments to the constructor of a
submachine.</para>
</listitem>
<listitem>
<para>Bugfixes</para>
</listitem>
</itemizedlist>
</para>
</sect1>
<sect1>
<title>From V2.0 to V2.12</title>
<para>
<itemizedlist>
<listitem>
<para>New documentation</para>
</listitem>
<listitem>
<para>Internal transitions. Either as part of the transition table or
using a state's internal transition table</para>
</listitem>
<listitem>
<para>increased dispatch and copy speed</para>
</listitem>
<listitem>
<para><command xlink:href="#basic-row2">new row types</command> for the
basic front-end</para>
</listitem>
<listitem>
<para>new eUML syntax, better attribute support, macros to ease
developer's life. Even VC8 seems to like it better.</para>
</listitem>
<listitem>
<para>New policy for reduced compile-time at the cost of dispatch
speed</para>
</listitem>
<listitem>
<para>Support for base events</para>
</listitem>
<listitem>
<para>possibility to choose the initial event</para>
</listitem>
</itemizedlist>
</para>
</sect1>
</chapter>
</part>
<part>
<title><command xml:id="Reference-begin"/>Reference</title>
<chapter>
<title>eUML operators and basic helpers</title>
<para>The following table lists the supported operators: </para>
<para>
<table frame="all">
<title>Operators and state machine helpers</title>
<tgroup cols="3">
<colspec colname="c1" colnum="1"/>
<colspec colname="c2" colnum="2"/>
<colspec colname="c3" colnum="3"/>
<thead>
<row>
<entry>eUML function / operator</entry>
<entry>Description</entry>
<entry>Functor</entry>
</row>
</thead>
<tbody>
<row>
<entry>&amp;&amp;</entry>
<entry>Calls lazily Action1&amp;&amp; Action2</entry>
<entry>And_</entry>
</row>
<row>
<entry>||</entry>
<entry>Calls lazily Action1|| Action2</entry>
<entry>Or_</entry>
</row>
<row>
<entry>!</entry>
<entry>Calls lazily !Action1</entry>
<entry>Not_</entry>
</row>
<row>
<entry>!=</entry>
<entry>Calls lazily Action1 != Action2</entry>
<entry>NotEqualTo_</entry>
</row>
<row>
<entry>==</entry>
<entry>Calls lazily Action1 == Action2</entry>
<entry>EqualTo_</entry>
</row>
<row>
<entry>></entry>
<entry>Calls lazily Action1 > Action2</entry>
<entry>Greater_</entry>
</row>
<row>
<entry>>=</entry>
<entry>Calls lazily Action1 >= Action2</entry>
<entry>Greater_Equal_</entry>
</row>
<row>
<entry>&lt;</entry>
<entry>Calls lazily Action1 &lt; Action2</entry>
<entry>Less_</entry>
</row>
<row>
<entry>&lt;=</entry>
<entry>Calls lazily Action1 &lt;= Action2</entry>
<entry>Less_Equal_</entry>
</row>
<row>
<entry>&amp;</entry>
<entry>Calls lazily Action1 &amp; Action2</entry>
<entry>Bitwise_And_</entry>
</row>
<row>
<entry>|</entry>
<entry>Calls lazily Action1 | Action2</entry>
<entry>Bitwise_Or_</entry>
</row>
<row>
<entry>^</entry>
<entry>Calls lazily Action1 ^ Action2</entry>
<entry>Bitwise_Xor_</entry>
</row>
<row>
<entry>--</entry>
<entry>Calls lazily --Action1 / Action1--</entry>
<entry>Pre_Dec_ / Post_Dec_</entry>
</row>
<row>
<entry>++</entry>
<entry>Calls lazily ++Action1 / Action1++</entry>
<entry>Pre_Inc_ / Post_Inc_</entry>
</row>
<row>
<entry>/</entry>
<entry>Calls lazily Action1 / Action2</entry>
<entry>Divides_</entry>
</row>
<row>
<entry>/=</entry>
<entry>Calls lazily Action1 /= Action2</entry>
<entry>Divides_Assign_</entry>
</row>
<row>
<entry>*</entry>
<entry>Calls lazily Action1 * Action2</entry>
<entry>Multiplies_</entry>
</row>
<row>
<entry>*=</entry>
<entry>Calls lazily Action1 *= Action2</entry>
<entry>Multiplies_Assign_</entry>
</row>
<row>
<entry>+ (binary)</entry>
<entry>Calls lazily Action1 + Action2</entry>
<entry>Plus_</entry>
</row>
<row>
<entry>+ (unary)</entry>
<entry>Calls lazily +Action1</entry>
<entry>Unary_Plus_</entry>
</row>
<row>
<entry>+=</entry>
<entry>Calls lazily Action1 += Action2</entry>
<entry>Plus_Assign_</entry>
</row>
<row>
<entry>- (binary)</entry>
<entry>Calls lazily Action1 - Action2</entry>
<entry>Minus_</entry>
</row>
<row>
<entry>- (unary)</entry>
<entry>Calls lazily -Action1</entry>
<entry>Unary_Minus_</entry>
</row>
<row>
<entry>-=</entry>
<entry>Calls lazily Action1 -= Action2</entry>
<entry>Minus_Assign_</entry>
</row>
<row>
<entry>%</entry>
<entry>Calls lazily Action1 % Action2</entry>
<entry>Modulus_</entry>
</row>
<row>
<entry>%=</entry>
<entry>Calls lazily Action1 %= Action2</entry>
<entry>Modulus_Assign_</entry>
</row>
<row>
<entry>>></entry>
<entry>Calls lazily Action1 >> Action2</entry>
<entry>ShiftRight_</entry>
</row>
<row>
<entry>>>=</entry>
<entry>Calls lazily Action1 >>= Action2</entry>
<entry>ShiftRight_Assign_</entry>
</row>
<row>
<entry>&lt;&lt;</entry>
<entry>Calls lazily Action1 &lt;&lt; Action2</entry>
<entry>ShiftLeft_</entry>
</row>
<row>
<entry>&lt;&lt;=</entry>
<entry>Calls lazily Action1 &lt;&lt;= Action2</entry>
<entry>ShiftLeft_Assign_</entry>
</row>
<row>
<entry>[] (works on vector, map, arrays)</entry>
<entry>Calls lazily Action1 [Action2]</entry>
<entry>Subscript_</entry>
</row>
<row>
<entry>if_then_else_(Condition,Action1,Action2)</entry>
<entry>Returns either the result of calling Action1 or the result of
calling Action2</entry>
<entry>If_Else_</entry>
</row>
<row>
<entry>if_then_(Condition,Action)</entry>
<entry>Returns the result of calling Action if Condition</entry>
<entry>If_Then_</entry>
</row>
<row>
<entry>while_(Condition, Body)</entry>
<entry>While Condition(), calls Body(). Returns nothing</entry>
<entry>While_Do_</entry>
</row>
<row>
<entry>do_while_(Condition, Body)</entry>
<entry>Calls Body() while Condition(). Returns nothing</entry>
<entry>Do_While_</entry>
</row>
<row>
<entry>for_(Begin,Stop,EndLoop,Body)</entry>
<entry>Calls for(Begin;Stop;EndLoop){Body;}</entry>
<entry>For_Loop_</entry>
</row>
<row>
<entry>process_(Event [,fsm1] [,fsm2] [,fsm3] [,fsm4])</entry>
<entry>Processes Event on the current state machine (if no fsm
specified) or on up to 4 state machines returned by an
appropriate functor.</entry>
<entry>Process_</entry>
</row>
<row>
<entry>process2_(Event, Data [,fsm1] [,fsm2] [,fsm3])</entry>
<entry>Processes Event on the current state machine (if no fsm
specified) or on up to 2 state machines returned by an
appropriate functor. The event is copy-constructed from what
Data() returns.</entry>
<entry>Process2_</entry>
</row>
<row>
<entry>is_flag_(Flag [,fsm])</entry>
<entry>Calls is_flag_active() on the current state machine or the
one returned by calling fsm.</entry>
<entry>Get_Flag_</entry>
</row>
<row>
<entry>event_ [(attribute name)]</entry>
<entry>Returns the current event (as const reference)</entry>
<entry>GetEvent_</entry>
</row>
<row>
<entry>source_ [(attribute name)]</entry>
<entry>Returns the source state of the currently triggered
transition (as reference). If an attribute name is provided,
returns the attribute by reference.</entry>
<entry>GetSource_</entry>
</row>
<row>
<entry>target_ [(attribute name)]</entry>
<entry>Returns the target state of the currently triggered
transition (as reference). If an attribute name is provided,
returns the attribute by reference.</entry>
<entry>GetTarget_</entry>
</row>
<row>
<entry>state_ [(attribute name)]</entry>
<entry>Returns the source state of the currently active state (as
reference). Valid inside a state entry/exit action. If an
attribute name is provided, returns the attribute by
reference.</entry>
<entry>GetState_</entry>
</row>
<row>
<entry>fsm_ [(attribute name)]</entry>
<entry>Returns the current state machine (as reference). Valid
inside a state entry/exit action or a transition. If an
attribute name is provided, returns the attribute by
reference.</entry>
<entry>GetFsm_</entry>
</row>
<row>
<entry>substate_(state_name [,fsm])</entry>
<entry>Returns (as reference) the state state_name referenced in the
current state machine or the one given as argument.</entry>
<entry>SubState_</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>To use these functions, you need to include: </para>
<para><code>#include &lt;msm/front/euml/euml.hpp></code></para>
</chapter>
<chapter>
<title>
<command xml:id="eUML-STL-all"/>Functional programming </title>
<para>To use these functions, you need to include: </para>
<para><code>#include &lt;msm/front/euml/stl.hpp></code></para>
<para>or the specified header in the following tables.</para>
<para>The following tables list the supported STL algorithms: </para>
<para>
<command xml:id="eUML-STL-querying"/>
<table frame="all">
<title>STL algorithms</title>
<tgroup cols="2">
<colspec colname="c2" colnum="1"/>
<colspec colname="c3" colnum="2"/>
<thead>
<row>
<entry>STL algorithms in querying.hpp</entry>
<entry>Functor</entry>
</row>
</thead>
<tbody>
<row>
<entry>find_(first, last, value)</entry>
<entry>Find_</entry>
</row>
<row>
<entry>find_if_(first, last, value)</entry>
<entry>FindIf_</entry>
</row>
<row>
<entry>lower_bound_(first, last, value [,opᵃ])</entry>
<entry>LowerBound_</entry>
</row>
<row>
<entry>upper_bound_(first, last, value [,opᵃ])</entry>
<entry>UpperBound_</entry>
</row>
<row>
<entry>equal_range_(first, last, value [,opᵃ])</entry>
<entry>EqualRange_</entry>
</row>
<row>
<entry>binary_search_(first, last, value [,opᵃ])</entry>
<entry>BinarySearch_</entry>
</row>
<row>
<entry>min_element_(first, last[,opᵃ])</entry>
<entry>MinElement_</entry>
</row>
<row>
<entry>max_element_(first, last[,opᵃ])</entry>
<entry>MaxElement_</entry>
</row>
<row>
<entry>adjacent_find_(first, last[,opᵃ])</entry>
<entry>AdjacentFind_</entry>
</row>
<row>
<entry>find_end_( first1, last1, first2, last2 [,op ᵃ])</entry>
<entry>FindEnd_</entry>
</row>
<row>
<entry>find_first_of_( first1, last1, first2, last2 [,op ᵃ])</entry>
<entry>FindFirstOf_</entry>
</row>
<row>
<entry>equal_( first1, last1, first2 [,op ᵃ])</entry>
<entry>Equal_</entry>
</row>
<row>
<entry>search_( first1, last1, first2, last2 [,op ᵃ])</entry>
<entry>Search_</entry>
</row>
<row>
<entry>includes_( first1, last1, first2, last2 [,op ᵃ])</entry>
<entry>Includes_</entry>
</row>
<row>
<entry>lexicographical_compare_ ( first1, last1, first2, last2 [,op
ᵃ]) </entry>
<entry>LexicographicalCompare_</entry>
</row>
<row>
<entry>count_(first, last, value [,size])</entry>
<entry>Count_</entry>
</row>
<row>
<entry>count_if_(first, last, op ᵃ [,size])</entry>
<entry>CountIf_</entry>
</row>
<row>
<entry>distance_(first, last)</entry>
<entry>Distance_</entry>
</row>
<row>
<entry>mismatch _( first1, last1, first2 [,op ᵃ])</entry>
<entry>Mismatch_</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
<command xml:id="eUML-STL-iteration"/>
<table frame="all">
<title>STL algorithms</title>
<tgroup cols="2">
<colspec colname="c2" colnum="1"/>
<colspec colname="c3" colnum="2"/>
<thead>
<row>
<entry>STL algorithms in iteration.hpp</entry>
<entry>Functor</entry>
</row>
</thead>
<tbody>
<row>
<entry>for_each_(first,last, unary opᵃ)</entry>
<entry>ForEach_</entry>
</row>
<row>
<entry>accumulate_first, last, init [,opᵃ])</entry>
<entry>Accumulate_</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
<command xml:id="eUML-STL-transformation"/>
<table>
<title>STL algorithms</title>
<tgroup cols="2">
<colspec colname="c2" colnum="1"/>
<colspec colname="c3" colnum="2"/>
<thead>
<row>
<entry>STL algorithms in transformation.hpp</entry>
<entry>Functor</entry>
</row>
</thead>
<tbody>
<row>
<entry>copy_(first, last, result)</entry>
<entry>Copy_</entry>
</row>
<row>
<entry>copy_backward_(first, last, result)</entry>
<entry>CopyBackward_</entry>
</row>
<row>
<entry>reverse_(first, last)</entry>
<entry>Reverse_</entry>
</row>
<row>
<entry>reverse_copy_(first, last , result)</entry>
<entry>ReverseCopy_</entry>
</row>
<row>
<entry>remove_(first, last, value)</entry>
<entry>Remove_</entry>
</row>
<row>
<entry>remove_if_(first, last , opᵃ)</entry>
<entry>RemoveIf_</entry>
</row>
<row>
<entry>remove_copy_(first, last , output, value)</entry>
<entry>RemoveCopy_</entry>
</row>
<row>
<entry>remove_copy_if_(first, last, output, opᵃ)</entry>
<entry>RemoveCopyIf_</entry>
</row>
<row>
<entry>fill_(first, last, value)</entry>
<entry>Fill_</entry>
</row>
<row>
<entry>fill_n_(first, size, value)ᵇ</entry>
<entry>FillN_</entry>
</row>
<row>
<entry>generate_(first, last, generatorᵃ)</entry>
<entry>Generate_</entry>
</row>
<row>
<entry>generate_(first, size, generatorᵃ)ᵇ</entry>
<entry>GenerateN_</entry>
</row>
<row>
<entry>unique_(first, last [,opᵃ])</entry>
<entry>Unique_</entry>
</row>
<row>
<entry>unique_copy_(first, last, output [,opᵃ])</entry>
<entry>UniqueCopy_</entry>
</row>
<row>
<entry>random_shuffle_(first, last [,opᵃ])</entry>
<entry>RandomShuffle_</entry>
</row>
<row>
<entry>rotate_copy_(first, middle, last, output)</entry>
<entry>RotateCopy_</entry>
</row>
<row>
<entry>partition_ (first, last [,opᵃ])</entry>
<entry>Partition_</entry>
</row>
<row>
<entry>stable_partition_ (first, last [,opᵃ])</entry>
<entry>StablePartition_</entry>
</row>
<row>
<entry>stable_sort_(first, last [,opᵃ])</entry>
<entry>StableSort_</entry>
</row>
<row>
<entry>sort_(first, last [,opᵃ])</entry>
<entry>Sort_</entry>
</row>
<row>
<entry>partial_sort_(first, middle, last [,opᵃ])</entry>
<entry>PartialSort_</entry>
</row>
<row>
<entry>partial_sort_copy_ (first, last, res_first, res_last [,opᵃ]) </entry>
<entry>PartialSortCopy_</entry>
</row>
<row>
<entry>nth_element_(first, nth, last [,opᵃ])</entry>
<entry>NthElement_</entry>
</row>
<row>
<entry>merge_( first1, last1, first2, last2, output [,op ᵃ])</entry>
<entry>Merge_</entry>
</row>
<row>
<entry>inplace_merge_(first, middle, last [,opᵃ])</entry>
<entry>InplaceMerge_</entry>
</row>
<row>
<entry>set_union_(first1, last1, first2, last2, output [,op
ᵃ])</entry>
<entry>SetUnion_</entry>
</row>
<row>
<entry>push_heap_(first, last [,op ᵃ])</entry>
<entry>PushHeap_</entry>
</row>
<row>
<entry>pop_heap_(first, last [,op ᵃ])</entry>
<entry>PopHeap_</entry>
</row>
<row>
<entry>make_heap_(first, last [,op ᵃ])</entry>
<entry>MakeHeap_</entry>
</row>
<row>
<entry>sort_heap_(first, last [,op ᵃ])</entry>
<entry>SortHeap_</entry>
</row>
<row>
<entry>next_permutation_(first, last [,op ᵃ])</entry>
<entry>NextPermutation_</entry>
</row>
<row>
<entry>prev_permutation_(first, last [,op ᵃ])</entry>
<entry>PrevPermutation_</entry>
</row>
<row>
<entry>inner_product_(first1, last1, first2, init [,op1ᵃ] [,op2ᵃ]) </entry>
<entry>InnerProduct_</entry>
</row>
<row>
<entry>partial_sum_(first, last, output [,opᵃ])</entry>
<entry>PartialSum_</entry>
</row>
<row>
<entry>adjacent_difference_(first, last, output [,opᵃ])</entry>
<entry>AdjacentDifference_</entry>
</row>
<row>
<entry>replace_(first, last, old_value, new_value)</entry>
<entry>Replace_</entry>
</row>
<row>
<entry>replace_if_(first, last, opᵃ, new_value)</entry>
<entry>ReplaceIf_</entry>
</row>
<row>
<entry>replace_copy_(first, last, result, old_value,
new_value)</entry>
<entry>ReplaceCopy_</entry>
</row>
<row>
<entry>replace_copy_if_(first, last, result, opᵃ, new_value)</entry>
<entry>ReplaceCopyIf_</entry>
</row>
<row>
<entry>rotate_(first, middle, last)ᵇ</entry>
<entry>Rotate_</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
<command xml:id="eUML-STL-container"/>
<table>
<title>STL container methods</title>
<tgroup cols="2">
<colspec colname="c2" colnum="1"/>
<colspec colname="c3" colnum="2"/>
<thead>
<row>
<entry>STL container methods(common) in container.hpp</entry>
<entry>Functor</entry>
</row>
</thead>
<tbody>
<row>
<entry>container::reference front_(container)</entry>
<entry>Front_</entry>
</row>
<row>
<entry>container::reference back_(container)</entry>
<entry>Back_</entry>
</row>
<row>
<entry>container::iterator begin_(container)</entry>
<entry>Begin_</entry>
</row>
<row>
<entry>container::iterator end_(container)</entry>
<entry>End_</entry>
</row>
<row>
<entry>container::reverse_iterator rbegin_(container)</entry>
<entry>RBegin_</entry>
</row>
<row>
<entry>container::reverse_iterator rend_(container)</entry>
<entry>REnd_</entry>
</row>
<row>
<entry>void push_back_(container, value)</entry>
<entry>Push_Back_</entry>
</row>
<row>
<entry>void pop_back_(container, value)</entry>
<entry>Pop_Back_</entry>
</row>
<row>
<entry>void push_front_(container, value)</entry>
<entry>Push_Front_</entry>
</row>
<row>
<entry>void pop_front_(container, value)</entry>
<entry>Pop_Front_</entry>
</row>
<row>
<entry>void clear_(container)</entry>
<entry>Clear_</entry>
</row>
<row>
<entry>size_type capacity_(container)</entry>
<entry>Capacity_</entry>
</row>
<row>
<entry>size_type size_(container)</entry>
<entry>Size_</entry>
</row>
<row>
<entry>size_type max_size_(container)</entry>
<entry>Max_Size_</entry>
</row>
<row>
<entry>void reserve_(container, value)</entry>
<entry>Reserve _</entry>
</row>
<row>
<entry>void resize_(container, value)</entry>
<entry>Resize _</entry>
</row>
<row>
<entry>iterator insert_(container, pos, value)</entry>
<entry>Insert_</entry>
</row>
<row>
<entry>void insert_( container , pos, first, last)</entry>
<entry>Insert_</entry>
</row>
<row>
<entry>void insert_( container , pos, number, value)</entry>
<entry>Insert_</entry>
</row>
<row>
<entry>void swap_( container , other_container)</entry>
<entry>Swap_</entry>
</row>
<row>
<entry>void erase_( container , pos)</entry>
<entry>Erase_</entry>
</row>
<row>
<entry>void erase_( container , first, last) </entry>
<entry>Erase_</entry>
</row>
<row>
<entry>bool empty_( container)</entry>
<entry>Empty_</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
<table>
<title>STL list methods</title>
<tgroup cols="2">
<colspec colname="c2" colnum="1"/>
<colspec colname="c3" colnum="2"/>
<thead>
<row>
<entry>std::list methods in container.hpp</entry>
<entry>Functor</entry>
</row>
</thead>
<tbody>
<row>
<entry>void list_remove_(container, value)</entry>
<entry>ListRemove_</entry>
</row>
<row>
<entry>void list_remove_if_(container, opᵃ)</entry>
<entry>ListRemove_If_</entry>
</row>
<row>
<entry>void list_merge_(container, other_list)</entry>
<entry>ListMerge_</entry>
</row>
<row>
<entry>void list_merge_(container, other_list, opᵃ)</entry>
<entry>ListMerge_</entry>
</row>
<row>
<entry>void splice_(container, iterator, other_list)</entry>
<entry>Splice_</entry>
</row>
<row>
<entry>void splice_(container, iterator, other_list,
iterator)</entry>
<entry>Splice_</entry>
</row>
<row>
<entry>void splice_(container, iterator, other_list, first,
last)</entry>
<entry>Splice_</entry>
</row>
<row>
<entry>void list_reverse_(container)</entry>
<entry>ListReverse_</entry>
</row>
<row>
<entry>void list_unique_(container)</entry>
<entry>ListUnique_</entry>
</row>
<row>
<entry>void list_unique_(container, opᵃ)</entry>
<entry>ListUnique_</entry>
</row>
<row>
<entry>void list_sort_(container)</entry>
<entry>ListSort_</entry>
</row>
<row>
<entry>void list_sort_(container, opᵃ)</entry>
<entry>ListSort_</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
<table>
<title>STL associative container methods </title>
<tgroup cols="2">
<colspec colname="c2" colnum="1"/>
<colspec colname="c3" colnum="2"/>
<thead>
<row>
<entry>Associative container methods in container.hpp</entry>
<entry>Functor</entry>
</row>
</thead>
<tbody>
<row>
<entry>iterator insert_(container, pos, value)</entry>
<entry>Insert_</entry>
</row>
<row>
<entry>void insert_( container , first, last)</entry>
<entry>Insert_</entry>
</row>
<row>
<entry>pair&lt;iterator, bool> insert_( container , value)</entry>
<entry>Insert_</entry>
</row>
<row>
<entry>void associative_erase_( container , pos)</entry>
<entry>Associative_Erase_</entry>
</row>
<row>
<entry>void associative_erase_( container , first, last)</entry>
<entry>Associative_Erase_</entry>
</row>
<row>
<entry>size_type associative_erase_( container , key)</entry>
<entry>Associative_Erase_</entry>
</row>
<row>
<entry>iterator associative_find_( container , key)</entry>
<entry>Associative_Find_</entry>
</row>
<row>
<entry>size_type associative_count_( container , key)</entry>
<entry>AssociativeCount_</entry>
</row>
<row>
<entry>iterator associative_lower_bound_( container , key)</entry>
<entry>Associative_Lower_Bound_</entry>
</row>
<row>
<entry>iterator associative_upper_bound_( container , key)</entry>
<entry>Associative_Upper_Bound_</entry>
</row>
<row>
<entry>pair&lt;iterator, iterator> associative_equal_range_(
container , key)</entry>
<entry>Associative_Equal_Range_</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
<table>
<title>STL pair</title>
<tgroup cols="2">
<colspec colname="c2" colnum="1"/>
<colspec colname="c3" colnum="2"/>
<thead>
<row>
<entry>std::pair in container.hpp</entry>
<entry>Functor</entry>
</row>
</thead>
<tbody>
<row>
<entry>first_type first_(pair&lt;T1, T2>)</entry>
<entry>First_</entry>
</row>
<row>
<entry>second_type second_(pair&lt;T1, T2>)</entry>
<entry>Second_</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
<table>
<title>STL string</title>
<tgroup cols="3">
<colspec colname="newCol1" colnum="1"/>
<colspec colname="c2" colnum="2"/>
<colspec colname="c3" colnum="3"/>
<thead>
<row>
<entry>STL string method</entry>
<entry>std::string method in container.hpp</entry>
<entry>Functor</entry>
</row>
</thead>
<tbody>
<row>
<entry>substr (size_type pos, size_type size)</entry>
<entry>string substr_(container, pos, length)</entry>
<entry>Substr_</entry>
</row>
<row>
<entry>int compare(string)</entry>
<entry>int string_compare_(container, another_string)</entry>
<entry>StringCompare_</entry>
</row>
<row>
<entry>int compare(char*)</entry>
<entry>int string_compare_(container, another_string)</entry>
<entry>StringCompare_</entry>
</row>
<row>
<entry>int compare(size_type pos, size_type size, string)</entry>
<entry>int string_compare_(container, pos, size,
another_string)</entry>
<entry>StringCompare_</entry>
</row>
<row>
<entry>int compare (size_type pos, size_type size, string, size_type
length)</entry>
<entry>int string_compare_(container, pos, size, another_string,
length)</entry>
<entry>StringCompare_</entry>
</row>
<row>
<entry>string&amp; append(const string&amp;)</entry>
<entry>string&amp; append_(container, another_string)</entry>
<entry>Append_</entry>
</row>
<row>
<entry>string&amp; append (charT*)</entry>
<entry>string&amp; append_(container, another_string)</entry>
<entry>Append_</entry>
</row>
<row>
<entry>string&amp; append (string , size_type pos, size_type
size)</entry>
<entry>string&amp; append_(container, other_string, pos,
size)</entry>
<entry>Append_</entry>
</row>
<row>
<entry>string&amp; append (charT*, size_type size)</entry>
<entry>string&amp; append_(container, another_string,
length)</entry>
<entry>Append_</entry>
</row>
<row>
<entry>string&amp; append (size_type size, charT)</entry>
<entry>string&amp; append_(container, size, char)</entry>
<entry>Append_</entry>
</row>
<row>
<entry>string&amp; append (iterator begin, iterator end)</entry>
<entry>string&amp; append_(container, begin, end)</entry>
<entry>Append_</entry>
</row>
<row>
<entry>string&amp; insert (size_type pos, charT*)</entry>
<entry>string&amp; string_insert_(container, pos,
other_string)</entry>
<entry>StringInsert_</entry>
</row>
<row>
<entry>string&amp; insert(size_type pos, charT*,size_type n)</entry>
<entry>string&amp; string_insert_(container, pos, other_string,
n)</entry>
<entry>StringInsert_</entry>
</row>
<row>
<entry>string&amp; insert(size_type pos,size_type n, charT
c)</entry>
<entry>string&amp; string_insert_(container, pos, n, c)</entry>
<entry>StringInsert_</entry>
</row>
<row>
<entry>string&amp; insert (size_type pos, const string&amp;)</entry>
<entry>string&amp; string_insert_(container, pos,
other_string)</entry>
<entry>StringInsert_</entry>
</row>
<row>
<entry>string&amp; insert (size_type pos, const string&amp;,
size_type pos1, size_type n)</entry>
<entry>string&amp; string_insert_(container, pos, other_string,
pos1, n)</entry>
<entry>StringInsert_</entry>
</row>
<row>
<entry>string&amp; erase(size_type pos=0, size_type n=npos)</entry>
<entry>string&amp; string_erase_(container, pos, n)</entry>
<entry>StringErase_</entry>
</row>
<row>
<entry>string&amp; assign(const string&amp;)</entry>
<entry>string&amp; string_assign_(container, another_string)</entry>
<entry>StringAssign_</entry>
</row>
<row>
<entry>string&amp; assign(const charT*)</entry>
<entry>string&amp; string_assign_(container, another_string)</entry>
<entry>StringAssign_</entry>
</row>
<row>
<entry>string&amp; assign(const string&amp;, size_type pos,
size_type n)</entry>
<entry>string&amp; string_assign_(container, another_string, pos,
n)</entry>
<entry>StringAssign_</entry>
</row>
<row>
<entry>string&amp; assign(const charT*, size_type n)</entry>
<entry>string&amp; string_assign_(container, another_string,
n)</entry>
<entry>StringAssign_</entry>
</row>
<row>
<entry>string&amp; assign(size_type n, charT c)</entry>
<entry>string&amp; string_assign_(container, n, c)</entry>
<entry>StringAssign_</entry>
</row>
<row>
<entry>string&amp; assign(iterator first, iterator last)</entry>
<entry>string&amp; string_assign_(container, first, last)</entry>
<entry>StringAssign_</entry>
</row>
<row>
<entry>string&amp; replace(size_type pos, size_type n, const
string&amp;)</entry>
<entry>string&amp; string_replace_(container, pos, n,
another_string)</entry>
<entry>StringReplace_</entry>
</row>
<row>
<entry>string&amp; replace(size_type pos, size_type n, const charT*,
size_type n1)</entry>
<entry>string&amp; string_replace_(container, pos, n,
another_string, n1)</entry>
<entry>StringReplace_</entry>
</row>
<row>
<entry>string&amp; replace(size_type pos, size_type n, const
charT*)</entry>
<entry>string&amp; string_replace_(container, pos, n,
another_string)</entry>
<entry>StringReplace_</entry>
</row>
<row>
<entry>string&amp; replace(size_type pos, size_type n, size_type n1,
charT c)</entry>
<entry>string&amp; string_replace_(container, pos, n, n1, c)</entry>
<entry>StringReplace_</entry>
</row>
<row>
<entry>string&amp; replace(iterator first, iterator last, const
string&amp;)</entry>
<entry>string&amp; string_replace_(container, first, last,
another_string)</entry>
<entry>StringReplace_</entry>
</row>
<row>
<entry>string&amp; replace(iterator first, iterator last, const
charT*, size_type n)</entry>
<entry>string&amp; string_replace_(container, first, last,
another_string, n)</entry>
<entry>StringReplace_</entry>
</row>
<row>
<entry>string&amp; replace(iterator first, iterator last, const
charT*)</entry>
<entry>string&amp; string_replace_(container, first, last,
another_string)</entry>
<entry>StringReplace_</entry>
</row>
<row>
<entry>string&amp; replace(iterator first, iterator last, size_type
n, charT c)</entry>
<entry>string&amp; string_replace_(container, first, last, n,
c)</entry>
<entry>StringReplace_</entry>
</row>
<row>
<entry>string&amp; replace(iterator first, iterator last, iterator
f, iterator l)</entry>
<entry>string&amp; string_replace_(container, first, last, f,
l)</entry>
<entry>StringReplace_</entry>
</row>
<row>
<entry>const charT* c_str()</entry>
<entry>const charT* c_str_(container)</entry>
<entry>CStr_</entry>
</row>
<row>
<entry>const charT* data()</entry>
<entry>const charT* string_data_(container)</entry>
<entry>StringData_</entry>
</row>
<row>
<entry>size_type copy(charT* buf, size_type n, size_type pos =
0)</entry>
<entry>size_type string_copy_(container, buf, n, pos); size_type
string_copy_(container, buf, n) </entry>
<entry>StringCopy_</entry>
</row>
<row>
<entry>size_type find(charT* s, size_type pos, size_type n)</entry>
<entry>size_type string_find_(container, s, pos, n)</entry>
<entry>StringFind_</entry>
</row>
<row>
<entry>size_type find(charT* s, size_type pos=0)</entry>
<entry>size_type string_find_(container, s, pos); size_type
string_find_(container, s) </entry>
<entry>StringFind_</entry>
</row>
<row>
<entry>size_type find(const string&amp; s, size_type pos=0)</entry>
<entry>size_type string_find_(container, s, pos) size_type
string_find_(container, s) </entry>
<entry>StringFind_</entry>
</row>
<row>
<entry>size_type find(charT c, size_type pos=0)</entry>
<entry>size_type string_find_(container, c, pos) size_type
string_find_(container, c) </entry>
<entry>StringFind_</entry>
</row>
<row>
<entry>size_type rfind(charT* s, size_type pos, size_type n)</entry>
<entry>size_type string_rfind_(container, s, pos, n)</entry>
<entry>StringRFind_</entry>
</row>
<row>
<entry>size_type rfind(charT* s, size_type pos=npos)</entry>
<entry>size_type string_rfind_(container, s, pos); size_type
string_rfind_(container, s) </entry>
<entry>StringRFind_</entry>
</row>
<row>
<entry>size_type rfind(const string&amp; s, size_type
pos=npos)</entry>
<entry>size_type string_rfind_(container, s, pos); size_type
string_rfind_(container, s) </entry>
<entry>StringRFind_</entry>
</row>
<row>
<entry>size_type rfind(charT c, size_type pos=npos)</entry>
<entry>size_type string_rfind_(container, c, pos) size_type
string_rfind_(container, c) </entry>
<entry>StringRFind_</entry>
</row>
<row>
<entry>size_type find_first_of(charT* s, size_type pos, size_type
n)</entry>
<entry>size_type find_first_of_(container, s, pos, n)</entry>
<entry>StringFindFirstOf_</entry>
</row>
<row>
<entry>size_type find_first_of (charT* s, size_type pos=0)</entry>
<entry>size_type find_first_of_(container, s, pos); size_type
find_first_of_(container, s) </entry>
<entry>StringFindFirstOf_</entry>
</row>
<row>
<entry>size_type find_first_of (const string&amp; s, size_type
pos=0)</entry>
<entry>size_type find_first_of_(container, s, pos); size_type
find_first_of_(container, s) </entry>
<entry>StringFindFirstOf_</entry>
</row>
<row>
<entry>size_type find_first_of (charT c, size_type pos=0)</entry>
<entry>size_type find_first_of_(container, c, pos) size_type
find_first_of_(container, c) </entry>
<entry>StringFindFirstOf_</entry>
</row>
<row>
<entry>size_type find_first_not_of(charT* s, size_type pos,
size_type n)</entry>
<entry>size_type find_first_not_of_(container, s, pos, n)</entry>
<entry>StringFindFirstNotOf_</entry>
</row>
<row>
<entry>size_type find_first_not_of (charT* s, size_type
pos=0)</entry>
<entry>size_type find_first_not_of_(container, s, pos); size_type
find_first_not_of_(container, s) </entry>
<entry>StringFindFirstNotOf_</entry>
</row>
<row>
<entry>size_type find_first_not_of (const string&amp; s, size_type
pos=0)</entry>
<entry>size_type find_first_not_of_(container, s, pos); size_type
find_first_not_of_(container, s) </entry>
<entry>StringFindFirstNotOf_</entry>
</row>
<row>
<entry>size_type find_first_not_of (charT c, size_type
pos=0)</entry>
<entry>size_type find_first_not_of_(container, c, pos); size_type
find_first_not_of_(container, c) </entry>
<entry>StringFindFirstNotOf_</entry>
</row>
<row>
<entry>size_type find_last_of(charT* s, size_type pos, size_type
n)</entry>
<entry>size_type find_last_of_(container, s, pos, n)</entry>
<entry>StringFindLastOf_</entry>
</row>
<row>
<entry>size_type find_last_of (charT* s, size_type pos=npos)</entry>
<entry>size_type find_last_of_(container, s, pos); size_type
find_last_of_(container, s) </entry>
<entry>StringFindLastOf_</entry>
</row>
<row>
<entry>size_type find_last_of (const string&amp; s, size_type
pos=npos)</entry>
<entry>size_type find_last_of_(container, s, pos); size_type
find_last_of_(container, s) </entry>
<entry>StringFindLastOf_</entry>
</row>
<row>
<entry>size_type find_last_of (charT c, size_type pos=npos)</entry>
<entry>size_type find_last_of_(container, c, pos); size_type
find_last_of_(container, c) </entry>
<entry>StringFindLastOf_</entry>
</row>
<row>
<entry>size_type find_last_not_of(charT* s, size_type pos, size_type
n)</entry>
<entry>size_type find_last_not_of_(container, s, pos, n)</entry>
<entry>StringFindLastNotOf_</entry>
</row>
<row>
<entry>size_type find_last_not_of (charT* s, size_type
pos=npos)</entry>
<entry>size_type find_last_not_of_(container, s, pos); size_type
find_last_of_(container, s) </entry>
<entry>StringFindLastNotOf_</entry>
</row>
<row>
<entry>size_type find_last_not_of (const string&amp; s, size_type
pos=npos)</entry>
<entry>size_type find_last_not_of_(container, s, pos); size_type
find_last_not_of_(container, s) </entry>
<entry>StringFindLastNotOf_</entry>
</row>
<row>
<entry>size_type find_last_not_of (charT c, size_type
pos=npos)</entry>
<entry>size_type find_last_not_of_(container, c, pos); size_type
find_last_not_of_(container, c) </entry>
<entry>StringFindLastNotOf_</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para><emphasis role="underline">Notes</emphasis>: <itemizedlist>
<listitem>
<para>ᵃ: algorithms requiring a predicate need to make them eUML compatible
by wrapping them inside a Predicate_ functor. For example,
std::less&lt;int> => Predicate_&lt;std::less&lt;int> >()</para>
</listitem>
<listitem>
<para>ᵇ: If using the SGI STL implementation, these functors use the SGI
return value</para>
</listitem>
</itemizedlist>
</para>
</chapter>
<refentry>
<refnamediv>
<refname>Common headers</refname>
<refpurpose>The common types used by front- and back-ends</refpurpose>
</refnamediv>
<refsect1>
<title>msm/common.hpp</title>
<para>This header provides one type, wrap, which is an empty type whose only reason
to exist is to be cheap to construct, so that it can be used with mpl::for_each,
as shown in the Metaprogramming book, chapter 9.</para>
<classsynopsis>
<ooclass>
<classname>template &lt;class Dummy> wrap{};</classname>
</ooclass>
</classsynopsis>
</refsect1>
<refsect1>
<title>msm/row_tags.hpp</title>
<para>This header contains the row type tags which front-ends can support partially
or totally. Please see the <command xlink:href="#internals-front-back-interface"
>Internals</command> section for a description of the different
types.</para>
</refsect1>
</refentry>
<refentry>
<refnamediv>
<refname>Back-end</refname>
<refpurpose>The back-end headers</refpurpose>
</refnamediv>
<refsect1>
<title>msm/back/state_machine.hpp</title>
<para> This header provides one type, state_machine, MSM's state machine engine
implementation.</para>
<classsynopsis>
<ooclass>
<classname>template &lt;class Derived,class HistoryPolicy=NoHistory,class
CompilePolicy=favor_runtime_speed> state_machine</classname>
</ooclass>
</classsynopsis>
<refsect2>
<title> Template arguments </title>
<refsect3>
<title> Derived </title>
<para>The name of the front-end state machine definition. All three
front-ends are possible.</para>
</refsect3>
<refsect3>
<title> HistoryPolicy </title>
<para>The desired history. This can be: AlwaysHistory, NoHistory,
ShallowHistory. Default is NoHistory.</para>
</refsect3>
<refsect3>
<title> CompilePolicy </title>
<para>The trade-off performance / compile-time. There are two predefined
policies, favor_runtime_speed and favor_compile_time. Default is
favor_runtime_speed, best performance, longer compile-time. See <link
xlink:href="#backend-tradeof-rt-ct">the backend</link>.</para>
</refsect3>
</refsect2>
<refsect2>
<title> methods </title>
<refsect3>
<title>start</title>
<para> The start methods must be called before any call to process_event. It
activates the entry action of the initial state(s). This allows you to
choose when a state machine can start. See <link
xlink:href="#backend-start">backend</link>.</para>
<methodsynopsis>
<methodname>void start</methodname>
<methodparam>
<funcparams/>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>process_event</title>
<para>The event processing method implements the double-dispatch. Each call
to this function with a new event type instantiates a new dispatch
algorithm and increases compile-time.</para>
<methodsynopsis>
<methodname>template &lt;class Event> HandledEnum
process_event</methodname>
<methodparam>
<funcparams>Event const&amp;</funcparams>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>current_state</title>
<para>Returns the ids of currently active states. You will typically need it
only for debugging or logging purposes.</para>
<methodsynopsis>
<methodname>const int* current_state const</methodname>
<methodparam>
<funcparams/>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>get_state_by_id</title>
<para>Returns the state whose id is given. As all states of a concrete state
machine share a common base state, the return value is a base state. If
the id corresponds to no state, a null pointer is returned.</para>
<methodsynopsis>
<methodname>const BaseState* get_state_by_id const</methodname>
<methodparam>
<funcparams>int id</funcparams>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>is_contained</title>
<para>Helper returning true if the state machine is contained as a
submachine of another state machine.</para>
<methodsynopsis>
<methodname>bool is_contained const</methodname>
<methodparam>
<funcparams/>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>get_state</title>
<para>Returns the required state of the state machine as a pointer. A
compile error will occur if the state is not to be found in the state
machine.</para>
<methodsynopsis>
<methodname>template &lt;class State> State* get_state</methodname>
<methodparam>
<funcparams/>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>get_state</title>
<para>Returns the required state of the state machine as a reference. A
compile error will occur if the state is not to be found in the state
machine.</para>
<methodsynopsis>
<methodname>template &lt;class State> State&amp; get_state</methodname>
<methodparam>
<funcparams/>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>is_flag_active</title>
<para>Returns true if the given flag is currently active. A flag is active
if the active state of one region is tagged with this flag (using OR as
BinaryOp) or active states of <emphasis role="underline">all</emphasis>
regions (using AND as BinaryOp)</para>
<methodsynopsis>
<methodname>template &lt;class Flag,class BinaryOp> bool
is_flag_active</methodname>
<methodparam>
<funcparams/>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>is_flag_active</title>
<para>Returns true if the given flag is currently active. A flag is active
if the active state of one region is tagged with this flag.</para>
<methodsynopsis>
<methodname>template &lt;class Flag> bool is_flag_active</methodname>
<methodparam>
<funcparams/>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>visit_current_states</title>
<para>Visits all active states and their substates. A state is visited using
the <code>accept</code> method without argument. The base class of all
states must provide an <code>accept_sig</code> type.</para>
<methodsynopsis>
<methodname>void visit_current_states</methodname>
<methodparam>
<funcparams/>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>visit_current_states</title>
<para>Visits all active states and their substates. A state is visited using
the <code>accept</code> method with arguments. The base class of all
states must provide an <code>accept_sig</code> type defining the
signature and thus the number and type of the parameters.</para>
<methodsynopsis>
<methodname>void visit_current_states</methodname>
<methodparam>
<funcparams>any-type param1, any-type param2,...</funcparams>
</methodparam>
</methodsynopsis>
</refsect3>
<refsect3>
<title>defer_event</title>
<para> Defers the provided event. This method can be called only if at least
one state defers an event or if the state machine provides the
<code>activate_deferred_events</code>(see <link
xlink:href="examples/Orthogonal-deferred2.cpp">example</link>) type
either directly or using the deferred_events configuration of eUML
(<code>configure_ &lt;&lt; deferred_events</code>)</para>
<methodsynopsis>
<methodname>template &lt;class Event> void defer_event</methodname>
<methodparam>
<funcparams>Event const&amp;</funcparams>
</methodparam>
</methodsynopsis>
</refsect3>
</refsect2>
<refsect2>
<title>Types</title>
<refsect3>
<title>nr_regions </title>
<para>The number of orthogonal regions contained in the state machine</para>
</refsect3>
<refsect3>
<title>entry_pt</title>
<para>This nested type provides the necessary typedef for entry point
pseudostates.
<code>state_machine&lt;...>::entry_pt&lt;state_name></code> is a
transition's valid target inside the containing state machine's
transition table.</para>
<classsynopsis>
<ooclass>
<classname>entry_pt</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>exit_pt</title>
<para>This nested type provides the necessary typedef for exit point
pseudostates. <code>state_machine&lt;...>::exit_pt&lt;state_name></code>
is a transition's valid source inside the containing state machine's
transition table.</para>
<classsynopsis>
<ooclass>
<classname>exit_pt</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>direct</title>
<para>This nested type provides the necessary typedef for an explicit entry
inside a submachine.
<code>state_machine&lt;...>::direct&lt;state_name></code> is a
transition's valid target inside the containing state machine's
transition table.</para>
<classsynopsis>
<ooclass>
<classname>direct</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>stt</title>
<para>Calling state_machine&lt;frontend>::stt returns a mpl::vector
containing the transition table of the state machine. This type can then
be used with generate_state_set or generate_event_set.</para>
</refsect3>
</refsect2>
</refsect1>
<refsect1>
<title>args.hpp</title>
<para>This header provides one type, args. which provides the necessary types for a
visitor implementation.</para>
</refsect1>
<refsect1>
<title><command xml:id="history-interface"/>msm/back/history_policies.hpp</title>
<para>This header provides the out-of-the-box history policies supported by MSM.
There are 3 such policies.</para>
<refsect2>
<title>Every history policy must implement the following methods: </title>
<refsect3>
<title> set_initial_states </title>
<para> This method is called by msm::back::state_machine when constructed.
It gives the policy a chance to save the ids of all initial states
(passed as array).</para>
<funcsynopsis>
<funcprototype>
<funcdef>void set_initial_states</funcdef>
<paramdef>
<funcparams>int* const</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
</refsect3>
<refsect3>
<title> history_exit </title>
<para>This method is called by msm::back::state_machine when the submachine
is exited. It gives the policy a chance to remember the ids of the last
active substates of this submachine (passed as array).</para>
<funcsynopsis>
<funcprototype>
<funcdef>void history_exit</funcdef>
<paramdef>
<funcparams>int* const</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
</refsect3>
<refsect3>
<title> history_entry </title>
<para>This method is called by msm::back::state_machine when the submachine
is entered. It gives the policy a chance to set the active states
according to the policy's aim. The policy gets as parameter the event
which activated the submachine and returns an array of active states
ids.</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Event> int* const history_exit</funcdef>
<paramdef>
<funcparams>Event const&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
</refsect3>
</refsect2>
<refsect2>
<title>Out-of-the-box policies: </title>
<refsect3>
<title>NoHistory</title>
<para>This policy is the default used by state_machine. No active state of a
submachine is remembered and at every new activation of the submachine,
the initial state(s) are activated. </para>
</refsect3>
<refsect3>
<title>AlwaysHistory</title>
<para>This policy is a non-UML-standard extension. The active state(s) of a
submachine is (are) always remembered at every new activation of the
submachine. </para>
</refsect3>
<refsect3>
<title>ShallowHistory</title>
<para>This policy activates the active state(s) of a submachine if the event
is found in the policy's event list. </para>
</refsect3>
</refsect2>
</refsect1>
<refsect1>
<title>msm/back/default_compile_policy.hpp</title>
<para>This header contains the definition of favor_runtime_speed. This policy has
two settings:<itemizedlist>
<listitem>
<para>Submachines dispatch faster because their transitions are added
into their containing machine's transition table instead of simply
forwarding events.</para>
</listitem>
<listitem>
<para>It solves transition conflicts at compile-time</para>
</listitem>
</itemizedlist></para>
</refsect1>
<refsect1>
<title>msm/back/favor_compile_time.hpp</title>
<para>This header contains the definition of favor_compile_time. This policy has two settings:<itemizedlist>
<listitem>
<para>Submachines dispatch is slower because all events, even those with
no dispatch chance, are forwarded to submachines. In exchange, no
row is added into the containing machine's transition table, which
reduces compile-time.</para>
</listitem>
<listitem>
<para>It solves transition conflicts at run-time.</para>
</listitem>
</itemizedlist></para>
</refsect1>
<refsect1>
<title>msm/back/metafunctions.hpp </title>
<para>This header contains metafunctions for use by the library. Three metafunctions
can be useful for the user:<itemizedlist>
<listitem>
<para><code>generate_state_set&lt; stt ></code>: generates the list of
all states referenced by the transition table stt. If stt is a
recursive table (generated by
<code>recursive_get_transition_table</code>), the metafunction
finds recursively all states of the submachines. A non-recursive
table can be obtained with some_backend_fsm::stt.</para>
</listitem>
<listitem>
<para><code>generate_event_set&lt; stt></code>: generates the list of
all events referenced by the transition table stt. If stt is a
recursive table (generated by
<code>recursive_get_transition_table</code>), the metafunction
finds recursively all events of the submachines. A non-recursive
table can be obtained with some_backend_fsm::stt.</para>
</listitem>
<listitem>
<para><code>recursive_get_transition_table&lt;fsm></code>: recursively
extends the transition table of the state machine fsm with tables
from the submachines.</para>
</listitem>
</itemizedlist></para>
</refsect1>
<refsect1>
<title>msm/back/tools.hpp </title>
<para> This header contains a few metaprogramming tools to get some information out
of a state machine.</para>
<refsect2>
<title>fill_state_names </title>
<refsect3>
<title>attributes </title>
<para> fill_state_names has for attribute:<itemizedlist>
<listitem>
<para><code>char const** m_names</code>: an already allocated
array of const char* where the typeid-generated names of a
state machine states will be witten.</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>constructor </title>
<constructorsynopsis>
<methodparam>
<funcparams>char const** names_to_fill</funcparams>
</methodparam>
</constructorsynopsis>
</refsect3>
<refsect3>
<title>usage</title>
<para> fill_state_names is made for use in a mpl::for_each iterating on a
state list and writing inside a pre-allocated array the state names.
Example:</para>
<programlisting>typedef some_fsm::stt Stt;
typedef msm::back::generate_state_set&lt;Stt>::type all_states; //states
static char const* state_names[mpl::size&lt;all_states>::value];
// array to fill with names
// fill the names of the states defined in the state machine
mpl::for_each&lt;all_states,boost::msm::wrap&lt;mpl::placeholders::_1> >
(msm::back::fill_state_names&lt;Stt>(state_names));
// display all active states
for (unsigned int i=0;i&lt;some_fsm::nr_regions::value;++i)
{
std::cout &lt;&lt; " -> "
&lt;&lt; state_names[my_fsm_instance.current_state()[i]]
&lt;&lt; std::endl;
}</programlisting>
</refsect3>
</refsect2>
<refsect2>
<title>get_state_name </title>
<refsect3>
<title> attributes </title>
<para>get_state_name has for attributes:<itemizedlist>
<listitem>
<para>std::string&amp; m_name: the return value of the
iteration</para>
</listitem>
<listitem>
<para>int m_state_id: the searched state's id</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>constructor</title>
<para>The constructor takes as argument a reference to the string to fill
with the state name and the id which must be searched.</para>
<constructorsynopsis>
<methodparam>
<funcparams>string&amp; name_to_fill,int state_id</funcparams>
</methodparam>
</constructorsynopsis>
</refsect3>
<refsect3>
<title> usage</title>
<para>This type is made for the same search as in the previous example,
using a mpl::for_each to iterate on states. After the iteration, the
state name reference has been set.</para>
</refsect3>
</refsect2>
<refsect2>
<title>display_type </title>
<refsect3>
<title> attributes </title>
<para>none</para>
</refsect3>
<refsect3>
<title> usage</title>
<para>Reusing the state list from the previous example, we can output all
state names:</para>
<para><code>mpl::for_each&lt;all_states,boost::msm::wrap&lt;mpl::placeholders::_1>
>(msm::back::display_type ());</code></para>
</refsect3>
</refsect2>
</refsect1>
</refentry>
<refentry>
<refnamediv>
<refname>Front-end</refname>
<refpurpose>The front-end headers</refpurpose>
</refnamediv>
<refsect1>
<title>msm/front/common_states.hpp</title>
<para>This header contains the predefined types to serve as base for states or state machines:<itemizedlist>
<listitem>
<para>default_base_state: non-polymorphic empty type.</para>
</listitem>
<listitem>
<para>polymorphic_state: type with a virtual destructor, which makes all
states polymorphic.</para>
</listitem>
</itemizedlist></para>
</refsect1>
<refsect1>
<title>msm/front/completion_event.hpp</title>
<para>This header contains one type, <code>none</code>. This type has several
meanings inside a transition table:<itemizedlist>
<listitem>
<para>as action or guard: that there is no action or guard</para>
</listitem>
<listitem>
<para>as target state: that the transition is an internal
transition</para>
</listitem>
<listitem>
<para>as event: the transition is an anonymous (completion)
transition</para>
</listitem>
</itemizedlist></para>
</refsect1>
<refsect1>
<title>msm/front/functor_row.hpp</title>
<para>This header implements the functor front-end's transitions and helpers.</para>
<refsect2>
<title>Row</title>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template &lt;class Source,class Event,class Target,class
Action,class Guard> Row</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>tags</title>
<para>row_type_tag is defined differently for every specialization:<itemizedlist>
<listitem>
<para>all 5 template parameters means a normal transition with
action and guard: <code>typedef row_tag
row_type_tag;</code></para>
</listitem>
<listitem>
<para>Row&lt;Source,Event,Target,none,none> a normal transition
without action or guard: <code>typedef _row_tag
row_type_tag;</code></para>
</listitem>
<listitem>
<para>Row&lt;Source,Event,Target,Action,none> a normal
transition without guard: <code>typedef a_row_tag
row_type_tag;</code></para>
</listitem>
<listitem>
<para>Row&lt;Source,Event,Target,none,Guard> a normal transition
without action: <code>typedef g_row_tag
row_type_tag;</code></para>
</listitem>
<listitem>
<para>Row&lt;Source,Event,none,Action,none> an internal
transition without guard: <code>typedef a_irow_tag
row_type_tag;</code></para>
</listitem>
<listitem>
<para>Row&lt;Source,Event,none,none,Guard> an internal
transition without action: <code>typedef g_irow_tag
row_type_tag;</code></para>
</listitem>
<listitem>
<para>Row&lt;Source,Event,none,none,Guard> an internal
transition with action and guard: <code>typedef irow_tag
row_type_tag;</code></para>
</listitem>
<listitem>
<para>Row&lt;Source,Event,none,none,none> an internal transition
without action or guard: <code>typedef _irow_tag
row_type_tag;</code></para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>methods</title>
<para>Like any other front-end, Row implements the two necessary static
functions for action and guard call. Each function receives as parameter
the (deepest-level) state machine processsing the event, the event
itself, the source and target states and all the states contained in a
state machine.</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class SourceState,class TargetState,
class AllStates> static void action_call</funcdef>
<paramdef>
<funcparams>Fsm&amp; fsm,Event const&amp;
evt,SourceState&amp;,TargetState,AllStates&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class SourceState,class TargetState,
class AllStates> static bool guard_call</funcdef>
<paramdef>
<funcparams>Fsm&amp; fsm,Event const&amp;
evt,SourceState&amp;,TargetState,AllStates&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
</refsect3>
</refsect2>
<refsect2>
<title>Internal</title>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template &lt;class Event,class Action,class Guard>
Internal</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>tags</title>
<para>row_type_tag is defined differently for every specialization:<itemizedlist>
<listitem>
<para>all 3 template parameters means an internal transition
with action and guard: <code>typedef sm_i_row_tag
row_type_tag;</code></para>
</listitem>
<listitem>
<para>Internal&lt;Event,none,none> an internal transition
without action or guard: <code>typedef sm__i_row_tag
row_type_tag;</code></para>
</listitem>
<listitem>
<para>Internal&lt;Event,Action,none> an internal transition
without guard: <code>typedef sm_a_i_row_tag
row_type_tag;</code></para>
</listitem>
<listitem>
<para>Internal&lt;Event,none,Guard> an internal transition
without action: <code>typedef sm_g_i_row_tag
row_type_tag;</code></para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>methods</title>
<para>Like any other front-end, Internal implements the two necessary static
functions for action and guard call. Each function receives as parameter
the (deepest-level) state machine processsing the event, the event
itself, the source and target states and all the states contained in a
state machine.</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class SourceState,class TargetState,
class AllStates> static void action_call</funcdef>
<paramdef>
<funcparams>Fsm&amp; fsm,Event const&amp;
evt,SourceState&amp;,TargetState,AllStates&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class SourceState,class TargetState,
class AllStates> static bool guard_call</funcdef>
<paramdef>
<funcparams>Fsm&amp; fsm,Event const&amp;
evt,SourceState&amp;,TargetState,AllStates&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
</refsect3>
</refsect2>
<refsect2>
<title>ActionSequence_</title>
<para>This functor calls every element of the template Sequence (which are also
callable functors) in turn. It is also the underlying implementation of the
eUML sequence grammar (action1,action2,...).</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template &lt;class Sequence> ActionSequence_</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>methods</title>
<para>This helper functor is made for use in a transition table and in a
state behavior and therefore implements an operator() with 3 and with 4
arguments:</para>
<para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Evt,class Fsm,class
SourceState,class TargetState> operator()</funcdef>
<paramdef>Evt const&amp; ,Fsm&amp; ,SourceState&amp;
,TargetState&amp; </paramdef>
</funcprototype>
</funcsynopsis>
</para>
<para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Evt,class Fsm,class State>
operator()</funcdef>
<paramdef>Evt const&amp;, Fsm&amp;, State&amp;</paramdef>
</funcprototype>
</funcsynopsis>
</para>
</refsect3>
</refsect2>
<refsect2>
<title>Defer</title>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>Defer</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>methods</title>
<para>This helper functor is made for use in a transition table and
therefore implements an operator() with 4 arguments:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Evt,class Fsm,class SourceState,class
TargetState> operator()</funcdef>
<paramdef>Evt const&amp;, Fsm&amp; , SourceState&amp;,
TargetState&amp;</paramdef>
</funcprototype>
</funcsynopsis>
</refsect3>
</refsect2>
</refsect1>
<refsect1>
<title>msm/front/internal_row.hpp</title>
<para>This header implements the internal transition rows for use inside an
internal_transition_table. All these row types have no source or target state,
as the backend will recognize internal transitions from this
internal_transition_table.</para>
<refsect2>
<title>methods</title>
<para>Like any other front-end, the following transition row types implements
the two necessary static functions for action and guard call. Each function
receives as parameter the (deepest-level) state machine processsing the
event, the event itself, the source and target states and all the states
contained in a state machine.</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class SourceState,class TargetState,
class AllStates> static void action_call</funcdef>
<paramdef>
<funcparams>Fsm&amp; fsm,Event const&amp;
evt,SourceState&amp;,TargetState,AllStates&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class SourceState,class TargetState,
class AllStates> static bool guard_call</funcdef>
<paramdef>
<funcparams>Fsm&amp; fsm,Event const&amp;
evt,SourceState&amp;,TargetState,AllStates&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
</refsect2>
<refsect2>
<title>a_internal</title>
<refsect3>
<title>definition</title>
<para>This is an internal transition with an action called during the
transition.</para>
<classsynopsis>
<ooclass>
<classname>template&lt; class Event, class CalledForAction, void
(CalledForAction::*action)(Event const&amp;)>
a_internal</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the internal
transition.</para>
</listitem>
<listitem>
<para>CalledForAction: the type on which the action method will
be called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>action: a pointer to the method which CalledForAction
provides.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
<refsect2>
<title>g_internal</title>
<para>This is an internal transition with a guard called before the transition
and allowing the transition if returning true.</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template&lt; class Event, class CalledForGuard, bool
(CalledForGuard::*guard)(Event const&amp;)>
g_internal</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the internal
transition.</para>
</listitem>
<listitem>
<para>CalledForGuard: the type on which the guard method will be
called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>guard: a pointer to the method which CalledForGuard
provides.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
<refsect2>
<title>internal</title>
<para>This is an internal transition with a guard called before the transition
and allowing the transition if returning true. It also calls an action
called during the transition.</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template&lt; class Event, class CalledForAction, void
(CalledForAction::*action)(Event const&amp;), class
CalledForGuard, bool (CalledForGuard::*guard)(Event const&amp;)>
internal</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the internal transition</para>
</listitem>
<listitem>
<para>CalledForAction: the type on which the action method will
be called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>action: a pointer to the method which CalledForAction
provides.</para>
</listitem>
<listitem>
<para>CalledForGuard: the type on which the guard method will be
called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>guard: a pointer to the method which CalledForGuard
provides.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
<refsect2>
<title>_internal</title>
<para>This is an internal transition without action or guard. This is equivalent
to an explicit "ignore event".</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template&lt; class Event > _internal</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the internal
transition.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
</refsect1>
<refsect1>
<title>msm/front/row2.hpp</title>
<para>This header contains the variants of row2, which are an extension of the
standard row transitions for use in the transition table. They offer the
possibility to define action and guard not only in the state machine, but in any
state of the state machine. They can also be used in internal transition tables
through their irow2 variants.</para>
<refsect2>
<title>methods</title>
<para>Like any other front-end, the following transition row types implements
the two necessary static functions for action and guard call. Each function
receives as parameter the (deepest-level) state machine processsing the
event, the event itself, the source and target states and all the states
contained in a state machine.</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class SourceState,class TargetState,
class AllStates> static void action_call</funcdef>
<paramdef>
<funcparams>Fsm&amp; fsm,Event const&amp;
evt,SourceState&amp;,TargetState,AllStates&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class SourceState,class TargetState,
class AllStates> static bool guard_call</funcdef>
<paramdef>
<funcparams>Fsm&amp; fsm,Event const&amp;
evt,SourceState&amp;,TargetState,AllStates&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
</refsect2>
<refsect2>
<title>_row2</title>
<para>This is a transition without action or guard. The state machine only
changes active state.</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template&lt; class Source, class Event, class Target >
_row2</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>Target: the target state of the transition.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
<refsect2>
<title>a_row2</title>
<para>This is a transition with action and without guard.</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template&lt; class Source, class Event, class Target,
</classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class CalledForAction, void
(CalledForAction::*action)(Event const&amp;) > _row2</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>Target: the target state of the transition.</para>
</listitem>
<listitem>
<para>CalledForAction: the type on which the action method will
be called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>action: a pointer to the method which CalledForAction
provides.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
<refsect2>
<title>g_row2</title>
<para>This is a transition with guard and without action.</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template&lt; class Source, class Event, class Target,
</classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class CalledForGuard, bool (CalledForGuard::*guard)(Event
const&amp;) > _row2</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>Target: the target state of the transition.</para>
</listitem>
<listitem>
<para>CalledForGuard: the type on which the guard method will be
called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>guard: a pointer to the method which CalledForGuard
provides.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
<refsect2>
<title>row2</title>
<para>This is a transition with guard and action.</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template&lt; class Source, class Event, class Target,
</classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class CalledForAction, void
(CalledForAction::*action)(Event const&amp;), </classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class CalledForGuard, bool (CalledForGuard::*guard)(Event
const&amp;) > _row2</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>Target: the target state of the transition.</para>
</listitem>
<listitem>
<para>CalledForAction: the type on which the action method will
be called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>action: a pointer to the method which CalledForAction
provides.</para>
</listitem>
<listitem>
<para>CalledForGuard: the type on which the guard method will be
called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>guard: a pointer to the method which CalledForGuard
provides.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
<refsect2>
<title>a_irow2</title>
<para>This is an internal transition for use inside a transition table, with
action and without guard.</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template&lt; class Source, class Event, </classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class CalledForAction, void
(CalledForAction::*action)(Event const&amp;) > _row2</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>CalledForAction: the type on which the action method will
be called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>action: a pointer to the method which CalledForAction
provides.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
<refsect2>
<title>g_irow2</title>
<para>This is an internal transition for use inside a transition table, with
guard and without action.</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template&lt; class Source, class Event, </classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class CalledForGuard, bool (CalledForGuard::*guard)(Event
const&amp;) > _row2</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>CalledForGuard: the type on which the guard method will be
called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>guard: a pointer to the method which CalledForGuard
provides.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
<refsect2>
<title>irow2</title>
<para>This is an internal transition for use inside a transition table, with
guard and action.</para>
<refsect3>
<title>definition</title>
<classsynopsis>
<ooclass>
<classname>template&lt; class Source, class Event, </classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class CalledForAction, void
(CalledForAction::*action)(Event const&amp;), </classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class CalledForGuard, bool (CalledForGuard::*guard)(Event
const&amp;) > _row2</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>template parameters</title>
<para>
<itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>CalledForAction: the type on which the action method will
be called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>action: a pointer to the method which CalledForAction
provides.</para>
</listitem>
<listitem>
<para>CalledForGuard: the type on which the guard method will be
called. It can be either a state of the containing state
machine or the state machine itself.</para>
</listitem>
<listitem>
<para>guard: a pointer to the method which CalledForGuard
provides.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
</refsect2>
</refsect1>
<refsect1>
<title>msm/front/state_machine_def.hpp</title>
<para>This header provides the implementation of the <command
xlink:href="#basic-front-end">basic front-end</command>. It contains one
type, <code>state_machine_def</code></para>
<refsect2>
<title>state_machine_def definition</title>
<para>This type is the basic class for a basic (or possibly any other)
front-end. It provides the standard row types (which includes internal
transitions) and a default implementation of the required methods and
typedefs.</para>
<classsynopsis>
<ooclass>
<classname>template &lt;class Derived,class BaseState =
default_base_state> state_machine_def</classname>
</ooclass>
</classsynopsis>
<refsect3>
<title>typedefs</title>
<para>
<itemizedlist>
<listitem>
<para>flag_list: by default, no flag is set in the state
machine</para>
</listitem>
<listitem>
<para>deferred_events: by default, no event is deferred.</para>
</listitem>
<listitem>
<para>configuration: by default, no configuration customization
is done.</para>
</listitem>
</itemizedlist>
</para>
</refsect3>
<refsect3>
<title>row methods</title>
<para>Like any other front-end, the following transition row types
implements the two necessary static functions for action and guard call.
Each function receives as parameter the (deepest-level) state machine
processsing the event, the event itself, the source and target states
and all the states contained in a state machine (ignored).</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class SourceState,class TargetState,
class AllStates> static void action_call</funcdef>
<paramdef>
<funcparams>Fsm&amp; fsm,Event const&amp;
evt,SourceState&amp;,TargetState,AllStates&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class SourceState,class TargetState,
class AllStates> static bool guard_call</funcdef>
<paramdef>
<funcparams>Fsm&amp; fsm,Event const&amp;
evt,SourceState&amp;,TargetState,AllStates&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
</refsect3>
<refsect3>
<title>a_row</title>
<para>This is a transition with action and without guard.</para>
<para><ooclass>
<classname>template&lt; class Source, class Event, class Target,
void (Derived::*action)(Event const&amp;) > a_row</classname>
</ooclass><itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>Target: the target state of the transition.</para>
</listitem>
<listitem>
<para>action: a pointer to the method provided by the concrete
front-end (represented by <code>Derived</code>).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>g_row</title>
<para>This is a transition with guard and without action.</para>
<para><ooclass>
<classname>template&lt; class Source, class Event, class Target,
bool (Derived::*guard)(Event const&amp;) > g_row</classname>
</ooclass><itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>Target: the target state of the transition.</para>
</listitem>
<listitem>
<para>guard: a pointer to the method provided by the concrete
front-end (represented by <code>Derived</code>).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>row</title>
<para>This is a transition with guard and action.</para>
<para><ooclass>
<classname>template&lt; class Source, class Event, class Target,
void (Derived::*action)(Event const&amp;), bool
(Derived::*guard)(Event const&amp;) > row</classname>
</ooclass><itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>Target: the target state of the transition.</para>
</listitem>
<listitem>
<para>action: a pointer to the method provided by the concrete
front-end (represented by <code>Derived</code>).</para>
</listitem>
<listitem>
<para>guard: a pointer to the method provided by the concrete
front-end (represented by <code>Derived</code>).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>_row</title>
<para>This is a transition without action or guard. The state machine only
changes active state.</para>
<para><ooclass>
<classname>template&lt; class Source, class Event, class Target >
_row</classname>
</ooclass><itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>Target: the target state of the transition.</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>a_irow</title>
<para>This is an internal transition for use inside a transition table, with
action and without guard.</para>
<para><ooclass>
<classname>template&lt; class Source, class Event, void
(Derived::*action)(Event const&amp;) > a_irow</classname>
</ooclass><itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>action: a pointer to the method provided by the concrete
front-end (represented by <code>Derived</code>).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>g_irow</title>
<para>This is an internal transition for use inside a transition table, with
guard and without action.</para>
<para><ooclass>
<classname>template&lt; class Source, class Event, bool
(Derived::*guard)(Event const&amp;) > g_irow</classname>
</ooclass><itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>guard: a pointer to the method provided by the concrete
front-end (represented by <code>Derived</code>).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>irow</title>
<para>This is an internal transition for use inside a transition table, with
guard and action.</para>
<para><ooclass>
<classname>template&lt; class Source, class Event, void
(Derived::*action)(Event const&amp;), bool
(Derived::*guard)(Event const&amp;) > irow</classname>
</ooclass><itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
<listitem>
<para>action: a pointer to the method provided by the concrete
front-end (represented by <code>Derived</code>).</para>
</listitem>
<listitem>
<para>guard: a pointer to the method provided by the concrete
front-end (represented by <code>Derived</code>).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>_irow</title>
<para>This is an internal transition without action or guard. As it does
nothing, it means "ignore event".</para>
<para><ooclass>
<classname>template&lt; class Source, class Event >
_irow</classname>
</ooclass><itemizedlist>
<listitem>
<para>Event: the event triggering the transition.</para>
</listitem>
<listitem>
<para>Source: the source state of the transition.</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>methods</title>
<para><code>state_machine_def</code> provides a default implementation in
case of an event which cannot be processed by a state machine (no
transition found). The implementation is using a
<code>BOOST_ASSERT</code> so that the error will only be noticed in
debug mode. Overwrite this method in your implementation to change the
behavior.</para>
<para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class Event> static void
no_transition</funcdef>
<paramdef>
<funcparams>Event const&amp; ,Fsm&amp;, int
state</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
</para>
<para><code>state_machine_def</code> provides a default implementation in
case an exception is thrown by a state (entry/exit) or transition
(action/guard) behavior. The implementation is using a
<code>BOOST_ASSERT</code> so that the error will only be noticed in
debug mode. Overwrite this method in your implementation to change the
behavior. This method will be called only if exception handling is not
deactivated (default) by defining
<code>has_no_message_queue</code>.</para>
<para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class Fsm,class Event> static void
exception_caught</funcdef>
<paramdef>
<funcparams>Event const&amp; ,Fsm&amp;,
std::exception&amp;</funcparams>
</paramdef>
</funcprototype>
</funcsynopsis>
</para>
</refsect3>
</refsect2>
</refsect1>
<refsect1>
<title>msm/front/states.hpp </title>
<para>This header provides the different states (except state machines) for the
basic front-end (or mixed with other front-ends).</para>
<refsect2>
<title>types</title>
<para>This header provides the following types:</para>
<refsect3>
<title>no_sm_ptr</title>
<para>deprecated: default policy for states. It means that states do not
need to save a pointer to their containing state machine.</para>
</refsect3>
<refsect3>
<title>sm_ptr</title>
<para>deprecated: state policy. It means that states need to save a pointer
to their containing state machine. When seeing this flag, the back-end
will call set_sm_ptr(fsm*) and give itself as argument.</para>
</refsect3>
<refsect3>
<title>state</title>
<para>Basic type for simple states. Inherit from this type to define a
simple state. The first argument is needed if you want your state (and
all others used in a concrete state machine) to inherit a basic type for
logging or providing a common behavior.</para>
<classsynopsis>
<ooclass>
<classname>template&lt;class Base = default_base_state,class
SMPtrPolicy = no_sm_ptr> state</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>terminate_state</title>
<para>Basic type for terminate states. Inherit from this type to define a
terminate state. The first argument is needed if you want your state
(and all others used in a concrete state machine) to inherit a basic
type for logging or providing a common behavior.</para>
<classsynopsis>
<ooclass>
<classname>template&lt;class Base = default_base_state,class
SMPtrPolicy = no_sm_ptr> terminate_state</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>interrupt_state</title>
<para>Basic type for interrupt states. Interrupt states prevent any further
event handling until EndInterruptEvent is sent. Inherit from this type
to define a terminate state. The first argument is the name of the event
ending the interrupt. The second argument is needed if you want your
state (and all others used in a concrete state machine) to inherit a
basic type for logging or providing a common behavior.</para>
<classsynopsis>
<ooclass>
<classname>template&lt;class EndInterruptEvent,class Base =
default_base_state,</classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class SMPtrPolicy = no_sm_ptr>
interrupt_state</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>explicit_entry</title>
<para>Inherit from this type <emphasis role="underline">in
addition</emphasis> to the desired state type to enable this state
for direct entering. The template parameter gives the region id of the
state (regions are numbered in the order of the
<code>initial_state</code> typedef).</para>
<classsynopsis>
<ooclass>
<classname>template &lt;int ZoneIndex=-1> explicit_entry</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>entry_pseudo_state</title>
<para>Basic type for entry pseudo states. Entry pseudo states are an
predefined entry into a submachine and connect two transitions. The
first argument is the id of the region entered by this state (regions
are numbered in the order of the <code>initial_state</code> typedef).
The second argument is needed if you want your state (and all others
used in a concrete state machine) to inherit a basic type for logging or
providing a common behavior.</para>
<classsynopsis>
<ooclass>
<classname>template&lt;int RegionIndex=-1,class Base =
default_base_state,</classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class SMPtrPolicy = no_sm_ptr>
entry_pseudo_state</classname>
</ooclass>
</classsynopsis>
</refsect3>
<refsect3>
<title>exit_pseudo_state</title>
<para>Basic type for exit pseudo states. Exit pseudo states are an
predefined exit from a submachine and connect two transitions. The first
argument is the name of the event which will be "thrown" out of the exit
point. This event does not need to be the same as the one sent by the
inner region but must be convertible from it. The second argument is
needed if you want your state (and all others used in a concrete state
machine) to inherit a basic type for logging or providing a common
behavior.</para>
<classsynopsis>
<ooclass>
<classname>template&lt;class Event,class Base =
default_base_state,</classname>
</ooclass>
</classsynopsis>
<classsynopsis>
<ooclass>
<classname>class SMPtrPolicy = no_sm_ptr>
exit_pseudo_state</classname>
</ooclass>
</classsynopsis>
</refsect3>
</refsect2>
</refsect1>
<refsect1>
<title>msm/front/euml/euml.hpp</title>
<para>This header includes all of eUML except the STL functors.</para>
</refsect1>
<refsect1>
<title>msm/front/euml/stl.hpp</title>
<para>This header includes all the functors for STL support in eUML. These <command
xlink:href="#eUML-STL-all">tables</command> show a full description.</para>
</refsect1>
<refsect1>
<title>msm/front/euml/algorithm.hpp</title>
<para>This header includes all the functors for STL algorithms support in eUML.
These <command xlink:href="#eUML-STL-all">tables</command> show a full
description.</para>
</refsect1>
<refsect1>
<title>msm/front/euml/iteration.hpp</title>
<para>This header includes iteration functors for STL support in eUML. This <command
xlink:href="#eUML-STL-iteration">tables</command> shows a full
description.</para>
</refsect1>
<refsect1>
<title>msm/front/euml/querying.hpp</title>
<para>This header includes querying functors for STL support in eUML. This <command
xlink:href="#eUML-STL-querying">tables</command> shows a full
description.</para>
</refsect1>
<refsect1>
<title>msm/front/euml/transformation.hpp</title>
<para>This header includes transformation functors for STL support in eUML. This
<command xlink:href="#eUML-STL-transformation">tables</command> shows a full
description.</para>
</refsect1>
<refsect1>
<title>msm/front/euml/container.hpp</title>
<para>This header includes container functors for STL support in eUML (functors
calling container methods). This <command xlink:href="#eUML-STL-container"
>tables</command> shows a full description. It also provides npos for
strings.</para>
<refsect2>
<title>Npos_&lt;container type></title>
<para>Functor returning npos for transition or state behaviors. Like all
constants, only the functor form exists, so parenthesis are necessary.
Example:</para>
<para><code>string_find_(event_(m_song),Char_&lt;'S'>(),Size_t_&lt;0>()) !=
Npos_&lt;string>() // compare result of string::find with
npos</code></para>
</refsect2>
</refsect1>
<refsect1>
<title>msm/front/euml/stt_grammar.hpp</title>
<para>This header provides the transition table grammars. This includes internal
transition tables.</para>
<refsect2>
<title>functions</title>
<refsect3>
<title>build_stt</title>
<para>The function build_stt evaluates the grammar-conform expression as
parameter. It returns a transition table, which is a mpl::vector of
transitions (rows) or, if the expression is ill-formed (does not match
the grammar), the type <code>invalid_type</code>, which will lead to a
compile-time static assertion when this transition table is passed to a
state machine. </para>
<funcsynopsis>
<funcprototype>
<funcdef>template&lt;class Expr> [mpl::vector&lt;...> /
msm::front::euml::invalid_type] build_stt</funcdef>
<paramdef>Expr const&amp; expr</paramdef>
</funcprototype>
</funcsynopsis>
</refsect3>
<refsect3>
<title>build_internal_stt</title>
<para>The function build_internal_stt evaluates the grammar-conform
expression as parameter. It returns a transition table, which is a
mpl::vector of transitions (rows) or, if the expression is ill-formed
(does not match the grammar), the type <code>invalid_type</code>, which
will lead to a compile-time static assertion when this transition table
is passed to a state machine. </para>
<funcsynopsis>
<funcprototype>
<funcdef>template&lt;class Expr> [mpl::vector&lt;...> /
msm::front::euml::invalid_type] build_internal_stt</funcdef>
<paramdef>Expr const&amp; expr</paramdef>
</funcprototype>
</funcsynopsis>
</refsect3>
</refsect2>
<refsect2>
<title>grammars</title>
<refsect3>
<title><command xml:id="reference-stt-grammar">transition
table</command></title>
<para>The transition table accepts the following grammar:</para>
<programlisting>Stt := Row | (Stt ',' Stt)
Row := (Target '==' (SourcePlusEvent)) /* first syntax*/
| ( (SourcePlusEvent) '==' Target ) /* second syntax*/
| (SourcePlusEvent) /* internal transitions */
SourcePlusEvent := (BuildSource '+' BuildEvent)/* standard transition*/
| (BuildSource) /* anonymous transition */
BuildSource := state_tag | (state_tag '/' Action) | (state_tag '[' Guard ']')
| (state_tag '[' Guard ']' '/' Action)
BuildEvent := event_tag | (event_tag '/' Action) | (event_tag '[' Guard ']')
| (event_tag '[' Guard ']' '/' Action)</programlisting>
<para>The grammars Action and Guard are defined in state_grammar.hpp and
guard_grammar.hpp respectively. state_tag and event_tag are inherited
from euml_state (or other state variants) and euml_event respectively.
For example, following declarations are possible:</para>
<programlisting>target == source + event [guard] / action,
source + event [guard] / action == target,
source + event [guard] / (action1,action2) == target,
target == source + event [guard] / (action1,action2),
target == source + event,
source + event == target,
target == source + event [guard],
source + event [guard] == target,
target == source + event / action,
source + event /action == target,
source / action == target, /*anonymous transition*/
target == source / action, /*anonymous transition*/
source + event /action, /* internal transition*/</programlisting>
</refsect3>
<refsect3>
<title>internal transition table</title>
<para>The internal transition table accepts the following grammar:</para>
<programlisting>IStt := BuildEvent | (IStt ',' IStt)</programlisting>
<para>BuildEvent being defined for both internal and standard transition
tables.</para>
</refsect3>
</refsect2>
</refsect1>
<refsect1>
<title>msm/front/euml/guard_grammar.hpp</title>
<para>This header contains the <code>Guard</code> grammar used in the previous
section. This grammar is long but pretty simple:</para>
<programlisting>Guard := action_tag | (Guard '&amp;&amp;' Guard)
| (Guard '||' Guard) | ... /* operators*/
| (if_then_else_(Guard,Guard,Guard)) | (function (Action,...Action))</programlisting>
<para>Most C++ operators are supported (address-of is not). With
<code>function</code> is meant any eUML predefined function or any self-made
(using <code>MSM_EUML_METHOD</code> or <code>MSM_EUML_FUNCTION</code>). Action
is a grammar defined in state_grammar.hpp.</para>
</refsect1>
<refsect1>
<title>msm/front/euml/state_grammar.hpp</title>
<para>This header provides the grammar for actions and the different grammars and
functions to build states using eUML.</para>
<refsect2>
<title>action grammar</title>
<para>Like the guard grammar, this grammar supports relevant C++ operators and
eUML functions:</para>
<programlisting>Action := action_tag | (Action '+' Action)
| ('--' Action) | ... /* operators*/
| if_then_else_(Guard,Action,Action) | if_then_(Action)
| while_(Guard,Action)
| do_while_(Guard,Action) | for_(Action,Guard,Action,Action)
| (function(Action,...Action))
ActionSequence := Action | (Action ',' Action)</programlisting>
<para>Relevant operators are: ++ (post/pre), -- (post/pre), dereferencing, +
(unary/binary), - (unary/binary), *, /, %, &amp;(bitwise), | (bitwise),
^(bitwise), +=, -=, *=, /=, %=, &lt;&lt;=, >>=, &lt;&lt;, >>, =, [].</para>
</refsect2>
<refsect2>
<title>attributes</title>
<para>This grammar is used to add attributes to states (or state machines) or
events: It evaluates to a fusion::map. You can use two forms:<itemizedlist>
<listitem>
<para><code>attributes_ &lt;&lt; no_attributes_</code></para>
</listitem>
<listitem>
<para><code>attributes_ &lt;&lt; attribute_1 &lt;&lt; ... &lt;&lt;
attribute_n</code></para>
</listitem>
</itemizedlist></para>
<para>Attributes can be of any default-constructible type (fusion
requirement).</para>
</refsect2>
<refsect2>
<title>configure</title>
<para>This grammar also has two forms:<itemizedlist>
<listitem>
<para><code>configure_ &lt;&lt; no_configure_</code></para>
</listitem>
<listitem>
<para><code>configure_ &lt;&lt; type_1 &lt;&lt; ... &lt;&lt;
type_n</code></para>
</listitem>
</itemizedlist></para>
<para>This grammar is used to create inside one syntax:<itemizedlist>
<listitem>
<para>flags: <code>configure_ &lt;&lt; some_flag</code> where
some_flag inherits from <code>euml_flag&lt;some_flag></code> or
is defined using BOOST_MSM_EUML_FLAG.</para>
</listitem>
<listitem>
<para>deferred events: <code>configure_ &lt;&lt; some_event</code>
where some_event inherits from
<code>euml_event&lt;some_event></code> or is defined using
BOOST_MSM_EUML_EVENT or
BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES.</para>
</listitem>
<listitem>
<para>configuration (message queue, manual deferring, exception
handling): <code>configure_ &lt;&lt; some_config</code> where
some_config inherits from
<code>euml_config&lt;some_config></code>. At the moment,
three predefined objects exist (in msm//front/euml/common.hpp):<itemizedlist>
<listitem>
<para>no_exception: disable catching exceptions</para>
</listitem>
<listitem>
<para>no_msg_queue: disable message queue</para>
</listitem>
<listitem>
<para>deferred_events: manually enable handling of
deferred events</para>
</listitem>
</itemizedlist></para>
</listitem>
</itemizedlist></para>
</refsect2>
<refsect2>
<title>initial states</title>
<para>The grammar to define initial states for a state machine is: <code>init_
&lt;&lt; state_1 &lt;&lt; ... &lt;&lt; state_n</code> where
state_1...state_n inherit from euml_state or is defined using
BOOST_MSM_EUML_STATE, BOOST_MSM_EUML_INTERRUPT_STATE,
BOOST_MSM_EUML_TERMINATE_STATE, BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE,
BOOST_MSM_EUML_ENTRY_STATE or BOOST_MSM_EUML_EXIT_STATE.</para>
</refsect2>
<refsect2>
<title>functions</title>
<refsect3>
<title>build_sm</title>
<para>This function has several overloads. The return type is not relevant
to you as only decltype (return type) is what one needs.</para>
<para>Defines a state machine without entry or exit:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Stt,class Init>
func_state_machine&lt;...> build_sm</funcdef>
<paramdef>Stt ,Init</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines a state machine with entry behavior:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Stt,class Init,class
Expr1> func_state_machine&lt;...> build_sm</funcdef>
<paramdef>Stt ,Init,Expr1 const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines a state machine with entry and exit behaviors:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Stt,class Init,class
Expr1, class Expr2> func_state_machine&lt;...>
build_sm</funcdef>
<paramdef>Stt ,Init,Expr1 const&amp;,Expr2 const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines a state machine with entry, exit behaviors and
attributes:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Stt,class Init,class
Expr1, class Expr2, class Attributes> func_state_machine&lt;...>
build_sm</funcdef>
<paramdef>Stt ,Init,Expr1 const&amp;, Expr2 const&amp;, Attributes
const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines a state machine with entry, exit behaviors, attributes and
configuration (deferred events, flags):</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Stt,class Init,class
Expr1, class Expr2, class Attributes, class Configure>
func_state_machine&lt;...> build_sm</funcdef>
<paramdef>Stt ,Init,Expr1 const&amp;, Expr2 const&amp;, Attributes
const&amp;, Configure const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines a state machine with entry, exit behaviors, attributes,
configuration (deferred events, flags) and a base state:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Stt,class Init,class
Expr1, class Expr2, class Attributes, class Configure, class
Base> func_state_machine&lt;...> build_sm</funcdef>
<paramdef>Stt ,Init,Expr1 const&amp;, Expr2 const&amp;, Attributes
const&amp;, Configure const&amp;, Base</paramdef>
</funcprototype>
</funcsynopsis>
<para>Notice that this function requires the extra parameter class
StateNameTag to disambiguate state machines having the same parameters
but still being different.</para>
</refsect3>
<refsect3>
<title>build_state</title>
<para>This function has several overloads. The return type is not relevant
to you as only decltype (return type) is what one needs.</para>
<para>Defines a simple state without entry or exit:</para>
<funcsynopsis>
<funcprototype>
<funcdef>func_state&lt;class StateNameTag,...> build_state</funcdef>
<paramdef/>
</funcprototype>
</funcsynopsis>
<para>Defines a simple state with entry behavior:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Expr1>
func_state&lt;...> build_state</funcdef>
<paramdef>Expr1 const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines a simple state with entry and exit behaviors:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Expr1, class Expr2>
func_state&lt;...> build_state</funcdef>
<paramdef>Expr1 const&amp;,Expr2 const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines a simple state with entry, exit behaviors and
attributes:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Expr1, class Expr2,
class Attributes> func_state&lt;...> build_state</funcdef>
<paramdef>Expr1 const&amp;, Expr2 const&amp;, Attributes
const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines a simple state with entry, exit behaviors, attributes and
configuration (deferred events, flags):</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Expr1, class Expr2,
class Attributes, class Configure> func_state&lt;...>
build_state</funcdef>
<paramdef>Expr1 const&amp;, Expr2 const&amp;, Attributes const&amp;,
Configure const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines a simple state with entry, exit behaviors, attributes,
configuration (deferred events, flags) and a base state:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Expr1, class Expr2,
class Attributes, class Configure, class Base>
func_state&lt;...> build_state</funcdef>
<paramdef>Expr1 const&amp;, Expr2 const&amp;, Attributes const&amp;,
Configure const&amp;, Base</paramdef>
</funcprototype>
</funcsynopsis>
<para>Notice that this function requires the extra parameter class
StateNameTag to disambiguate states having the same parameters but still
being different.</para>
</refsect3>
<refsect3>
<title>build_terminate_state</title>
<para>This function has the same overloads as build_state.</para>
</refsect3>
<refsect3>
<title>build_interrupt_state</title>
<para>This function has several overloads. The return type is not relevant
to you as only decltype (return type) is what one needs.</para>
<para>Defines an interrupt state without entry or exit:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class EndInterruptEvent>
func_state&lt;...> build_interrupt_state</funcdef>
<paramdef>EndInterruptEvent const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an interrupt state with entry behavior:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class
EndInterruptEvent,class Expr1> func_state&lt;...>
build_interrupt_state</funcdef>
<paramdef>EndInterruptEvent const&amp;,Expr1 const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an interrupt state with entry and exit behaviors:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class
EndInterruptEvent,class Expr1, class Expr2> func_state&lt;...>
build_interrupt_state</funcdef>
<paramdef>EndInterruptEvent const&amp;,Expr1 const&amp;,Expr2
const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an interrupt state with entry, exit behaviors and
attributes:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class
EndInterruptEvent,class Expr1, class Expr2, class Attributes>
func_state&lt;...> build_interrupt_state</funcdef>
<paramdef>EndInterruptEvent const&amp;,Expr1 const&amp;, Expr2
const&amp;, Attributes const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an interrupt state with entry, exit behaviors, attributes and
configuration (deferred events, flags):</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class
EndInterruptEvent,class Expr1, class Expr2, class Attributes,
class Configure> func_state&lt;...>
build_interrupt_state</funcdef>
<paramdef>EndInterruptEvent const&amp;,Expr1 const&amp;, Expr2
const&amp;, Attributes const&amp;, Configure
const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an interrupt state with entry, exit behaviors, attributes,
configuration (deferred events, flags) and a base state:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class
EndInterruptEvent,class Expr1, class Expr2, class Attributes,
class Configure, class Base> func_state&lt;...>
build_interrupt_state</funcdef>
<paramdef>EndInterruptEvent const&amp;,Expr1 const&amp;, Expr2
const&amp;, Attributes const&amp;, Configure const&amp;,
Base</paramdef>
</funcprototype>
</funcsynopsis>
<para>Notice that this function requires the extra parameter class
StateNameTag to disambiguate states having the same parameters but still
being different.</para>
</refsect3>
<refsect3>
<title>build_entry_state</title>
<para>This function has several overloads. The return type is not relevant
to you as only decltype (return type) is what one needs.</para>
<para>Defines an entry pseudo state without entry or exit:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,int RegionIndex>
entry_func_state&lt;...> build_entry_state</funcdef>
<paramdef/>
</funcprototype>
</funcsynopsis>
<para>Defines an entry pseudo state with entry behavior:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,int RegionIndex,class
Expr1> entry_func_state&lt;...> build_entry_state</funcdef>
<paramdef>Expr1 const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an entry pseudo state with entry and exit behaviors:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,int RegionIndex,class
Expr1, class Expr2> entry_func_state&lt;...>
build_entry_state</funcdef>
<paramdef>Expr1 const&amp;,Expr2 const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an entry pseudo state with entry, exit behaviors and
attributes:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,int RegionIndex,class
Expr1, class Expr2, class Attributes> entry_func_state&lt;...>
build_entry_state</funcdef>
<paramdef>Expr1 const&amp;, Expr2 const&amp;, Attributes
const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an entry pseudo state with entry, exit behaviors, attributes
and configuration (deferred events, flags):</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,int RegionIndex,class
Expr1, class Expr2, class Attributes, class Configure>
entry_func_state&lt;...> build_entry_state</funcdef>
<paramdef>Expr1 const&amp;, Expr2 const&amp;, Attributes const&amp;,
Configure const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an entry pseudo state with entry, exit behaviors, attributes,
configuration (deferred events, flags) and a base state:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,int RegionIndex,class
Expr1, class Expr2, class Attributes, class Configure, class
Base> entry_func_state&lt;...> build_entry_state</funcdef>
<paramdef>Expr1 const&amp;, Expr2 const&amp;, Attributes const&amp;,
Configure const&amp;, Base</paramdef>
</funcprototype>
</funcsynopsis>
<para>Notice that this function requires the extra parameter class
StateNameTag to disambiguate states having the same parameters but still
being different.</para>
</refsect3>
<refsect3>
<title>build_exit_state</title>
<para>This function has several overloads. The return type is not relevant
to you as only decltype (return type) is what one needs.</para>
<para>Defines an exit pseudo state without entry or exit:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Event>
exit_func_state&lt;...> build_exit_state</funcdef>
<paramdef>Event const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an exit pseudo state with entry behavior:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Event,class Expr1>
exit_func_state&lt;...> build_exit_state</funcdef>
<paramdef>Event const&amp;,Expr1 const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an exit pseudo state with entry and exit behaviors:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Event,class Expr1,
class Expr2> exit_func_state&lt;...> build_exit_state</funcdef>
<paramdef>Event const&amp;,Expr1 const&amp;,Expr2
const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an exit pseudo state with entry, exit behaviors and
attributes:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Event,class Expr1,
class Expr2, class Attributes> exit_func_state&lt;...>
build_exit_state</funcdef>
<paramdef>Event const&amp;,Expr1 const&amp;, Expr2 const&amp;,
Attributes const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an exit pseudo state with entry, exit behaviors, attributes
and configuration (deferred events, flags):</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Event,class Expr1,
class Expr2, class Attributes, class Configure>
exit_func_state&lt;...> build_exit_state</funcdef>
<paramdef>Event const&amp;,Expr1 const&amp;, Expr2 const&amp;,
Attributes const&amp;, Configure const&amp;</paramdef>
</funcprototype>
</funcsynopsis>
<para>Defines an exit pseudo state with entry, exit behaviors, attributes,
configuration (deferred events, flags) and a base state:</para>
<funcsynopsis>
<funcprototype>
<funcdef>template &lt;class StateNameTag,class Event,class Expr1,
class Expr2, class Attributes, class Configure, class Base>
exit_func_state&lt;...> build_exit_state</funcdef>
<paramdef>Event const&amp;,Expr1 const&amp;, Expr2 const&amp;,
Attributes const&amp;, Configure const&amp;, Base</paramdef>
</funcprototype>
</funcsynopsis>
<para>Notice that this function requires the extra parameter class
StateNameTag to disambiguate states having the same parameters but still
being different.</para>
</refsect3>
<refsect3>
<title>build_explicit_entry_state</title>
<para>This function has the same overloads as build_entry_state and
explicit_entry_func_state as return type.</para>
</refsect3>
</refsect2>
</refsect1>
<refsect1>
<title>msm/front/euml/common.hpp</title>
<refsect2>
<title>types</title>
<refsect3>
<title>euml_event</title>
<para>The basic type for events with eUML.</para>
<classsynopsis>
<ooclass>
<classname>template &lt;class EventName> euml_event;</classname>
</ooclass>
</classsynopsis>
<programlisting>struct play : euml_event&lt;play>{};</programlisting>
</refsect3>
<refsect3>
<title>euml_state</title>
<para>The basic type for states with eUML. You will usually not use this
type directly as it is easier to use BOOST_MSM_EUML_STATE,
BOOST_MSM_EUML_INTERRUPT_STATE, BOOST_MSM_EUML_TERMINATE_STATE,
BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE, BOOST_MSM_EUML_ENTRY_STATE or
BOOST_MSM_EUML_EXIT_STATE.</para>
<classsynopsis>
<ooclass>
<classname>template &lt;class StateName> euml_state;</classname>
</ooclass>
</classsynopsis>
<para>You can however use this type directly if you want to provide your
state with extra functions or provide entry or exit behaviors without
functors, for example:</para>
<programlisting>struct Empty : public msm::front::state&lt;> , public euml_state&lt;Empty>
{
void foo() {...}
template &lt;class Event,class Fsm>
void on_entry(Event const&amp; evt,Fsm&amp; fsm){...}
};</programlisting>
</refsect3>
<refsect3>
<title>euml_flag</title>
<para>The basic type for flags with eUML.</para>
<classsynopsis>
<ooclass>
<classname>template &lt;class FlagName> euml_flag;</classname>
</ooclass>
</classsynopsis>
<programlisting>struct PlayingPaused: euml_flag&lt;PlayingPaused>{};</programlisting>
</refsect3>
<refsect3>
<title>euml_action</title>
<para>The basic type for state or transition behaviors and guards with
eUML.</para>
<classsynopsis>
<ooclass>
<classname>template &lt;class AcionName> euml_action;</classname>
</ooclass>
</classsynopsis>
<programlisting>struct close_drawer : euml_action&lt;close_drawer>
{
template &lt;class Fsm,class Evt,class SourceState,class TargetState>
void operator()(Evt const&amp; , Fsm&amp;, SourceState&amp; ,TargetState&amp; ) {...}
};</programlisting>
<para>Or, as state entry or exit behavior:</para>
<programlisting>struct Playing_Entry : euml_action&lt;Playing_Entry>
{
template &lt;class Event,class Fsm,class State>
void operator()(Event const&amp;,Fsm&amp; fsm,State&amp; ){...}
};</programlisting>
</refsect3>
<refsect3>
<title>euml_config</title>
<para>The basic type for configuration possibilities with eUML.</para>
<classsynopsis>
<ooclass>
<classname>template &lt;class ConfigName> euml_config;</classname>
</ooclass>
</classsynopsis>
<para>You normally do not use this type directly but instead the instances
of predefined configuration:<itemizedlist>
<listitem>
<para>no_exception: disable catching exceptions</para>
</listitem>
<listitem>
<para>no_msg_queue: disable message queue. The message queue
allows you to send an event for procesing while in an event
processing.</para>
</listitem>
<listitem>
<para>deferred_events: manually enable handling of deferred
events</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>invalid_type</title>
<para>Type returned by grammar parsers if the grammar is invalid. Seeing
this type will result in a static assertion.</para>
</refsect3>
<refsect3>
<title>no_action</title>
<para>Placeholder type for use in entry/exit or transition behaviors, which
does absolutely nothing.</para>
</refsect3>
<refsect3>
<title>source_</title>
<para>Generic object or function for the source state of a given transition:<itemizedlist>
<listitem>
<para>as object: returns by reference the source state of a
transition, usually to be used by another function (usually
one created by MSM_EUML_METHOD or MSM_EUML_FUNCTION).</para>
<para>Example:
<programlisting>some_user_function_(source_)</programlisting></para>
</listitem>
<listitem>
<para>as function: returns by reference the attribute passed as
parameter.</para>
<para>Example:
<programlisting>source_(m_counter)++</programlisting></para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>target_</title>
<para>Generic object or function for the target state of a given transition:<itemizedlist>
<listitem>
<para>as object: returns by reference the target state of a
transition, usually to be used by another function (usually
one created by MSM_EUML_METHOD or MSM_EUML_FUNCTION).</para>
<para>Example:
<programlisting>some_user_function_(target_)</programlisting></para>
</listitem>
<listitem>
<para>as function: returns by reference the attribute passed as
parameter.</para>
<para>Example:
<programlisting>target_(m_counter)++</programlisting></para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>state_</title>
<para>Generic object or function for the state of a given entry / exit
behavior. state_ means source_ while in the context of an exit behavior
and target_ in the context of an entry behavior:<itemizedlist>
<listitem>
<para>as object: returns by reference the current state, usually
to be used by another function (usually one created by
MSM_EUML_METHOD or MSM_EUML_FUNCTION).</para>
<para>Example:
<programlisting>some_user_function_(state_) // calls some_user_function on the current state</programlisting></para>
</listitem>
<listitem>
<para>as function: returns by reference the attribute passed as
parameter.</para>
<para>Example:
<programlisting>state_(m_counter)++</programlisting></para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>event_</title>
<para>Generic object or function for the event triggering a given transition
(valid in a transition behavior, as well as in state entry/exit behaviors):<itemizedlist>
<listitem>
<para>as object: returns by reference the event of a transition,
usually to be used by another function (usually one created
by MSM_EUML_METHOD or MSM_EUML_FUNCTION).</para>
<para>Example:
<programlisting>some_user_function_(event_)</programlisting></para>
</listitem>
<listitem>
<para>as function: returns by reference the attribute passed as
parameter.</para>
<para>Example:
<programlisting>event_(m_counter)++</programlisting></para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>fsm_</title>
<para>Generic object or function for the state machine containing a given transition:<itemizedlist>
<listitem>
<para>as object: returns by reference the event of a transition,
usually to be used by another function (usually one created
by MSM_EUML_METHOD or MSM_EUML_FUNCTION).</para>
<para>Example:
<programlisting>some_user_function_(fsm_)</programlisting></para>
</listitem>
<listitem>
<para>as function: returns by reference the attribute passed as
parameter.</para>
<para>Example:
<programlisting>fsm_(m_counter)++</programlisting></para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>substate_</title>
<para>Generic object or function returning a state of a given state machine:<itemizedlist>
<listitem>
<para>with 1 parameter: returns by reference the state passed as
parameter, usually to be used by another function (usually
one created by MSM_EUML_METHOD or MSM_EUML_FUNCTION).</para>
<para>Example:
<programlisting>some_user_function_(substate_(my_state))</programlisting></para>
</listitem>
<listitem>
<para>with 2 parameters: returns by reference the state passed
as first parameter from the state machine passed as second
parameter, usually to be used by another function (usually
one created by MSM_EUML_METHOD or MSM_EUML_FUNCTION). This
makes sense when used in combination with attribute_.</para>
<para>Example (equivalent to the previous example):
<programlisting>some_user_function_(substate_(my_state,fsm_))</programlisting></para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>attribute_</title>
<para>Generic object or function returning the attribute passed (by name) as
second parameter of the thing passed as first (a state, event or state
machine). Example: </para>
<para>
<programlisting>attribute_(substate_(my_state),cd_name_attribute)++</programlisting>
</para>
</refsect3>
<refsect3>
<title>True_</title>
<para>Functor returning true for transition or state behaviors. Like all
constants, only the functor form exists, so parenthesis are necessary.
Example:</para>
<para>
<programlisting>if_then_(True_(),/* some action always called*/)</programlisting>
</para>
</refsect3>
<refsect3>
<title>False_</title>
<para>Functor returning false for transition or state behaviors. Like all
constants, only the functor form exists, so parenthesis are necessary.
Example:</para>
<para>
<programlisting>if_then_(False_(),/* some action never called */)</programlisting>
</para>
</refsect3>
<refsect3>
<title>Int_&lt;int value></title>
<para>Functor returning an integer value for transition or state behaviors.
Like all constants, only the functor form exists, so parenthesis are
necessary. Example:</para>
<para>
<programlisting>target_(m_ringing_cpt) = Int_&lt;RINGING_TIME>() // RINGING_TIME is a constant</programlisting>
</para>
</refsect3>
<refsect3>
<title>Char_&lt;char value></title>
<para>Functor returning a char value for transition or state behaviors. Like
all constants, only the functor form exists, so parenthesis are
necessary. Example:</para>
<para>
<programlisting>// look for 'S' in event.m_song
[string_find_(event_(m_song),Char_&lt;'S'>(),Size_t_&lt;0>()) != Npos_&lt;string>()]</programlisting>
</para>
</refsect3>
<refsect3>
<title>Size_t_&lt;size_t value></title>
<para>Functor returning a size_t value for transition or state behaviors.
Like all constants, only the functor form exists, so parenthesis are
necessary. Example:</para>
<para>
<programlisting>substr_(event_(m_song),Size_t_&lt;1>()) // returns a substring of event.m_song</programlisting>
</para>
</refsect3>
<refsect3>
<title>String_ &lt; mpl::string ></title>
<para>Functor returning a string for transition or state behaviors. Like all
constants, only the functor form exists, so parenthesis are necessary.
Requires boost >= 1.40 for mpl::string.</para>
<para>Example:</para>
<para>
<programlisting>// adds "Let it be" to fsm.m_src_container
push_back_(fsm_(m_src_container), String_&lt;mpl::string&lt;'Let','it ','be'> >())</programlisting>
</para>
</refsect3>
<refsect3>
<title>Predicate_ &lt; some_stl_compatible_functor ></title>
<para>This functor eUML-enables a STL functor (for use in an algorithm).
This is necessary because all what is in the transition table must be a
eUML terminal.</para>
<para>Example:</para>
<programlisting>//equivalent to:
//std::accumulate(fsm.m_vec.begin(),fsm.m_vec.end(),1,std::plus&lt;int>())== 1
accumulate_(begin_(fsm_(m_vec)),end_(fsm_(m_vec)),Int_&lt;1>(),
Predicate_&lt;std::plus&lt;int> >()) == Int_&lt;1>())</programlisting>
</refsect3>
<refsect3>
<title>process_</title>
<para>This function sends an event to up to 4 state machines by calling
<code>process_event</code> on them:<itemizedlist>
<listitem>
<para><code>process_(some_event)</code> : processes an event in
the current (containing) state machine.</para>
</listitem>
<listitem>
<para><code>process_(some_event [,fsm1...fsm4] )</code> :
processes the same event in the 1-4 state machines passed as
argument.</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>process2_</title>
<para>This function sends an event to up to 3 state machines by calling
<code>process_event</code> on them and copy-constructing the event
from the data passed as second parameter:<itemizedlist>
<listitem>
<para><code>process2_(some_event, some_data)</code> : processes
an event in the current (containing) state machine.</para>
</listitem>
<listitem>
<para><code>process2_(some_event, some_data [,fsm1...fsm3]
)</code> : processes the same event in the 1-3 state
machines passed as argument.</para>
</listitem>
</itemizedlist></para>
<para>Example: </para>
<para>
<programlisting>// processes NotFound on current state machine,
// copy-constructed with event.m_song
process2_(NotFound,event_(m_song))</programlisting>
</para>
<para>With the following definitions:</para>
<programlisting>BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::string,m_song)//declaration of m_song
NotFound (const string&amp; data) // copy-constructor of NotFound</programlisting>
</refsect3>
<refsect3>
<title>is_flag_</title>
<para>This function tells if a flag is active by calling
<code>is_flag_active</code> on the current state machine or one
passed as parameter:<itemizedlist>
<listitem>
<para><code>is_flag_(some_flag)</code> : calls
<code>is_flag_active</code> on the current (containing)
state machine.</para>
</listitem>
<listitem>
<para><code>is_flag_(some_flag, some_fsm)</code> :calls
<code>is_flag_active</code> on the state machine.passed
as argument.</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>defer_</title>
<para>This object defers the current event by calling
<code>defer_event</code> on the current state machine.
Example:</para>
<programlisting>Empty() + play() / defer_</programlisting>
</refsect3>
<refsect3>
<title>explicit_(submachine-name,state-name)</title>
<para>Used as transition's target, causes an explicit entry into the given
state from the given submachine. Several explicit_ as targets, separated
by commas, means a fork. The state must have been declared as such using
BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE.</para>
</refsect3>
<refsect3>
<title>entry_pt_(submachine-name,state-name)</title>
<para>Used as transition's target from a containing state machine, causes
submachine-name to be entered using the given entry pseudo-state. This
state must have been declared as pseudo entry using
BOOST_MSM_EUML_ENTRY_STATE.</para>
</refsect3>
<refsect3>
<title>exit_pt_(submachine-name,state-name)</title>
<para>Used as transition's source from a containing state machine, causes
submachine-name to be left using the given exit pseudo-state. This state
must have been declared as pseudo exit using
BOOST_MSM_EUML_EXIT_STATE.</para>
</refsect3>
<refsect3>
<title>MSM_EUML_FUNCTION</title>
<para>This macro creates a eUML function and a functor for use with the
functor front-end, based on a free function:<itemizedlist>
<listitem>
<para>first parameter: the name of the functor</para>
</listitem>
<listitem>
<para>second parameter: the underlying function</para>
</listitem>
<listitem>
<para>third parameter: the eUML function name</para>
</listitem>
<listitem>
<para>fourth parameter: the return type if used in a transition
behavior</para>
</listitem>
<listitem>
<para>fifth parameter: the return type if used in a state
behavior (entry/exit)</para>
</listitem>
</itemizedlist> Note that the function itself can take up to 5
arguments.</para>
<para>Example:</para>
<para>
<programlisting>MSM_EUML_FUNCTION(BinarySearch_,std::binary_search,binary_search_,bool,bool)</programlisting>
</para>
<para>Can be used like:</para>
<para>
<programlisting>binary_search_(begin_(fsm_(m_var)),end_(fsm_(m_var)),Int_&lt;9>())</programlisting>
</para>
</refsect3>
<refsect3>
<title>MSM_EUML_METHOD</title>
<para>This macro creates a eUML function and a functor for use with the
functor front-end, based on a method:<itemizedlist>
<listitem>
<para>first parameter: the name of the functor</para>
</listitem>
<listitem>
<para>second parameter: the underlying function</para>
</listitem>
<listitem>
<para>third parameter: the eUML function name</para>
</listitem>
<listitem>
<para>fourth parameter: the return type if used in a transition
behavior</para>
</listitem>
<listitem>
<para>fifth parameter: the return type if used in a state
behavior (entry/exit)</para>
</listitem>
</itemizedlist> Note that the method itself can take up to 4 arguments
(5 like for a free function - 1 for the object on which the method is
called).</para>
<para>Example:</para>
<programlisting>struct Empty : public msm::front::state&lt;> , public euml_state&lt;Empty>
{
void activate_empty() {std::cout &lt;&lt; "switching to Empty " &lt;&lt; std::endl;}
...
};
MSM_EUML_METHOD(ActivateEmpty_,activate_empty,activate_empty_,void,void)</programlisting>
<para>Can be used like:</para>
<para>
<programlisting>Empty == Open + open_close / (close_drawer , activate_empty_(target_))</programlisting>
</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_ACTION(action-instance-name)</title>
<para>This macro declares a behavior type and a const instance for use in
state or transition behaviors. The action implementation itself follows
the macro declaration, for example:</para>
<programlisting>BOOST_MSM_EUML_ACTION(good_disk_format)
{
template &lt;class Fsm,class Evt,class SourceState,class TargetState>
void/bool operator()(Evt const&amp; evt,Fsm&amp;,SourceState&amp; ,TargetState&amp; ){...}
};</programlisting>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_FLAG(flag-instance-name)</title>
<para>This macro declares a flag type and a const instance for use in
behaviors.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_FLAG_NAME(flag-instance-name)</title>
<para>This macro returns the name of the flag type generated by
BOOST_MSM_EUML_FLAG. You need this where the type is required (usually
with the back-end method is_flag_active). For example:</para>
<programlisting>fsm.is_flag_active&lt;BOOST_MSM_EUML_FLAG_NAME(CDLoaded)>()</programlisting>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_DECLARE_ATTRIBUTE(event-type,event-name)</title>
<para>This macro declares an attribute called event-name of type event-type.
This attribute can then be made part of an attribute list using
BOOST_MSM_EUML_ATTRIBUTES.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_ATTRIBUTES(attributes-expression,attributes-name)</title>
<para>This macro declares an attribute list called attributes-name based on
the expression as first argument. These attributes can then be made part
of an event using BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES, of a state as
3rd parameter of BOOST_MSM_EUML_STATE or of a state machine as 5th
parameter of BOOST_MSM_EUML_DECLARE_STATE_MACHINE.</para>
<para>Attributes are added using left-shift, for example:</para>
<programlisting>// m_song is of type std::string
BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::string,m_song)
// contains one attribute, m_song
BOOST_MSM_EUML_ATTRIBUTES((attributes_ &lt;&lt; m_song ), FoundDef)</programlisting>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_EVENT(event-instance name)</title>
<para>This macro defines an event type (event-instance-name_helper) and
declares a const instance of this event type called event-instance-name
for use in a transition table or state behaviors.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(event-instance-name,attributes)</title>
<para>This macro defines an event type (event-instance-name_helper) and
declares a const instance of this event type called event-instance-name
for use in a transition table or state behaviors. The event will have as
attributes the ones passed by the second argument:</para>
<para><code>BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(Found,FoundDef)</code>
</para>
<para>The created event instance supports operator()(attributes) so that
<programlisting>my_back_end.process_event(Found(some_string))</programlisting>
is possible.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_EVENT_NAME(event-instance-name)</title>
<para>This macro returns the name of the event type generated by
BOOST_MSM_EUML_EVENT or BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES. You need
this where the type is required (usually inside a back-end definition).
For example:</para>
<para>
<programlisting>typedef msm::back::state_machine&lt;Playing_,
msm::back::ShallowHistory&lt;mpl::vector&lt;BOOST_MSM_EUML_EVENT_NAME(end_pause)
> > > Playing_type;</programlisting>
</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_STATE(build-expression,state-instance-name)</title>
<para>This macro defines a state type (state-instance-name_helper) and
declares a const instance of this state type called state-instance-name
for use in a transition table or state behaviors.</para>
<para>There are several possibilitites for the expression syntax:<itemizedlist>
<listitem>
<para>(): state without entry or exit action.</para>
</listitem>
<listitem>
<para>(Expr1): state with entry but no exit action.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2): state with entry and exit action.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes): state with entry and exit
action, defining some attributes.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes,Configure): state with entry and
exit action, defining some attributes and flags (standard
MSM flags) or deferred events (standard MSM deferred
events).</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes,Configure,Base): state with entry
and exit action, defining some attributes, flags and
deferred events (plain msm deferred events) and a
non-default base state (as defined in standard MSM).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_INTERRUPT_STATE(build-expression,state-instance-name)</title>
<para>This macro defines an interrupt state type
(state-instance-name_helper) and declares a const instance of this state
type called state-instance-name for use in a transition table or state
behaviors.</para>
<para>There are several possibilitites for the expression syntax. In all of
them, the first argument is the name of the event (generated by one of
the previous macros) ending the interrupt:<itemizedlist>
<listitem>
<para>(end_interrupt_event): interrupt state without entry or
exit action.</para>
</listitem>
<listitem>
<para>(end_interrupt_event,Expr1): interrupt state with entry
but no exit action.</para>
</listitem>
<listitem>
<para>(end_interrupt_event,Expr1,Expr2): interrupt state with
entry and exit action.</para>
</listitem>
<listitem>
<para>(end_interrupt_event,Expr1,Expr2,Attributes): interrupt
state with entry and exit action, defining some
attributes.</para>
</listitem>
<listitem>
<para>(end_interrupt_event,Expr1,Expr2,Attributes,Configure):
interrupt state with entry and exit action, defining some
attributes and flags (standard MSM flags) or deferred events
(standard MSM deferred events).</para>
</listitem>
<listitem>
<para>(end_interrupt_event,Expr1,Expr2,Attributes,Configure,Base):
interrupt state with entry and exit action, defining some
attributes, flags and deferred events (plain msm deferred
events) and a non-default base state (as defined in standard
MSM).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_TERMINATE_STATE(build-expression,state-instance-name)</title>
<para>This macro defines a terminate pseudo-state type
(state-instance-name_helper) and declares a const instance of this state
type called state-instance-name for use in a transition table or state
behaviors.</para>
<para>There are several possibilitites for the expression syntax:<itemizedlist>
<listitem>
<para>(): terminate pseudo-state without entry or exit
action.</para>
</listitem>
<listitem>
<para>(Expr1): terminate pseudo-state with entry but no exit
action.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2): terminate pseudo-state with entry and exit
action.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes): terminate pseudo-state with
entry and exit action, defining some attributes.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes,Configure): terminate pseudo-state
with entry and exit action, defining some attributes and
flags (standard MSM flags) or deferred events (standard MSM
deferred events).</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes,Configure,Base): terminate
pseudo-state with entry and exit action, defining some
attributes, flags and deferred events (plain msm deferred
events) and a non-default base state (as defined in standard
MSM).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_EXIT_STATE(build-expression,state-instance-name)</title>
<para>This macro defines an exit pseudo-state type
(state-instance-name_helper) and declares a const instance of this state
type called state-instance-name for use in a transition table or state
behaviors.</para>
<para>There are several possibilitites for the expression syntax:<itemizedlist>
<listitem>
<para>(forwarded_event):exit pseudo-state without entry or exit
action.</para>
</listitem>
<listitem>
<para>(forwarded_event,Expr1): exit pseudo-state with entry but
no exit action.</para>
</listitem>
<listitem>
<para>(forwarded_event,Expr1,Expr2): exit pseudo-state with
entry and exit action.</para>
</listitem>
<listitem>
<para>(forwarded_event,Expr1,Expr2,Attributes): exit
pseudo-state with entry and exit action, defining some
attributes.</para>
</listitem>
<listitem>
<para>(forwarded_event,Expr1,Expr2,Attributes,Configure): exit
pseudo-state with entry and exit action, defining some
attributes and flags (standard MSM flags) or deferred events
(standard MSM deferred events).</para>
</listitem>
<listitem>
<para>(forwarded_event,Expr1,Expr2,Attributes,Configure,Base):
exit pseudo-state with entry and exit action, defining some
attributes, flags and deferred events (plain msm deferred
events) and a non-default base state (as defined in standard
MSM).</para>
</listitem>
</itemizedlist></para>
<para>Note that the forwarded_event must be constructible from the event
sent by the submachine containing the exit point.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_ENTRY_STATE(int
region-index,build-expression,state-instance-name)</title>
<para>This macro defines an entry pseudo-state type
(state-instance-name_helper) and declares a const instance of this state
type called state-instance-name for use in a transition table or state
behaviors.</para>
<para>There are several possibilitites for the expression syntax:<itemizedlist>
<listitem>
<para>(): entry pseudo-state without entry or exit
action.</para>
</listitem>
<listitem>
<para>(Expr1): entry pseudo-state with entry but no exit
action.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2): entry pseudo-state with entry and exit
action.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes): entry pseudo-state with entry
and exit action, defining some attributes.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes,Configure): entry pseudo-state
with entry and exit action, defining some attributes and
flags (standard MSM flags) or deferred events (standard MSM
deferred events).</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes,Configure,Base): entry
pseudo-state with entry and exit action, defining some
attributes, flags and deferred events (plain msm deferred
events) and a non-default base state (as defined in standard
MSM).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE(int
region-index,build-expression,state-instance-name)</title>
<para>This macro defines a submachine's substate type
(state-instance-name_helper), which can be explicitly entered and also
declares a const instance of this state type called state-instance-name
for use in a transition table or state behaviors.</para>
<para>There are several possibilitites for the expression syntax:<itemizedlist>
<listitem>
<para>(): state without entry or exit action.</para>
</listitem>
<listitem>
<para>(Expr1): state with entry but no exit action.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2): state with entry and exit action.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes): state with entry and exit
action, defining some attributes.</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes,Configure): state with entry and
exit action, defining some attributes and flags (standard
MSM flags) or deferred events (standard MSM deferred
events).</para>
</listitem>
<listitem>
<para>(Expr1,Expr2,Attributes,Configure,Base): state with entry
and exit action, defining some attributes, flags and
deferred events (plain msm deferred events) and a
non-default base state (as defined in standard MSM).</para>
</listitem>
</itemizedlist></para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_STATE_NAME(state-instance-name)</title>
<para>This macro returns the name of the state type generated by
BOOST_MSM_EUML_STATE or other state macros. You need this where the type
is required (usually using a backend function). For example:</para>
<para>
<programlisting>fsm.get_state&lt;BOOST_MSM_EUML_STATE_NAME(StringFind)&amp;>().some_state_function();</programlisting>
</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_DECLARE_STATE(build-expression,state-instance-name)</title>
<para>Like BOOST_MSM_EUML_STATE but does not provide an instance, simply a
type declaration.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_DECLARE_INTERRUPT_STATE(build-expression,state-instance-name)</title>
<para>Like BOOST_MSM_EUML_INTERRUPT_STATE but does not provide an instance,
simply a type declaration.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_DECLARE_TERMINATE_STATE(build-expression,state-instance-name)</title>
<para>Like BOOST_MSM_EUML_TERMINATE_STATE but does not provide an instance,
simply a type declaration.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_DECLARE_EXIT_STATE(build-expression,state-instance-name)</title>
<para>Like BOOST_MSM_EUML_EXIT_STATE but does not provide an instance,
simply a type declaration.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_DECLARE_ENTRY_STATE(int
region-index,build-expression,state-instance-name)</title>
<para>Like BOOST_MSM_EUML_ENTRY_STATE but does not provide an instance,
simply a type declaration.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_DECLARE_EXPLICIT_ENTRY_STATE(int
region-index,build-expression,state-instance-name)</title>
<para>Like BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE but does not provide an
instance, simply a type declaration.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_TRANSITION_TABLE(expression,
table-instance-name)</title>
<para>This macro declares a transition table type and also declares a const
instance of the table which can then be used in a state machine
declaration (see BOOST_MSM_EUML_DECLARE_STATE_MACHINE).The expression
must follow the <command xlink:href="#reference-stt-grammar">transition
table grammar</command>.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(iexpression,table-instance-name)</title>
<para>Like BOOST_MSM_EUML_TRANSITION_TABLE but does not provide an instance,
simply a type declaration.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expression,
table-instance-name)</title>
<para>This macro declares a transition table type and also declares a const
instance of the table.The expression must follow the <command
xlink:href="#reference-stt-grammar">transition table
grammar</command>. For the moment, this macro is not used.</para>
</refsect3>
<refsect3>
<title>BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(iexpression,table-instance-name)</title>
<para>Like BOOST_MSM_EUML_TRANSITION_TABLE but does not provide an instance,
simply a type declaration. This is currently the only way to declare an
internal transition table with eUML. For example:</para>
<programlisting>BOOST_MSM_EUML_DECLARE_STATE((Open_Entry,Open_Exit),Open_def)
struct Open_impl : public Open_def
{
BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE((
open_close [internal_guard1] / internal_action1 ,
open_close [internal_guard2] / internal_action2
))
}; </programlisting>
</refsect3>
</refsect2>
</refsect1>
</refentry>
</part>
</book>