mirror of
https://github.com/boostorg/msm.git
synced 2026-01-19 04:22:11 +00:00
Merged rev. 83038-83758
[SVN r83760]
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 1. Founding idea</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="pt01.html" title="Part I. User' guide"><link rel="next" href="ch02.html" title="Chapter 2. UML Short Guide"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 1. Founding idea</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="pt01.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 1. Founding idea"><div class="titlepage"><div><div><h2 class="title"><a name="d0e99"></a>Chapter 1. Founding idea</h2></div></div></div><p>Let's start with an example taken from the C++ Template Metaprogramming
|
||||
<title>Chapter 1. Founding idea</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="pt01.html" title="Part I. User' guide"><link rel="next" href="ch02.html" title="Chapter 2. UML Short Guide"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 1. Founding idea</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="pt01.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 1. Founding idea"><div class="titlepage"><div><div><h2 class="title"><a name="d0e99"></a>Chapter 1. Founding idea</h2></div></div></div><p>Let's start with an example taken from the C++ Template Metaprogramming
|
||||
book:</p><pre class="programlisting">class player : public state_machine<player>
|
||||
{
|
||||
// The list of FSM states enum states { Empty, Open, Stopped, Playing, Paused , initial_state = Empty };
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 2. UML Short Guide</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch01.html" title="Chapter 1. Founding idea"><link rel="next" href="ch02s02.html" title="Concepts"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 2. UML Short Guide</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch02s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 2. UML Short Guide"><div class="titlepage"><div><div><h2 class="title"><a name="d0e108"></a>Chapter 2. UML Short Guide</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch02.html#d0e111">What are state machines?</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">Concepts</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#d0e121">State machine, state, transition, event </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e151">Submachines, orthogonal regions, pseudostates </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e194">
|
||||
<title>Chapter 2. UML Short Guide</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch01.html" title="Chapter 1. Founding idea"><link rel="next" href="ch02s02.html" title="Concepts"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 2. UML Short Guide</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch01.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch02s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 2. UML Short Guide"><div class="titlepage"><div><div><h2 class="title"><a name="d0e108"></a>Chapter 2. UML Short Guide</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch02.html#d0e111">What are state machines?</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">Concepts</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#d0e121">State machine, state, transition, event </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e151">Submachines, orthogonal regions, pseudostates </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e194">
|
||||
History </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e208">Completion transitions / anonymous
|
||||
transitions</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e220"> Internal transitions </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e226">
|
||||
Conflicting transitions </a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">Added concepts</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">State machine glossary</a></span></dt></dl></div><div class="sect1" title="What are state machines?"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e111"></a>What are state machines?</h2></div></div></div><p>State machines are the description of a thing's lifeline. They describe the
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Concepts</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch02.html" title="Chapter 2. UML Short Guide"><link rel="prev" href="ch02.html" title="Chapter 2. UML Short Guide"><link rel="next" href="ch02s03.html" title="Added concepts"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Concepts</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. UML Short Guide</th><td width="20%" align="right"> <a accesskey="n" href="ch02s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Concepts"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e116"></a>Concepts</h2></div></div></div><p>Thinking in terms of state machines is a bit surprising at first, so let us
|
||||
<title>Concepts</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch02.html" title="Chapter 2. UML Short Guide"><link rel="prev" href="ch02.html" title="Chapter 2. UML Short Guide"><link rel="next" href="ch02s03.html" title="Added concepts"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Concepts</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. UML Short Guide</th><td width="20%" align="right"> <a accesskey="n" href="ch02s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Concepts"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e116"></a>Concepts</h2></div></div></div><p>Thinking in terms of state machines is a bit surprising at first, so let us
|
||||
have a quick glance at the concepts.</p><div class="sect2" title="State machine, state, transition, event"><div class="titlepage"><div><div><h3 class="title"><a name="d0e121"></a>State machine, state, transition, event </h3></div></div></div><p>A state machine is a concrete model describing the behavior of a system.
|
||||
It is composed of a finite number of states and transitions.</p><p>
|
||||
<span class="inlinemediaobject"><img src="../images/sm.gif"></span></p><p>A simple state has no sub states. It can have data, entry and exit
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Added concepts</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch02.html" title="Chapter 2. UML Short Guide"><link rel="prev" href="ch02s02.html" title="Concepts"><link rel="next" href="ch02s04.html" title="State machine glossary"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Added concepts</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. UML Short Guide</th><td width="20%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Added concepts"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e254"></a>Added concepts</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Interrupt states: a terminate state which can be exited if a defined
|
||||
<title>Added concepts</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch02.html" title="Chapter 2. UML Short Guide"><link rel="prev" href="ch02s02.html" title="Concepts"><link rel="next" href="ch02s04.html" title="State machine glossary"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Added concepts</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. UML Short Guide</th><td width="20%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Added concepts"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e254"></a>Added concepts</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Interrupt states: a terminate state which can be exited if a defined
|
||||
event is triggered.</p></li><li class="listitem"><p>Kleene (any) event: a transition with a kleene event will accept any
|
||||
event as trigger. Unlike a completion transition, an event must be
|
||||
triggered and the original event is kept accessible in the kleene
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>State machine glossary</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch02.html" title="Chapter 2. UML Short Guide"><link rel="prev" href="ch02s03.html" title="Added concepts"><link rel="next" href="ch03.html" title="Chapter 3. Tutorial"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">State machine glossary</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s03.html">Prev</a> </td><th width="60%" align="center">Chapter 2. UML Short Guide</th><td width="20%" align="right"> <a accesskey="n" href="ch03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="State machine glossary"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e264"></a>State machine glossary</h2></div></div></div><p>
|
||||
<title>State machine glossary</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch02.html" title="Chapter 2. UML Short Guide"><link rel="prev" href="ch02s03.html" title="Added concepts"><link rel="next" href="ch03.html" title="Chapter 3. Tutorial"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">State machine glossary</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s03.html">Prev</a> </td><th width="60%" align="center">Chapter 2. UML Short Guide</th><td width="20%" align="right"> <a accesskey="n" href="ch03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="State machine glossary"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e264"></a>State machine glossary</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>state machine: the life cycle of a thing. It is made of states,
|
||||
regions, transitions and processes incoming events.</p></li><li class="listitem"><p>state: a stage in the life cycle of a state machine. A state (like
|
||||
a submachine) can have an entry and exit behaviors.</p></li><li class="listitem"><p>event: an incident provoking (or not) a reaction of the state
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 3. Tutorial</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch02s04.html" title="State machine glossary"><link rel="next" href="ch03s02.html" title="Basic front-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 3. Tutorial</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s04.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch03s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 3. Tutorial"><div class="titlepage"><div><div><h2 class="title"><a name="d0e322"></a>Chapter 3. Tutorial</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch03.html#d0e325">Design</a></span></dt><dt><span class="sect1"><a href="ch03s02.html">Basic front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s02.html#d0e344">A simple example</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e358">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e406">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e419">What do you actually do inside actions / guards?</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e471">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e529">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e577">Orthogonal regions, terminate state, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e668">History</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e713">Completion (anonymous) transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e740">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e842">more row types</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e875">Explicit entry / entry and exit pseudo-state / fork</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1064">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1118">Event Hierarchy</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1139">Customizing a state machine / Getting more speed</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1188">Choosing the initial event</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1201"> Containing state machine (deprecated)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s03.html">Functor front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s03.html#d0e1240"> Transition table </a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1273">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1292">What do you actually do inside actions / guards (Part 2)?</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1304">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1312">Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1338">Internal
|
||||
transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1384">Kleene (any) event</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s04.html">eUML (experimental)</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s04.html#d0e1454">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1495">A simple example: rewriting only our transition table </a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1528">Defining events, actions and states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1641">Wrapping up a simple state machine and first complete examples</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1689">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1705">
|
||||
Attributes / Function call</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1805">Orthogonal regions, flags, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1917">
|
||||
<title>Chapter 3. Tutorial</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch02s04.html" title="State machine glossary"><link rel="next" href="ch03s02.html" title="Basic front-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 3. Tutorial</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s04.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch03s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 3. Tutorial"><div class="titlepage"><div><div><h2 class="title"><a name="d0e322"></a>Chapter 3. Tutorial</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch03.html#d0e325">Design</a></span></dt><dt><span class="sect1"><a href="ch03s02.html">Basic front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s02.html#d0e344">A simple example</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e358">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e406">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e419">What do you actually do inside actions / guards?</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e471">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e529">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e577">Orthogonal regions, terminate state, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e668">History</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e713">Completion (anonymous) transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e740">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e842">more row types</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e875">Explicit entry / entry and exit pseudo-state / fork</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1064">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1126">Event Hierarchy</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1147">Customizing a state machine / Getting more speed</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1196">Choosing the initial event</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1209"> Containing state machine (deprecated)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s03.html">Functor front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s03.html#d0e1248"> Transition table </a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1281">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1300">What do you actually do inside actions / guards (Part 2)?</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1312">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1320">Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1346">Internal
|
||||
transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1392">Kleene (any) event</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s04.html">eUML (experimental)</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s04.html#d0e1462">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1503">A simple example: rewriting only our transition table </a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1536">Defining events, actions and states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1649">Wrapping up a simple state machine and first complete examples</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1697">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1713">
|
||||
Attributes / Function call</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1813">Orthogonal regions, flags, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1925">
|
||||
Customizing a state machine / Getting
|
||||
more speed</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1952">Completion / Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1970">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2001">Kleene(any) event)</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2016">Other state types</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2080">Helper functions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2183">Phoenix-like STL support</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2236">Writing actions with Boost.Phoenix (in development)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s05.html">Back-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s05.html#d0e2295">Creation </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2304">Starting and stopping a state
|
||||
machine</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2323">Event dispatching</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2332">Active state(s)</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2346">Serialization</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2399">Base state type </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2425">Visitor</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2468">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2481">Getting a state</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2494"> State machine constructor with arguments </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2534">Trading run-time speed for
|
||||
better compile-time / multi-TU compilation</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2616">Compile-time state machine analysis </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2660"> Enqueueing events for later
|
||||
processing </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2680"> Customizing the message queues </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2695">Policy definition with Boost.Parameter </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2703">Choosing when to switch active
|
||||
more speed</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1960">Completion / Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1978">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2009">Kleene(any) event)</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2024">Other state types</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2088">Helper functions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2191">Phoenix-like STL support</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2244">Writing actions with Boost.Phoenix (in development)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s05.html">Back-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s05.html#d0e2303">Creation </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2312">Starting and stopping a state
|
||||
machine</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2331">Event dispatching</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2340">Active state(s)</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2354">Serialization</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2407">Base state type </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2433">Visitor</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2476">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2489">Getting a state</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2502"> State machine constructor with arguments </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2542">Trading run-time speed for
|
||||
better compile-time / multi-TU compilation</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2624">Compile-time state machine analysis </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2668"> Enqueueing events for later
|
||||
processing </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2688"> Customizing the message queues </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2703">Policy definition with Boost.Parameter </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2711">Choosing when to switch active
|
||||
states </a></span></dt></dl></dd></dl></div><div class="sect1" title="Design"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e325"></a>Design</h2></div></div></div><p>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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Basic front-end</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch03.html" title="Chapter 3. Tutorial"><link rel="prev" href="ch03.html" title="Chapter 3. Tutorial"><link rel="next" href="ch03s03.html" title="Functor front-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Basic front-end</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Tutorial</th><td width="20%" align="right"> <a accesskey="n" href="ch03s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Basic front-end"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e338"></a><span class="command"><strong><a name="basic-front-end"></a></strong></span>Basic front-end</h2></div></div></div><p>This is the historical front-end, inherited from the MPL book. It provides a
|
||||
<title>Basic front-end</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch03.html" title="Chapter 3. Tutorial"><link rel="prev" href="ch03.html" title="Chapter 3. Tutorial"><link rel="next" href="ch03s03.html" title="Functor front-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Basic front-end</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Tutorial</th><td width="20%" align="right"> <a accesskey="n" href="ch03s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Basic front-end"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e338"></a><span class="command"><strong><a name="basic-front-end"></a></strong></span>Basic front-end</h2></div></div></div><p>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
|
||||
@@ -623,7 +623,10 @@ struct event2
|
||||
all of the active states are flagged for the state to be active. You can
|
||||
also AND the active states:</p><p>
|
||||
</p><pre class="programlisting">if (p.is_flag_active<CDLoaded,player::Flag_AND>()) ...</pre><p>
|
||||
</p><p>The following diagram displays the flag situation in the tutorial.</p><p><span class="inlinemediaobject"><img src="../images/FlagsTutorial.jpg" width="60%"></span></p></div><div class="sect2" title="Event Hierarchy"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1118"></a><span class="command"><strong><a name="event-hierarchy"></a></strong></span>Event Hierarchy</h3></div></div></div><p>There are cases where one needs transitions based on categories of events.
|
||||
</p><p> Note. Due to arcane C++ rules, when called inside an action, the correct
|
||||
call is:
|
||||
</p><pre class="programlisting">if (p.<span class="bold"><strong>template</strong></span> is_flag_active<CDLoaded>()) ...</pre><p>
|
||||
</p><p>The following diagram displays the flag situation in the tutorial.</p><p><span class="inlinemediaobject"><img src="../images/FlagsTutorial.jpg" width="60%"></span></p></div><div class="sect2" title="Event Hierarchy"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1126"></a><span class="command"><strong><a name="event-hierarchy"></a></strong></span>Event Hierarchy</h3></div></div></div><p>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
|
||||
@@ -636,7 +639,7 @@ struct char_0 : public digit {}; </pre><p>And to the same for other digits, we c
|
||||
and this will cause a transition with "digit" as trigger to be taken.</p><p>An <a class="link" href="examples/ParsingDigits.cpp" target="_top">example</a> 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).</p></div><div class="sect2" title="Customizing a state machine / Getting more speed"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1139"></a>Customizing a state machine / Getting more speed</h3></div></div></div><p>MSM is offering many UML features at a high-speed, but sometimes, you just
|
||||
very good (in this case even better).</p></div><div class="sect2" title="Customizing a state machine / Getting more speed"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1147"></a>Customizing a state machine / Getting more speed</h3></div></div></div><p>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: </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>checking for terminate/interrupt states</p></li><li class="listitem"><p>handling the message queue (for entry/exit/transition actions
|
||||
generating themselves events)</p></li><li class="listitem"><p>handling deferred events</p></li><li class="listitem"><p>catching exceptions (or not)</p></li><li class="listitem"><p>handling the state switching and action calls</p></li></ul></div><p>Of these tasks, only the last one is absolutely necessary to
|
||||
@@ -662,7 +665,7 @@ struct char_0 : public digit {}; </pre><p>And to the same for other digits, we c
|
||||
};</pre><p><span class="underline">Important note</span>: As exit pseudo
|
||||
states are using the message queue to forward events out of a submachine,
|
||||
the <code class="code">no_message_queue</code> option cannot be used with state machines
|
||||
containing an exit pseudo state.</p></div><div class="sect2" title="Choosing the initial event"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1188"></a>Choosing the initial event</h3></div></div></div><p>A state machine is started using the <code class="code">start</code> method. This
|
||||
containing an exit pseudo state.</p></div><div class="sect2" title="Choosing the initial event"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1196"></a>Choosing the initial event</h3></div></div></div><p>A state machine is started using the <code class="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
|
||||
@@ -674,7 +677,7 @@ struct char_0 : public digit {}; </pre><p>And to the same for other digits, we c
|
||||
struct player_ : public msm::front::state_machine_def<player_>{
|
||||
...
|
||||
typedef my_initial_event initial_event;
|
||||
};</pre></div><div class="sect2" title="Containing state machine (deprecated)"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1201"></a> Containing state machine (deprecated)</h3></div></div></div><p>This feature is still supported in MSM for backward compatibility but made
|
||||
};</pre></div><div class="sect2" title="Containing state machine (deprecated)"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1209"></a> Containing state machine (deprecated)</h3></div></div></div><p>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.</p><p>All of the states defined in the state machine are created upon state
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Functor front-end</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch03.html" title="Chapter 3. Tutorial"><link rel="prev" href="ch03s02.html" title="Basic front-end"><link rel="next" href="ch03s04.html" title="eUML (experimental)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Functor front-end</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s02.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Tutorial</th><td width="20%" align="right"> <a accesskey="n" href="ch03s04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Functor front-end"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1216"></a><span class="command"><strong><a name="functor-front-end"></a></strong></span>Functor front-end</h2></div></div></div><p>The functor front-end is the preferred front-end at the moment. It is more
|
||||
<title>Functor front-end</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch03.html" title="Chapter 3. Tutorial"><link rel="prev" href="ch03s02.html" title="Basic front-end"><link rel="next" href="ch03s04.html" title="eUML (experimental)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Functor front-end</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s02.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Tutorial</th><td width="20%" align="right"> <a accesskey="n" href="ch03s04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Functor front-end"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1224"></a><span class="command"><strong><a name="functor-front-end"></a></strong></span>Functor front-end</h2></div></div></div><p>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 <span class="command"><strong><a class="command" href="ch03s04.html#eUML-front-end">eUML</a></strong></span>, it also comes with a good deal
|
||||
of predefined actions. Actually, eUML generates a functor front-end through
|
||||
@@ -11,7 +11,7 @@
|
||||
means syntactic noise and more to learn.</p></li><li class="listitem"><p>Function pointers are weird in C++.</p></li><li class="listitem"><p>The action/guard signature is limited and does not allow for more
|
||||
variations of parameters (source state, target state, current state
|
||||
machine, etc.)</p></li><li class="listitem"><p>It is not easy to reuse action code from a state machine to
|
||||
another.</p></li></ul></div><div class="sect2" title="Transition table"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1240"></a> Transition table </h3></div></div></div><p>We can change the definition of the simple tutorial's transition table
|
||||
another.</p></li></ul></div><div class="sect2" title="Transition table"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1248"></a> Transition table </h3></div></div></div><p>We can change the definition of the simple tutorial's transition table
|
||||
to:</p><pre class="programlisting">
|
||||
struct transition_table : mpl::vector<
|
||||
// Start Event Target Action Guard
|
||||
@@ -45,7 +45,7 @@ Row < Paused , open_close , Open , stop_and_open , none
|
||||
void operator()(Evt const&, Fsm& fsm, SourceState&,TargetState& )
|
||||
{
|
||||
cout << "player::store_cd_info" << endl;
|
||||
fsm.process_event(play());
|
||||
fsm.process_event(play());
|
||||
}
|
||||
}; </pre><p>The advantage of functors compared to functions are that functors are
|
||||
generic and reusable. They also allow passing more parameters than just
|
||||
@@ -66,7 +66,7 @@ Row < Paused , open_close , Open , stop_and_open , none
|
||||
can achieve this using And_ and Or_ functors:
|
||||
</p><pre class="programlisting">And_<good_disk_format,Or_< some_condition , some_other_condition> ></pre><p>It
|
||||
even starts looking like functional programming. MSM ships with functors for
|
||||
operators, state machine usage, STL algorithms or container methods.</p></div><div class="sect2" title="Defining states with entry/exit actions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1273"></a>Defining states with entry/exit actions</h3></div></div></div><p>You probably noticed that we just showed a different transition table and
|
||||
operators, state machine usage, STL algorithms or container methods.</p></div><div class="sect2" title="Defining states with entry/exit actions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1281"></a>Defining states with entry/exit actions</h3></div></div></div><p>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
|
||||
@@ -89,7 +89,7 @@ struct Empty : public msm::front::euml::func_state<Empty_Entry,Empty_Exit>
|
||||
rewritten</a>.</p><p>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.</p></div><div class="sect2" title="What do you actually do inside actions / guards (Part 2)?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1292"></a><span class="command"><strong><a name="functor-front-end-actions"></a></strong></span>What do you actually do inside actions / guards (Part 2)?</h3></div></div></div><p>Using the basic front-end, we saw how to pass data to actions through the
|
||||
programming.</p></div><div class="sect2" title="What do you actually do inside actions / guards (Part 2)?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1300"></a><span class="command"><strong><a name="functor-front-end-actions"></a></strong></span>What do you actually do inside actions / guards (Part 2)?</h3></div></div></div><p>Using the basic front-end, we saw how to pass data to actions through the
|
||||
event, that data common to all states could be stored in the state machine,
|
||||
state relevant data could be stored in the state and access as template
|
||||
parameter in the entry / exit actions. What was however missing was the
|
||||
@@ -113,16 +113,16 @@ struct Empty : public msm::front::euml::func_state<Empty_Entry,Empty_Exit>
|
||||
fire_rocket(evt.direction, src.current_calculation);
|
||||
fsm.process_event(rocket_launched());
|
||||
}
|
||||
}; </pre></div><div class="sect2" title="Defining a simple state machine"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1304"></a>Defining a simple state machine</h3></div></div></div><p>Like states, state machines can be defined using the previous front-end,
|
||||
}; </pre></div><div class="sect2" title="Defining a simple state machine"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1312"></a>Defining a simple state machine</h3></div></div></div><p>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
|
||||
<a class="link" href="examples/SimpleWithFunctors2.cpp" target="_top">this
|
||||
example</a>.</p></div><div class="sect2" title="Anonymous transitions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1312"></a>Anonymous transitions</h3></div></div></div><p>Anonymous (completion) transitions are transitions without a named event.
|
||||
example</a>.</p></div><div class="sect2" title="Anonymous transitions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1320"></a>Anonymous transitions</h3></div></div></div><p>Anonymous (completion) transitions are transitions without a named event.
|
||||
We saw how this front-end uses <code class="code">none</code> when no action or guard is
|
||||
required. We can also use <code class="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:</p><pre class="programlisting">Row < State1 , none , State2 ></pre><p>The following transition does the same but calling an action in the
|
||||
process:</p><pre class="programlisting">Row < State1 , none , State2 , State1ToState2, none ></pre><p>The following diagram shows an example and its <a class="link" href="examples/AnonymousTutorialWithFunctors.cpp" target="_top">implementation</a>:</p><p><span class="inlinemediaobject"><img src="../images/Anonymous.jpg" width="70%"></span></p></div><div class="sect2" title="Internal transitions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1338"></a><span class="command"><strong><a name="functor-internal-transitions"></a></strong></span>Internal
|
||||
process:</p><pre class="programlisting">Row < State1 , none , State2 , State1ToState2, none ></pre><p>The following diagram shows an example and its <a class="link" href="examples/AnonymousTutorialWithFunctors.cpp" target="_top">implementation</a>:</p><p><span class="inlinemediaobject"><img src="../images/Anonymous.jpg" width="70%"></span></p></div><div class="sect2" title="Internal transitions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1346"></a><span class="command"><strong><a name="functor-internal-transitions"></a></strong></span>Internal
|
||||
transitions</h3></div></div></div><p>The <a class="link" href="examples/SimpleTutorialInternalFunctors.cpp" target="_top">following example</a> uses internal transitions with the functor
|
||||
front-end. As for the simple standard front-end, both methods of defining
|
||||
internal transitions are supported:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>providing a <code class="code">Row</code> in the state machine's transition
|
||||
@@ -143,7 +143,7 @@ struct Empty : public msm::front::euml::func_state<Empty_Entry,Empty_Exit>
|
||||
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.</p></div><div class="sect2" title="Kleene (any) event"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1384"></a><span class="command"><strong><a name="any-event"></a></strong></span>Kleene (any) event</h3></div></div></div><p>Normally, MSM requires an event to fire a transition. But there are cases,
|
||||
the same is also possible with this front-end.</p></div><div class="sect2" title="Kleene (any) event"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1392"></a><span class="command"><strong><a name="any-event"></a></strong></span>Kleene (any) event</h3></div></div></div><p>Normally, MSM requires an event to fire a transition. But there are cases,
|
||||
where any event, no matter which one would do:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>If you want to reduce the number of transitions: any event
|
||||
would do, possibly will guards decide what happens</p></li><li class="listitem"><p>Pseudo entry states do not necessarily want to know the event
|
||||
which caused their activation, or they might want to know only a
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>eUML (experimental)</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch03.html" title="Chapter 3. Tutorial"><link rel="prev" href="ch03s03.html" title="Functor front-end"><link rel="next" href="ch03s05.html" title="Back-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">eUML (experimental)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s03.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Tutorial</th><td width="20%" align="right"> <a accesskey="n" href="ch03s05.html">Next</a></td></tr></table><hr></div><div class="sect1" title="eUML (experimental)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1421"></a><span class="command"><strong><a name="eUML-front-end"></a></strong></span>eUML (experimental)</h2></div></div></div><p><span class="underline">Important note</span>: eUML requires a compiler
|
||||
<title>eUML (experimental)</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch03.html" title="Chapter 3. Tutorial"><link rel="prev" href="ch03s03.html" title="Functor front-end"><link rel="next" href="ch03s05.html" title="Back-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">eUML (experimental)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s03.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Tutorial</th><td width="20%" align="right"> <a accesskey="n" href="ch03s05.html">Next</a></td></tr></table><hr></div><div class="sect1" title="eUML (experimental)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1429"></a><span class="command"><strong><a name="eUML-front-end"></a></strong></span>eUML (experimental)</h2></div></div></div><p><span class="underline">Important note</span>: eUML requires a compiler
|
||||
supporting Boost.Typeof. More generally, eUML has experimental status because
|
||||
some compilers will start crashing when a state machine becomes too big (usually
|
||||
when you write huge actions).</p><p>The previous front-ends are simple to write but still force an amount of
|
||||
@@ -20,7 +20,7 @@
|
||||
</p><pre class="programlisting">#include <msm/front/euml/euml.hpp></pre><p>
|
||||
</p><p>To add STL support (at possible cost of longer compilation times), include: </p><p>
|
||||
</p><pre class="programlisting">#include <msm/front/euml/stl.hpp></pre><p>
|
||||
</p><p>eUML is defined in the namespace <code class="code">msm::front::euml</code>.</p><div class="sect2" title="Transition table"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1454"></a>Transition table</h3></div></div></div><p>A transition can be defined using eUML as: </p><p>
|
||||
</p><p>eUML is defined in the namespace <code class="code">msm::front::euml</code>.</p><div class="sect2" title="Transition table"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1462"></a>Transition table</h3></div></div></div><p>A transition can be defined using eUML as: </p><p>
|
||||
</p><pre class="programlisting">source + event [guard] / action == target</pre><p>
|
||||
</p><p>or as</p><p>
|
||||
</p><pre class="programlisting">target == source + event [guard] / action</pre><p>
|
||||
@@ -56,7 +56,7 @@ Stopped == Empty + cd_detected [good_disk_format] / store_cd_info
|
||||
[good_disk_format && (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.</p></div><div class="sect2" title="A simple example: rewriting only our transition table"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1495"></a>A simple example: rewriting only our transition table </h3></div></div></div><p>As an introduction to eUML, we will rewrite our tutorial's transition
|
||||
without any syntactic noise at all.</p></div><div class="sect2" title="A simple example: rewriting only our transition table"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1503"></a>A simple example: rewriting only our transition table </h3></div></div></div><p>As an introduction to eUML, we will rewrite our tutorial's transition
|
||||
table using eUML. This will require two or three changes, depending on the compiler:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>events must inherit from msm::front::euml::euml_event<
|
||||
event_name ></p></li><li class="listitem"><p>states must inherit from msm::front::euml::euml_state<
|
||||
state_name ></p></li><li class="listitem"><p>with VC, states must be declared before the front-end</p></li></ul></div><p>We now can write the transition table like just shown, using
|
||||
@@ -76,7 +76,7 @@ sub_back_end const sub; // sub can be used in a transition table.</pre><p>Unfort
|
||||
causes in a stack overflow. If you get a warning that the program is
|
||||
recursive on all paths, revert to either standard eUML or another front-end
|
||||
as Microsoft doesn't seem to intend to fix it.</p><p>We now have a new, more readable transition table with few changes to our
|
||||
example. eUML can do much more so please follow the guide.</p></div><div class="sect2" title="Defining events, actions and states with entry/exit actions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1528"></a>Defining events, actions and states with entry/exit actions</h3></div></div></div><div class="sect3" title="Events"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1531"></a>Events</h4></div></div></div><p>Events must be proto-enabled. To achieve this, they must inherit from
|
||||
example. eUML can do much more so please follow the guide.</p></div><div class="sect2" title="Defining events, actions and states with entry/exit actions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1536"></a>Defining events, actions and states with entry/exit actions</h3></div></div></div><div class="sect3" title="Events"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1539"></a>Events</h4></div></div></div><p>Events must be proto-enabled. To achieve this, they must inherit from
|
||||
a proto terminal (euml_event<event-name>). eUML also provides a macro
|
||||
to make this easier:</p><p>
|
||||
</p><pre class="programlisting">BOOST_MSM_EUML_EVENT(play)</pre><p>
|
||||
@@ -91,7 +91,7 @@ sub_back_end const sub; // sub can be used in a transition table.</pre><p>Unfort
|
||||
<code class="code">fsm.process_event(play());</code> or do we have to write:
|
||||
<code class="code">fsm.process_event(play);</code></p><p>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.</p></div><div class="sect3" title="Actions"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1562"></a>Actions</h4></div></div></div><p>Actions (returning void) and guards (returning a bool) are defined
|
||||
event on the fly.</p></div><div class="sect3" title="Actions"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1570"></a>Actions</h4></div></div></div><p>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<
|
||||
functor-name >. eUML also provides a macro:</p><pre class="programlisting">BOOST_MSM_EUML_ACTION(some_condition)
|
||||
@@ -122,7 +122,7 @@ sub_back_end const sub; // sub can be used in a transition table.</pre><p>Unfort
|
||||
BOOST_MSM_EUML_TRANSITION_TABLE((
|
||||
Playing == Stopped + play / start_playback() ,
|
||||
...
|
||||
),transition_table)</pre></div><div class="sect3" title="States"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1585"></a>States</h4></div></div></div><p>There is also a macro for states. This macro has 2 arguments, first
|
||||
),transition_table)</pre></div><div class="sect3" title="States"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1593"></a>States</h4></div></div></div><p>There is also a macro for states. This macro has 2 arguments, first
|
||||
the expression defining the state, then the state (instance)
|
||||
name:</p><pre class="programlisting">BOOST_MSM_EUML_STATE((),Paused)</pre><p>This defines a simple state without entry or exit action. You can
|
||||
provide in the expression parameter the state behaviors (entry and exit)
|
||||
@@ -163,7 +163,7 @@ Empty_impl const Empty;</pre><p>Notice also that we defined a method named activ
|
||||
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:</p><pre class="programlisting">Empty == Open + open_close / (close_drawer,activate_empty_(target_))</pre></div></div><div class="sect2" title="Wrapping up a simple state machine and first complete examples"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1641"></a>Wrapping up a simple state machine and first complete examples</h3></div></div></div><p>You can reuse the state machine definition method from the standard
|
||||
now use this inside a transition:</p><pre class="programlisting">Empty == Open + open_close / (close_drawer,activate_empty_(target_))</pre></div></div><div class="sect2" title="Wrapping up a simple state machine and first complete examples"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1649"></a>Wrapping up a simple state machine and first complete examples</h3></div></div></div><p>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).
|
||||
@@ -194,7 +194,7 @@ Empty_impl const Empty;</pre><p>Notice also that we defined a method named activ
|
||||
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 <span class="command"><strong><a class="command" href="ch03s04.html#eUML-attributes">attribute
|
||||
syntax</a></strong></span>.</p></div><div class="sect2" title="Defining a submachine"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1689"></a>Defining a submachine</h3></div></div></div><p>Defining a submachine (see <a class="link" href="examples/CompositeTutorialEuml.cpp" target="_top">tutorial</a>) with
|
||||
syntax</a></strong></span>.</p></div><div class="sect2" title="Defining a submachine"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1697"></a>Defining a submachine</h3></div></div></div><p>Defining a submachine (see <a class="link" href="examples/CompositeTutorialEuml.cpp" target="_top">tutorial</a>) 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
|
||||
@@ -205,7 +205,7 @@ Empty_impl const Empty;</pre><p>Notice also that we defined a method named activ
|
||||
machine, for example:</p><pre class="programlisting">BOOST_MSM_EUML_DECLARE_STATE_MACHINE(...,Playing_)
|
||||
typedef msm::back::state_machine<Playing_> Playing_type;
|
||||
Playing_type const Playing;</pre><p>We can now use this instance inside the transition table of the containing
|
||||
state machine:</p><pre class="programlisting">Paused == Playing + pause / pause_playback</pre></div><div class="sect2" title="Attributes / Function call"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1705"></a>
|
||||
state machine:</p><pre class="programlisting">Paused == Playing + pause / pause_playback</pre></div><div class="sect2" title="Attributes / Function call"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1713"></a>
|
||||
<span class="command"><strong><a name="eUML-attributes"></a></strong></span>Attributes / Function call</h3></div></div></div><p>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
|
||||
@@ -259,7 +259,7 @@ BOOST_MSM_EUML_DECLARE_ATTRIBUTE(DiskTypeEnum,cd_type)</pre><p>This declares two
|
||||
This method could also have an (or several) argument(s), for example the
|
||||
event, we could then call activate_empty_(target_ , event_).</p><p>More examples can be found in the <a class="link" href="examples/CompilerStressTestEuml.cpp" target="_top">terrible compiler
|
||||
stress test</a>, the <a class="link" href="examples/SimpleTimer.cpp" target="_top">timer example</a> or in the <a class="link" href="examples/iPodSearchEuml.cpp" target="_top">iPodSearch with eUML</a>
|
||||
(for String_ and more).</p></div><div class="sect2" title="Orthogonal regions, flags, event deferring"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1805"></a>Orthogonal regions, flags, event deferring</h3></div></div></div><p>Defining orthogonal regions really means providing more initial states. To
|
||||
(for String_ and more).</p></div><div class="sect2" title="Orthogonal regions, flags, event deferring"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1813"></a>Orthogonal regions, flags, event deferring</h3></div></div></div><p>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 :</p><pre class="programlisting">BOOST_MSM_EUML_DECLARE_STATE_MACHINE((transition_table,
|
||||
init_ << Empty << AllOk ),
|
||||
@@ -311,7 +311,7 @@ BOOST_MSM_EUML_DECLARE_ATTRIBUTE(DiskTypeEnum,cd_type)</pre><p>This declares two
|
||||
attributes_ << no_attributes_,
|
||||
configure_<< deferred_events ),
|
||||
player_)</pre><p>A <a class="link" href="examples/OrthogonalDeferredEuml2.cpp" target="_top">tutorial</a>
|
||||
illustrates this possibility.</p></div><div class="sect2" title="Customizing a state machine / Getting more speed"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1917"></a>
|
||||
illustrates this possibility.</p></div><div class="sect2" title="Customizing a state machine / Getting more speed"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1925"></a>
|
||||
<span class="command"><strong><a name="eUML-Configuration"></a></strong></span>Customizing a state machine / Getting
|
||||
more speed</h3></div></div></div><p>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:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">configure_ << no_exception</code>: disables
|
||||
@@ -323,7 +323,7 @@ BOOST_MSM_EUML_DECLARE_ATTRIBUTE(DiskTypeEnum,cd_type)</pre><p>This declares two
|
||||
with eUML does this for the best performance.</p><p><span class="underline">Important note</span>: As exit pseudo
|
||||
states are using the message queue to forward events out of a submachine,
|
||||
the <code class="code">no_message_queue</code> option cannot be used with state machines
|
||||
containing an exit pseudo state.</p></div><div class="sect2" title="Completion / Anonymous transitions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1952"></a>Completion / Anonymous transitions</h3></div></div></div><p>Anonymous transitions (See <span class="command"><strong><a class="command" href="ch02s02.html#uml-anonymous">UML
|
||||
containing an exit pseudo state.</p></div><div class="sect2" title="Completion / Anonymous transitions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1960"></a>Completion / Anonymous transitions</h3></div></div></div><p>Anonymous transitions (See <span class="command"><strong><a class="command" href="ch02s02.html#uml-anonymous">UML
|
||||
tutorial</a></strong></span>) 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
|
||||
@@ -331,7 +331,7 @@ BOOST_MSM_EUML_DECLARE_ATTRIBUTE(DiskTypeEnum,cd_type)</pre><p>This declares two
|
||||
example: </p><pre class="programlisting">State3 == State4 [always_true] / State3ToState4
|
||||
State4 [always_true] / State3ToState4 == State3</pre><p>Please have a look at <a class="link" href="examples/AnonymousTutorialEuml.cpp" target="_top">this example</a>,
|
||||
which implements the <span class="command"><strong><a class="command" href="ch03s02.html#anonymous-transitions">previously
|
||||
defined</a></strong></span> state machine with eUML.</p></div><div class="sect2" title="Internal transitions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1970"></a><span class="command"><strong><a name="eUML-internal"></a></strong></span>Internal transitions</h3></div></div></div><p>Like both other front-ends, eUML supports two ways of defining internal transitions:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>in the state machine's transition table. In this case, you
|
||||
defined</a></strong></span> state machine with eUML.</p></div><div class="sect2" title="Internal transitions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1978"></a><span class="command"><strong><a name="eUML-internal"></a></strong></span>Internal transitions</h3></div></div></div><p>Like both other front-ends, eUML supports two ways of defining internal transitions:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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
|
||||
@@ -352,11 +352,11 @@ struct Open_impl : public Open_def
|
||||
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).</p></li></ul></div></div><div class="sect2" title="Kleene(any) event)"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2001"></a><span class="command"><strong><a name="kleene-event"></a></strong></span>Kleene(any) event)</h3></div></div></div><p>As for the functor front-end, eUML supports the concept of an <span class="italic"><span class="command"><strong><a class="command" href="ch03s03.html#any-event">any</a></strong></span></span>
|
||||
instead of O(number of regions).</p></li></ul></div></div><div class="sect2" title="Kleene(any) event)"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2009"></a><span class="command"><strong><a name="kleene-event"></a></strong></span>Kleene(any) event)</h3></div></div></div><p>As for the functor front-end, eUML supports the concept of an <span class="italic"><span class="command"><strong><a class="command" href="ch03s03.html#any-event">any</a></strong></span></span>
|
||||
event, but boost::any is not an acceptable eUML terminal. If you need an
|
||||
<span class="italic">any</span> event, use
|
||||
msm::front::euml::kleene, which inherits boost::any. The same transition as
|
||||
with boost:any would be: </p><pre class="programlisting">State1 + kleene == State2</pre></div><div class="sect2" title="Other state types"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2016"></a>Other state types</h3></div></div></div><p>We saw the <span class="command"><strong><a class="command" href="ch03s04.html#eUML-build-state">build_state</a></strong></span>
|
||||
with boost:any would be: </p><pre class="programlisting">State1 + kleene == State2</pre></div><div class="sect2" title="Other state types"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2024"></a>Other state types</h3></div></div></div><p>We saw the <span class="command"><strong><a class="command" href="ch03s04.html#eUML-build-state">build_state</a></strong></span>
|
||||
function, which creates a simple state. Likewise, eUML provides other
|
||||
state-building macros for other types of states:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>BOOST_MSM_EUML_TERMINATE_STATE takes the same arguments as
|
||||
BOOST_MSM_EUML_STATE and defines, well, a terminate
|
||||
@@ -396,7 +396,7 @@ struct Open_impl : public Open_def
|
||||
</p><pre class="programlisting">entry_pt_(SubFsm2,PseudoEntry1) == State1 + event4</pre><p>For exit points, it is again the same syntax except that exit points are
|
||||
used as source of the transition:
|
||||
</p><pre class="programlisting">State2 == exit_pt_(SubFsm2,PseudoExit1) + event6 </pre><p>The <a class="link" href="examples/DirectEntryEuml.cpp" target="_top">entry tutorial</a>
|
||||
is also available with eUML.</p></div><div class="sect2" title="Helper functions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2080"></a>Helper functions</h3></div></div></div><p>We saw a few helpers but there are more, so let us have a more complete description:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>event_ : used inside any action, the event triggering the
|
||||
is also available with eUML.</p></div><div class="sect2" title="Helper functions"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2088"></a>Helper functions</h3></div></div></div><p>We saw a few helpers but there are more, so let us have a more complete description:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>event_ : used inside any action, the event triggering the
|
||||
transition</p></li><li class="listitem"><p>state_: used inside entry and exit actions, the entered /
|
||||
exited state</p></li><li class="listitem"><p>source_: used inside a transition action, the source
|
||||
state</p></li><li class="listitem"><p>target_: used inside a transition action, the target
|
||||
@@ -434,7 +434,7 @@ struct Open_impl : public Open_def
|
||||
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, <span class="underline">except</span>, for the
|
||||
moment, with the while_, if_then_, if_then_else_ functions.</p></div><div class="sect2" title="Phoenix-like STL support"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2183"></a>Phoenix-like STL support</h3></div></div></div><p>eUML supports most C++ operators (except address-of). For example it is
|
||||
moment, with the while_, if_then_, if_then_else_ functions.</p></div><div class="sect2" title="Phoenix-like STL support"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2191"></a>Phoenix-like STL support</h3></div></div></div><p>eUML supports most C++ operators (except address-of). For example it is
|
||||
possible to write event_(some_attribute)++ or [source_(some_bool) &&
|
||||
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
|
||||
@@ -463,7 +463,7 @@ struct Open_impl : public Open_def
|
||||
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</p></li></ul></div></div><div class="sect2" title="Writing actions with Boost.Phoenix (in development)"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2236"></a><span class="command"><strong><a name="eUML-phoenix"></a></strong></span>Writing actions with Boost.Phoenix (in development)</h3></div></div></div><p> It is also possible to write actions, guards, state entry and exit
|
||||
post-increment</p></li></ul></div></div><div class="sect2" title="Writing actions with Boost.Phoenix (in development)"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2244"></a><span class="command"><strong><a name="eUML-phoenix"></a></strong></span>Writing actions with Boost.Phoenix (in development)</h3></div></div></div><p> It is also possible to write actions, guards, state entry and exit
|
||||
actions using a reduced set of Boost.Phoenix capabilities. This feature
|
||||
is still in development stage, so you might get here and there some
|
||||
surprise. Simple cases, however, should work well. What will not work
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Back-end</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch03.html" title="Chapter 3. Tutorial"><link rel="prev" href="ch03s04.html" title="eUML (experimental)"><link rel="next" href="ch04.html" title="Chapter 4. Performance / Compilers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Back-end</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s04.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Tutorial</th><td width="20%" align="right"> <a accesskey="n" href="ch04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Back-end"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2290"></a>Back-end</h2></div></div></div><p>There is, at the moment, one back-end. This back-end contains the library
|
||||
<title>Back-end</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch03.html" title="Chapter 3. Tutorial"><link rel="prev" href="ch03s04.html" title="eUML (experimental)"><link rel="next" href="ch04.html" title="Chapter 4. Performance / Compilers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Back-end</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s04.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Tutorial</th><td width="20%" align="right"> <a accesskey="n" href="ch04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Back-end"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2298"></a>Back-end</h2></div></div></div><p>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
|
||||
@@ -8,11 +8,11 @@
|
||||
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.</p><div class="sect2" title="Creation"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2295"></a>Creation </h3></div></div></div><p>MSM being divided between front and back-end, one needs to first define a
|
||||
run-to-completion algorithm.</p><div class="sect2" title="Creation"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2303"></a>Creation </h3></div></div></div><p>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:
|
||||
</p><pre class="programlisting">typedef msm::back::state_machine<my_front_end> my_fsm;</pre><p>We now have a fully functional state machine type. The next sections will
|
||||
describe what can be done with it.</p></div><div class="sect2" title="Starting and stopping a state machine"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2304"></a><span class="command"><strong><a name="backend-start"></a></strong></span>Starting and stopping a state
|
||||
describe what can be done with it.</p></div><div class="sect2" title="Starting and stopping a state machine"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2312"></a><span class="command"><strong><a name="backend-start"></a></strong></span>Starting and stopping a state
|
||||
machine</h3></div></div></div><p>The <code class="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
|
||||
@@ -23,7 +23,7 @@
|
||||
the algorithm run once. The <a class="link" href="examples/iPodSearch.cpp" target="_top">iPodSearch</a> example uses this possibility.</p><p>The <code class="code">stop()</code> method works the same way. It will cause the exit
|
||||
actions of the currently active states(s) to be called.</p><p>Both methods are actually not an absolute need. Not calling them will
|
||||
simply cause your first entry or your last exit action not to be
|
||||
called.</p></div><div class="sect2" title="Event dispatching"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2323"></a>Event dispatching</h3></div></div></div><p>The main reason to exist for a state machine is to dispatch events. For
|
||||
called.</p></div><div class="sect2" title="Event dispatching"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2331"></a>Event dispatching</h3></div></div></div><p>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
|
||||
@@ -34,14 +34,14 @@
|
||||
an event of type some_event, you can simply create one on the fly or
|
||||
instantiate if before processing: </p><pre class="programlisting">my_fsm fsm; fsm.process_event(some_event());
|
||||
some_event e1; fsm.process_event(e1)</pre><p>Creating an event on the fly will be optimized by the compiler so the
|
||||
performance will not degrade.</p></div><div class="sect2" title="Active state(s)"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2332"></a>Active state(s)</h3></div></div></div><p>The backend also offers a way to know which state is active, though you
|
||||
performance will not degrade.</p></div><div class="sect2" title="Active state(s)"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2340"></a>Active state(s)</h3></div></div></div><p>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, <span class="command"><strong><a class="command" href="ch02s02.html#UML-internal-transition">internal transitions</a></strong></span> or
|
||||
<span class="command"><strong><a class="command" href="ch03s05.html#backend-visitor">visitors</a></strong></span> 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
|
||||
<span class="command"><strong><a class="command" href="ch06s03.html#internals-state-id">internals section</a></strong></span> to
|
||||
know how state ids are generated.</p></div><div class="sect2" title="Serialization"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2346"></a><span class="command"><strong><a name="back-end-serialization"></a></strong></span>Serialization</h3></div></div></div><p>A common need is the ability to save a state machine and restore it at a
|
||||
know how state ids are generated.</p></div><div class="sect2" title="Serialization"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2354"></a><span class="command"><strong><a name="back-end-serialization"></a></strong></span>Serialization</h3></div></div></div><p>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 class="code">serialize</code>
|
||||
@@ -110,7 +110,7 @@ std::ofstream ofs("fsm.txt");
|
||||
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).</p><p>This <a class="link" href="examples/Serialize.cpp" target="_top">example</a> shows a state machine which we serialize after processing an
|
||||
event. The <code class="code">Empty</code> state also has some data to serialize.</p></div><div class="sect2" title="Base state type"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2399"></a><span class="command"><strong><a name="backend-base-state"></a></strong></span>Base state type </h3></div></div></div><p>Sometimes, one needs to customize states to avoid repetition and provide a
|
||||
event. The <code class="code">Empty</code> state also has some data to serialize.</p></div><div class="sect2" title="Base state type"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2407"></a><span class="command"><strong><a name="backend-base-state"></a></strong></span>Base state type </h3></div></div></div><p>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
|
||||
@@ -133,7 +133,7 @@ std::ofstream ofs("fsm.txt");
|
||||
</p><pre class="programlisting">struct player_ : public msm::front::state_machine<player_,my_base_state> </pre></li></ul></div><p>You can also ask for a state with a given id (which you might have gotten
|
||||
from current_state()) using <code class="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.</p></div><div class="sect2" title="Visitor"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2425"></a><span class="command"><strong><a name="backend-visitor"></a></strong></span>Visitor</h3></div></div></div><p>In some cases, having a pointer-to-base of the currently active states is
|
||||
do something polymorphically.</p></div><div class="sect2" title="Visitor"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2433"></a><span class="command"><strong><a name="backend-visitor"></a></strong></span>Visitor</h3></div></div></div><p>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!</p><p>To achieve this goal, MSM provides its own variation of a visitor pattern
|
||||
@@ -172,18 +172,18 @@ struct my_visitable_state
|
||||
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:</p><pre class="programlisting">SomeVisitor vis; sm.visit_current_states(boost::ref(vis));</pre><p>This <a class="link" href="examples/SM-2Arg.cpp" target="_top">example</a> uses a
|
||||
visiting function with 2 arguments.</p></div><div class="sect2" title="Flags"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2468"></a>Flags</h3></div></div></div><p>Flags is a MSM-only concept, supported by all front-ends, which base
|
||||
visiting function with 2 arguments.</p></div><div class="sect2" title="Flags"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2476"></a>Flags</h3></div></div></div><p>Flags is a MSM-only concept, supported by all front-ends, which base
|
||||
themselves on the functions: </p><pre class="programlisting">template <class Flag> bool is_flag_active()
|
||||
template <class Flag,class BinaryOp> bool is_flag_active()</pre><p>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:</p><pre class="programlisting">my_fsm.is_flag_active<MyFlag>()
|
||||
my_fsm.is_flag_active<MyFlag,my_fsm_type::Flag_OR>()</pre><p>Please refer to the front-ends sections for usage examples.</p></div><div class="sect2" title="Getting a state"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2481"></a>Getting a state</h3></div></div></div><p>It is sometimes necessary to have the client code get access to the
|
||||
my_fsm.is_flag_active<MyFlag,my_fsm_type::Flag_OR>()</pre><p>Please refer to the front-ends sections for usage examples.</p></div><div class="sect2" title="Getting a state"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2489"></a>Getting a state</h3></div></div></div><p>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: </p><pre class="programlisting">player::Stopped* tempstate = p.get_state<player::Stopped*>();</pre><p> or </p><pre class="programlisting">player::Stopped& tempstate2 = p.get_state<player::Stopped&>();</pre><p>depending on your personal taste. </p></div><div class="sect2" title="State machine constructor with arguments"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2494"></a><span class="command"><strong><a name="backend-fsm-constructor-args"></a></strong></span> State machine constructor with arguments </h3></div></div></div><p>You might want to define a state machine with a non-default constructor.
|
||||
name, for example: </p><pre class="programlisting">player::Stopped* tempstate = p.get_state<player::Stopped*>();</pre><p> or </p><pre class="programlisting">player::Stopped& tempstate2 = p.get_state<player::Stopped&>();</pre><p>depending on your personal taste. </p></div><div class="sect2" title="State machine constructor with arguments"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2502"></a><span class="command"><strong><a name="backend-fsm-constructor-args"></a></strong></span> State machine constructor with arguments </h3></div></div></div><p>You might want to define a state machine with a non-default constructor.
|
||||
For example, you might want to write: </p><pre class="programlisting">struct player_ : public msm::front::state_machine_def<player_>
|
||||
{
|
||||
player_(int some_value){…}
|
||||
@@ -209,7 +209,7 @@ player p(boost::ref(data),3);
|
||||
where some data is passed:</p><pre class="programlisting">player p( back::states_ << Playing(back::states_ << Song1(some_Song1_data)) ,
|
||||
boost::ref(data),3);</pre><p>It is also possible to replace a given state by a new instance at any time
|
||||
using <code class="code">set_states()</code> and the same syntax, for example:
|
||||
</p><pre class="programlisting">p.set_states( back::states_ << state_1 << ... << state_n );</pre><p>An <a class="link" href="examples/Constructor.cpp" target="_top">example</a> making intensive use of this capability is provided.</p></div><div class="sect2" title="Trading run-time speed for better compile-time / multi-TU compilation"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2534"></a><span class="command"><strong><a name="backend-tradeof-rt-ct"></a></strong></span>Trading run-time speed for
|
||||
</p><pre class="programlisting">p.set_states( back::states_ << state_1 << ... << state_n );</pre><p>An <a class="link" href="examples/Constructor.cpp" target="_top">example</a> making intensive use of this capability is provided.</p></div><div class="sect2" title="Trading run-time speed for better compile-time / multi-TU compilation"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2542"></a><span class="command"><strong><a name="backend-tradeof-rt-ct"></a></strong></span>Trading run-time speed for
|
||||
better compile-time / multi-TU compilation</h3></div></div></div><p>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
|
||||
@@ -232,7 +232,7 @@ BOOST_MSM_BACK_GENERATE_PROCESS_EVENT(mysubmachine)</pre></li><li class="listite
|
||||
submachines, which will greatly speed up the compilation if you factor your
|
||||
state machine into smaller submachines.</p><p>Independently, transition conflicts resolution will also be much
|
||||
faster.</p><p>This policy uses boost.any behind the hood, which means that we will lose
|
||||
one feature which MSM offers with the default policy, <a class="link" href="ch03s02.html#event-hierarchy">event hierarchy</a>. The following
|
||||
a feature which MSM offers with the default policy, <a class="link" href="ch03s02.html#event-hierarchy">event hierarchy</a>. The following
|
||||
example takes our iPod example and speeds up compile-time by using this
|
||||
technique. We have:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><a class="link" href="examples/iPod_distributed/iPod.cpp" target="_top">our main
|
||||
state machine and main function</a></p></li><li class="listitem"><p><a class="link" href="examples/iPod_distributed/PlayingMode.hpp" target="_top">PlayingMode moved to a separate header</a></p></li><li class="listitem"><p><a class="link" href="examples/iPod_distributed/PlayingMode.cpp" target="_top">a
|
||||
@@ -240,7 +240,7 @@ BOOST_MSM_BACK_GENERATE_PROCESS_EVENT(mysubmachine)</pre></li><li class="listite
|
||||
cpp for MenuMode</a></p></li><li class="listitem"><p><a class="link" href="examples/iPod_distributed/Events.hpp" target="_top">events
|
||||
move to a separate header as all machines use
|
||||
it</a></p></li></ul></div><p>
|
||||
</p></div><div class="sect2" title="Compile-time state machine analysis"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2616"></a><span class="command"><strong><a name="backend-compile-time-analysis"></a></strong></span>Compile-time state machine analysis </h3></div></div></div><p>A MSM state machine being a metaprogram, it is only logical that cheking
|
||||
</p></div><div class="sect2" title="Compile-time state machine analysis"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2624"></a><span class="command"><strong><a name="backend-compile-time-analysis"></a></strong></span>Compile-time state machine analysis </h3></div></div></div><p>A MSM state machine being a metaprogram, it is only logical that cheking
|
||||
for the validity of a concrete state machine happens compile-time. To this
|
||||
aim, using the compile-time graph library <a class="link" href="http://www.dynagraph.org/mpl_graph/" target="_top">mpl_graph</a> (delivered at the moment
|
||||
with MSM) from Gordon Woodhull, MSM provides several compile-time checks:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Check that orthogonal regions ar truly orthogonal.</p></li><li class="listitem"><p>Check that all states are either reachable from the initial
|
||||
@@ -254,12 +254,12 @@ BOOST_MSM_BACK_GENERATE_PROCESS_EVENT(mysubmachine)</pre></li><li class="listite
|
||||
versions of MSM.</p><p>The same algorithm is also used in case you want to omit providing the
|
||||
region index in the <span class="command"><strong><a class="command" href="ch03s02.html#explicit-entry-no-region-id">explicit entry / pseudo entry state</a></strong></span> declaration.</p><p>The author's advice is to enable the checks after any state machine
|
||||
structure change and disable it again after sucessful analysis.</p><p>The <a class="link" href="examples/TestErrorOrthogonality.cpp" target="_top">following example</a> provokes an assertion if one of the first two lines
|
||||
of the transition table is used.</p></div><div class="sect2" title="Enqueueing events for later processing"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2660"></a><span class="command"><strong><a name="backend-enqueueing"></a></strong></span> Enqueueing events for later
|
||||
of the transition table is used.</p></div><div class="sect2" title="Enqueueing events for later processing"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2668"></a><span class="command"><strong><a name="backend-enqueueing"></a></strong></span> Enqueueing events for later
|
||||
processing </h3></div></div></div><p>Calling <code class="code">process_event(Event const&)</code> will immediately
|
||||
process the event with run-to-completion semantics. You can also enqueue the
|
||||
events and delay their processing by calling <code class="code">enqueue_event(Event
|
||||
const&)</code> instead. Calling <code class="code">execute_queued_events()</code> will then
|
||||
process all enqueued events (in FIFO order).</p><p>You can query the queue size by calling <code class="code">get_message_queue_size()</code>.</p></div><div class="sect2" title="Customizing the message queues"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2680"></a><span class="command"><strong><a name="backend-queues"></a></strong></span> Customizing the message queues </h3></div></div></div><p>MSM uses by default a std::deque for its queues (one message queue for
|
||||
process all enqueued events (in FIFO order).</p><p>You can query the queue size by calling <code class="code">get_message_queue_size()</code>.</p></div><div class="sect2" title="Customizing the message queues"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2688"></a><span class="command"><strong><a name="backend-queues"></a></strong></span> Customizing the message queues </h3></div></div></div><p>MSM uses by default a std::deque for its queues (one message queue for
|
||||
events generated during run-to-completion or with
|
||||
<code class="code">enqueue_event</code>, one for deferred events). Unfortunately, on some
|
||||
STL implementations, it is a very expensive container in size and copying
|
||||
@@ -270,14 +270,14 @@ BOOST_MSM_BACK_GENERATE_PROCESS_EVENT(mysubmachine)</pre></li><li class="listite
|
||||
Boost::circular_buffer is outside of the scope of this documentation. What
|
||||
you will however need to define is the queue capacity (initially is 0) to
|
||||
what you think your queue will at most grow, for example (size 1 is
|
||||
common):</p><pre class="programlisting"> fsm.get_message_queue().set_capacity(1); </pre></div><div class="sect2" title="Policy definition with Boost.Parameter"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2695"></a><span class="command"><strong><a name="backend-boost-parameter"></a></strong></span>Policy definition with Boost.Parameter </h3></div></div></div><p>MSM uses Boost.Parameter to allow easier definition of
|
||||
common):</p><pre class="programlisting"> fsm.get_message_queue().set_capacity(1); </pre></div><div class="sect2" title="Policy definition with Boost.Parameter"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2703"></a><span class="command"><strong><a name="backend-boost-parameter"></a></strong></span>Policy definition with Boost.Parameter </h3></div></div></div><p>MSM uses Boost.Parameter to allow easier definition of
|
||||
back::state_machine<> policy arguments (all except the front-end). This
|
||||
allows you to define policy arguments (history, compile-time / run-time,
|
||||
state machine analysis, container for the queues) at any position, in any
|
||||
number. For example: </p><pre class="programlisting"> typedef msm::back::state_machine< player_,msm::back::mpl_graph_fsm_check> player;
|
||||
typedef msm::back::state_machine< player_,msm::back::AlwaysHistory> player;
|
||||
typedef msm::back::state_machine< player_,msm::back::mpl_graph_fsm_check,msm::back::AlwaysHistory> player;
|
||||
typedef msm::back::state_machine< player_,msm::back::AlwaysHistory,msm::back::mpl_graph_fsm_check> player; </pre></div><div class="sect2" title="Choosing when to switch active states"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2703"></a><span class="command"><strong><a name="backend-state-switch"></a></strong></span>Choosing when to switch active
|
||||
typedef msm::back::state_machine< player_,msm::back::AlwaysHistory,msm::back::mpl_graph_fsm_check> player; </pre></div><div class="sect2" title="Choosing when to switch active states"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2711"></a><span class="command"><strong><a name="backend-state-switch"></a></strong></span>Choosing when to switch active
|
||||
states </h3></div></div></div><p>The UML Standard is silent about a very important question: when a
|
||||
transition fires, at which exact point is the target state the new active
|
||||
state of a state machine? At the end of the transition? After the source
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 4. Performance / Compilers</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch03s05.html" title="Back-end"><link rel="next" href="ch04s02.html" title="Executable size"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 4. Performance / Compilers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s05.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch04s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 4. Performance / Compilers"><div class="titlepage"><div><div><h2 class="title"><a name="d0e2762"></a>Chapter 4. Performance / Compilers</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch04.html#d0e2784">Speed</a></span></dt><dt><span class="sect1"><a href="ch04s02.html">Executable size</a></span></dt><dt><span class="sect1"><a href="ch04s03.html">Supported compilers</a></span></dt><dt><span class="sect1"><a href="ch04s04.html"> Limitations </a></span></dt><dt><span class="sect1"><a href="ch04s05.html"> Compilers corner </a></span></dt></dl></div><p>Tests were made on different PCs running Windows XP and Vista and compiled with
|
||||
<title>Chapter 4. Performance / Compilers</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch03s05.html" title="Back-end"><link rel="next" href="ch04s02.html" title="Executable size"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 4. Performance / Compilers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s05.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch04s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 4. Performance / Compilers"><div class="titlepage"><div><div><h2 class="title"><a name="d0e2770"></a>Chapter 4. Performance / Compilers</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch04.html#d0e2792">Speed</a></span></dt><dt><span class="sect1"><a href="ch04s02.html">Executable size</a></span></dt><dt><span class="sect1"><a href="ch04s03.html">Supported compilers</a></span></dt><dt><span class="sect1"><a href="ch04s04.html"> Limitations </a></span></dt><dt><span class="sect1"><a href="ch04s05.html"> Compilers corner </a></span></dt></dl></div><p>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 <a class="link" href="examples/SCSimple.cpp" target="_top">state machine with only simple states</a>
|
||||
and as a <a class="link" href="examples/SCComposite.cpp" target="_top">state machine with a composite
|
||||
@@ -9,5 +9,5 @@
|
||||
the simple one also with <a class="link" href="examples/MsmSimpleFunctors.cpp" target="_top">functors</a> and with <a class="link" href="examples/EumlSimple.cpp" target="_top">eUML</a>. 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.</p><div class="sect1" title="Speed"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2784"></a>Speed</h2></div></div></div><p>VC9:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>The simple test completes 90 times faster with MSM than with
|
||||
64.</p><div class="sect1" title="Speed"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2792"></a>Speed</h2></div></div></div><p>VC9:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>The simple test completes 90 times faster with MSM than with
|
||||
Boost.Statechart</p></li><li class="listitem"><p>The composite test completes 25 times faster with MSM</p></li></ul></div><p>gcc 4.2.3 (Ubuntu 8.04 in VMWare, same PC):</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>The simple test completes 46 times faster with MSM</p></li><li class="listitem"><p>The composite test completes 19 times faster with Msm</p></li></ul></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s05.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="pt01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch04s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Back-end </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Executable size</td></tr></table></div></body></html>
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Executable size</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch04.html" title="Chapter 4. Performance / Compilers"><link rel="prev" href="ch04.html" title="Chapter 4. Performance / Compilers"><link rel="next" href="ch04s03.html" title="Supported compilers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Executable size</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04.html">Prev</a> </td><th width="60%" align="center">Chapter 4. Performance / Compilers</th><td width="20%" align="right"> <a accesskey="n" href="ch04s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Executable size"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2805"></a>Executable size</h2></div></div></div><p>There are some worries that MSM generates huge code. Is it true? The 2
|
||||
<title>Executable size</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch04.html" title="Chapter 4. Performance / Compilers"><link rel="prev" href="ch04.html" title="Chapter 4. Performance / Compilers"><link rel="next" href="ch04s03.html" title="Supported compilers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Executable size</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04.html">Prev</a> </td><th width="60%" align="center">Chapter 4. Performance / Compilers</th><td width="20%" align="right"> <a accesskey="n" href="ch04s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Executable size"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2813"></a>Executable size</h2></div></div></div><p>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.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Supported compilers</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch04.html" title="Chapter 4. Performance / Compilers"><link rel="prev" href="ch04s02.html" title="Executable size"><link rel="next" href="ch04s04.html" title="Limitations"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Supported compilers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s02.html">Prev</a> </td><th width="60%" align="center">Chapter 4. Performance / Compilers</th><td width="20%" align="right"> <a accesskey="n" href="ch04s04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Supported compilers"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2810"></a>Supported compilers</h2></div></div></div><p>For a current status, have a look at the <a class="link" href="http://www.boost.org/development/tests/trunk/developer/msm.html" target="_top">regression tests</a>.</p><p>MSM was successfully tested with: </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>VC8 (partly), VC9, VC10</p></li><li class="listitem"><p>g++ 4.0.1 and higher</p></li><li class="listitem"><p>Intel 10.1 and higher</p></li><li class="listitem"><p>Clang 2.9</p></li><li class="listitem"><p>Green Hills Software MULTI for ARM v5.0.5 patch 4416 (Simple and
|
||||
<title>Supported compilers</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch04.html" title="Chapter 4. Performance / Compilers"><link rel="prev" href="ch04s02.html" title="Executable size"><link rel="next" href="ch04s04.html" title="Limitations"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Supported compilers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s02.html">Prev</a> </td><th width="60%" align="center">Chapter 4. Performance / Compilers</th><td width="20%" align="right"> <a accesskey="n" href="ch04s04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Supported compilers"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2818"></a>Supported compilers</h2></div></div></div><p>For a current status, have a look at the <a class="link" href="http://www.boost.org/development/tests/trunk/developer/msm.html" target="_top">regression tests</a>.</p><p>MSM was successfully tested with: </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>VC8 (partly), VC9, VC10</p></li><li class="listitem"><p>g++ 4.0.1 and higher</p></li><li class="listitem"><p>Intel 10.1 and higher</p></li><li class="listitem"><p>Clang 2.9</p></li><li class="listitem"><p>Green Hills Software MULTI for ARM v5.0.5 patch 4416 (Simple and
|
||||
Composite tutorials)</p></li><li class="listitem"><p>Partial support for IBM compiler</p></li></ul></div><p>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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Limitations</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch04.html" title="Chapter 4. Performance / Compilers"><link rel="prev" href="ch04s03.html" title="Supported compilers"><link rel="next" href="ch04s05.html" title="Compilers corner"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center"> Limitations </th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s03.html">Prev</a> </td><th width="60%" align="center">Chapter 4. Performance / Compilers</th><td width="20%" align="right"> <a accesskey="n" href="ch04s05.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Limitations"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2841"></a> Limitations </h2></div></div></div><p>
|
||||
<title>Limitations</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch04.html" title="Chapter 4. Performance / Compilers"><link rel="prev" href="ch04s03.html" title="Supported compilers"><link rel="next" href="ch04s05.html" title="Compilers corner"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center"> Limitations </th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s03.html">Prev</a> </td><th width="60%" align="center">Chapter 4. Performance / Compilers</th><td width="20%" align="right"> <a accesskey="n" href="ch04s05.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Limitations"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2849"></a> Limitations </h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Compilers corner</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch04.html" title="Chapter 4. Performance / Compilers"><link rel="prev" href="ch04s04.html" title="Limitations"><link rel="next" href="ch05.html" title="Chapter 5. Questions & Answers, tips"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center"> Compilers corner </th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s04.html">Prev</a> </td><th width="60%" align="center">Chapter 4. Performance / Compilers</th><td width="20%" align="right"> <a accesskey="n" href="ch05.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Compilers corner"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2862"></a> Compilers corner </h2></div></div></div><p>Compilers are sometimes full of surprises and such strange errors happened in
|
||||
<title>Compilers corner</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch04.html" title="Chapter 4. Performance / Compilers"><link rel="prev" href="ch04s04.html" title="Limitations"><link rel="next" href="ch05.html" title="Chapter 5. Questions & Answers, tips"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center"> Compilers corner </th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s04.html">Prev</a> </td><th width="60%" align="center">Chapter 4. Performance / Compilers</th><td width="20%" align="right"> <a accesskey="n" href="ch05.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Compilers corner"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2870"></a> Compilers corner </h2></div></div></div><p>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.</p><p><span class="underline">VC8</span>: </p><pre class="programlisting">template <class StateType>
|
||||
typename ::boost::enable_if<
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 5. Questions & Answers, tips</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch04s05.html" title="Compilers corner"><link rel="next" href="ch06.html" title="Chapter 6. Internals"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 5. Questions & Answers, tips</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s05.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch06.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 5. Questions & Answers, tips"><div class="titlepage"><div><div><h2 class="title"><a name="d0e2912"></a>Chapter 5. Questions & Answers, tips</h2></div></div></div><p><span class="underline">Where should I define a state machine?</span>: The
|
||||
<title>Chapter 5. Questions & Answers, tips</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch04s05.html" title="Compilers corner"><link rel="next" href="ch06.html" title="Chapter 6. Internals"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 5. Questions & Answers, tips</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s05.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch06.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 5. Questions & Answers, tips"><div class="titlepage"><div><div><h2 class="title"><a name="d0e2920"></a>Chapter 5. Questions & Answers, tips</h2></div></div></div><p><span class="underline">Where should I define a state machine?</span>: The
|
||||
tutorials are implemented in a simple cpp source file for simplicity. I want to
|
||||
model dynamic behavior of a class as a state machine, how should I define the state
|
||||
machine?</p><p><span class="underline">Answer</span>: Usually you'll want to implement the
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 6. Internals</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch05.html" title="Chapter 5. Questions & Answers, tips"><link rel="next" href="ch06s02.html" title="Frontend / Backend interface"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 6. Internals</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch05.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch06s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 6. Internals"><div class="titlepage"><div><div><h2 class="title"><a name="d0e2997"></a>Chapter 6. Internals</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch06.html#d0e3002">Backend: Run To Completion</a></span></dt><dt><span class="sect1"><a href="ch06s02.html">Frontend / Backend
|
||||
<title>Chapter 6. Internals</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch05.html" title="Chapter 5. Questions & Answers, tips"><link rel="next" href="ch06s02.html" title="Frontend / Backend interface"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 6. Internals</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch05.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch06s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 6. Internals"><div class="titlepage"><div><div><h2 class="title"><a name="d0e3005"></a>Chapter 6. Internals</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch06.html#d0e3010">Backend: Run To Completion</a></span></dt><dt><span class="sect1"><a href="ch06s02.html">Frontend / Backend
|
||||
interface</a></span></dt><dt><span class="sect1"><a href="ch06s03.html"> Generated state ids </a></span></dt><dt><span class="sect1"><a href="ch06s04.html">Metaprogramming tools</a></span></dt></dl></div><p>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.</p><div class="sect1" title="Backend: Run To Completion"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3002"></a><span class="command"><strong><a name="run-to-completion"></a></strong></span>Backend: Run To Completion</h2></div></div></div><p>The back-end implements the following run-to completion algorithm:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Check if one region of the concrete state machine is in a
|
||||
interface between front- and back- end is also described in detail.</p><div class="sect1" title="Backend: Run To Completion"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3010"></a><span class="command"><strong><a name="run-to-completion"></a></strong></span>Backend: Run To Completion</h2></div></div></div><p>The back-end implements the following run-to completion algorithm:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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).</p></li><li class="listitem"><p>If the message queue feature is enabled and if the state machine
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Frontend / Backend interface</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch06.html" title="Chapter 6. Internals"><link rel="prev" href="ch06.html" title="Chapter 6. Internals"><link rel="next" href="ch06s03.html" title="Generated state ids"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Frontend / Backend
|
||||
interface</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch06.html">Prev</a> </td><th width="60%" align="center">Chapter 6. Internals</th><td width="20%" align="right"> <a accesskey="n" href="ch06s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Frontend / Backend interface"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3068"></a><span class="command"><strong><a name="internals-front-back-interface"></a></strong></span>Frontend / Backend
|
||||
<title>Frontend / Backend interface</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch06.html" title="Chapter 6. Internals"><link rel="prev" href="ch06.html" title="Chapter 6. Internals"><link rel="next" href="ch06s03.html" title="Generated state ids"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Frontend / Backend
|
||||
interface</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch06.html">Prev</a> </td><th width="60%" align="center">Chapter 6. Internals</th><td width="20%" align="right"> <a accesskey="n" href="ch06s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Frontend / Backend interface"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3076"></a><span class="command"><strong><a name="internals-front-back-interface"></a></strong></span>Frontend / Backend
|
||||
interface</h2></div></div></div><p>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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Generated state ids</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch06.html" title="Chapter 6. Internals"><link rel="prev" href="ch06s02.html" title="Frontend / Backend interface"><link rel="next" href="ch06s04.html" title="Metaprogramming tools"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center"> Generated state ids </th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch06s02.html">Prev</a> </td><th width="60%" align="center">Chapter 6. Internals</th><td width="20%" align="right"> <a accesskey="n" href="ch06s04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Generated state ids"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3246"></a><span class="command"><strong><a name="internals-state-id"></a></strong></span> Generated state ids </h2></div></div></div><p>Normally, one does not need to know the ids are generated for all the states
|
||||
<title>Generated state ids</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch06.html" title="Chapter 6. Internals"><link rel="prev" href="ch06s02.html" title="Frontend / Backend interface"><link rel="next" href="ch06s04.html" title="Metaprogramming tools"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center"> Generated state ids </th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch06s02.html">Prev</a> </td><th width="60%" align="center">Chapter 6. Internals</th><td width="20%" align="right"> <a accesskey="n" href="ch06s04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Generated state ids"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3254"></a><span class="command"><strong><a name="internals-state-id"></a></strong></span> Generated state ids </h2></div></div></div><p>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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Metaprogramming tools</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch06.html" title="Chapter 6. Internals"><link rel="prev" href="ch06s03.html" title="Generated state ids"><link rel="next" href="ch07.html" title="Chapter 7. Acknowledgements"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Metaprogramming tools</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch06s03.html">Prev</a> </td><th width="60%" align="center">Chapter 6. Internals</th><td width="20%" align="right"> <a accesskey="n" href="ch07.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Metaprogramming tools"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3258"></a>Metaprogramming tools</h2></div></div></div><p>We can find for the transition table more uses than what we have seen so far.
|
||||
<title>Metaprogramming tools</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch06.html" title="Chapter 6. Internals"><link rel="prev" href="ch06s03.html" title="Generated state ids"><link rel="next" href="ch07.html" title="Chapter 7. Acknowledgements"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Metaprogramming tools</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch06s03.html">Prev</a> </td><th width="60%" align="center">Chapter 6. Internals</th><td width="20%" align="right"> <a accesskey="n" href="ch07.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Metaprogramming tools"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3266"></a>Metaprogramming tools</h2></div></div></div><p>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.</p><p>What is needed for a coverage tool? You need to know how many states are
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 7. Acknowledgements</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch06s04.html" title="Metaprogramming tools"><link rel="next" href="ch07s02.html" title="MSM v1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 7. Acknowledgements</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch06s04.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch07s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 7. Acknowledgements"><div class="titlepage"><div><div><h2 class="title"><a name="d0e3292"></a>Chapter 7. Acknowledgements</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch07.html#d0e3297">MSM v2</a></span></dt><dt><span class="sect1"><a href="ch07s02.html"> MSM v1</a></span></dt></dl></div><p>I am in debt to the following people who helped MSM along the way.</p><div class="sect1" title="MSM v2"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3297"></a>MSM v2</h2></div></div></div><p>
|
||||
<title>Chapter 7. Acknowledgements</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch06s04.html" title="Metaprogramming tools"><link rel="next" href="ch07s02.html" title="MSM v1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 7. Acknowledgements</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch06s04.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch07s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 7. Acknowledgements"><div class="titlepage"><div><div><h2 class="title"><a name="d0e3300"></a>Chapter 7. Acknowledgements</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch07.html#d0e3305">MSM v2</a></span></dt><dt><span class="sect1"><a href="ch07s02.html"> MSM v1</a></span></dt></dl></div><p>I am in debt to the following people who helped MSM along the way.</p><div class="sect1" title="MSM v2"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3305"></a>MSM v2</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Thanks to Dave Abrahams for managing the review</p></li><li class="listitem"><p>Thanks to Eric Niebler for his patience correcting my grammar
|
||||
errors</p></li><li class="listitem"><p>Special thanks to Joel de Guzman who gave me very good ideas at
|
||||
the BoostCon09. These ideas were the starting point of the redesign.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>MSM v1</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch07.html" title="Chapter 7. Acknowledgements"><link rel="prev" href="ch07.html" title="Chapter 7. Acknowledgements"><link rel="next" href="ch08.html" title="Chapter 8. Version history"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center"> MSM v1</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch07.html">Prev</a> </td><th width="60%" align="center">Chapter 7. Acknowledgements</th><td width="20%" align="right"> <a accesskey="n" href="ch08.html">Next</a></td></tr></table><hr></div><div class="sect1" title="MSM v1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3325"></a> MSM v1</h2></div></div></div><p>
|
||||
<title>MSM v1</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch07.html" title="Chapter 7. Acknowledgements"><link rel="prev" href="ch07.html" title="Chapter 7. Acknowledgements"><link rel="next" href="ch08.html" title="Chapter 8. Version history"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center"> MSM v1</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch07.html">Prev</a> </td><th width="60%" align="center">Chapter 7. Acknowledgements</th><td width="20%" align="right"> <a accesskey="n" href="ch08.html">Next</a></td></tr></table><hr></div><div class="sect1" title="MSM v1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3333"></a> MSM v1</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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++
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 8. Version history</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch07s02.html" title="MSM v1"><link rel="next" href="ch08s02.html" title="From V2.22 to V2.23 (Boost 1.50)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 8. Version history</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch07s02.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch08s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 8. Version history"><div class="titlepage"><div><div><h2 class="title"><a name="d0e3341"></a>Chapter 8. Version history</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch08.html#d0e3344">From V2.23 to V2.24 (Boost 1.51)</a></span></dt><dt><span class="sect1"><a href="ch08s02.html">From V2.22 to V2.23 (Boost 1.50)</a></span></dt><dt><span class="sect1"><a href="ch08s03.html">From V2.21 to V2.22 (Boost 1.48)</a></span></dt><dt><span class="sect1"><a href="ch08s04.html">From V2.20 to V2.21 (Boost 1.47)</a></span></dt><dt><span class="sect1"><a href="ch08s05.html">From V2.12 to V2.20 (Boost 1.46)</a></span></dt><dt><span class="sect1"><a href="ch08s06.html">From V2.10 to V2.12 (Boost 1.45)</a></span></dt><dt><span class="sect1"><a href="ch08s07.html">From V2.0 to V2.12 (Boost 1.44)</a></span></dt></dl></div><div class="sect1" title="From V2.23 to V2.24 (Boost 1.51)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3344"></a>From V2.23 to V2.24 (Boost 1.51)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p> Support for <span class="command"><strong><a class="command" href="ch03s03.html#any-event">boost::any</a></strong></span>
|
||||
or <span class="command"><strong><a class="command" href="ch03s04.html#kleene-event">kleene</a></strong></span> as an
|
||||
acceptable event.</p></li><li class="listitem"><p>Bugfix: compiler error with fsm internal table and
|
||||
<code class="code">none</code>(compound) event.</p></li><li class="listitem"><p>Bugfix: <code class="code">euml::defer_</code> leading to stack overflow.</p></li></ul></div><p>
|
||||
</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch07s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="pt01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> MSM v1 </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.22 to V2.23 (Boost 1.50)</td></tr></table></div></body></html>
|
||||
<title>Chapter 8. Version history</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt01.html" title="Part I. User' guide"><link rel="prev" href="ch07s02.html" title="MSM v1"><link rel="next" href="ch08s02.html" title="From V2.23 to V2.24 (Boost 1.51)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 8. Version history</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch07s02.html">Prev</a> </td><th width="60%" align="center">Part I. User' guide</th><td width="20%" align="right"> <a accesskey="n" href="ch08s02.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 8. Version history"><div class="titlepage"><div><div><h2 class="title"><a name="d0e3349"></a>Chapter 8. Version history</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch08.html#d0e3352">From V2.24 to V2.25 (Boost 1.54)</a></span></dt><dt><span class="sect1"><a href="ch08s02.html">From V2.23 to V2.24 (Boost 1.51)</a></span></dt><dt><span class="sect1"><a href="ch08s03.html">From V2.22 to V2.23 (Boost 1.50)</a></span></dt><dt><span class="sect1"><a href="ch08s04.html">From V2.21 to V2.22 (Boost 1.48)</a></span></dt><dt><span class="sect1"><a href="ch08s05.html">From V2.20 to V2.21 (Boost 1.47)</a></span></dt><dt><span class="sect1"><a href="ch08s06.html">From V2.12 to V2.20 (Boost 1.46)</a></span></dt><dt><span class="sect1"><a href="ch08s07.html">From V2.10 to V2.12 (Boost 1.45)</a></span></dt><dt><span class="sect1"><a href="ch08s08.html">From V2.0 to V2.12 (Boost 1.44)</a></span></dt></dl></div><div class="sect1" title="From V2.24 to V2.25 (Boost 1.54)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3352"></a>From V2.24 to V2.25 (Boost 1.54)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Bugfix: Exit points broken for the favor_compile_time
|
||||
policy.</p></li><li class="listitem"><p>Bugfix: copy breaks exit points of subsubmachines.</p></li><li class="listitem"><p>Bugfix: Trac 8046.</p></li></ul></div><p>
|
||||
</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch07s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="pt01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> MSM v1 </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.23 to V2.24 (Boost 1.51)</td></tr></table></div></body></html>
|
||||
@@ -1,11 +1,8 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>From V2.22 to V2.23 (Boost 1.50)</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08.html" title="Chapter 8. Version history"><link rel="next" href="ch08s03.html" title="From V2.21 to V2.22 (Boost 1.48)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.22 to V2.23 (Boost 1.50)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.22 to V2.23 (Boost 1.50)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3372"></a>From V2.22 to V2.23 (Boost 1.50)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p> <span class="command"><strong><a class="command" href="ch03s04.html#eUML-composite-table">eUML</a></strong></span> : better syntax
|
||||
for front-ends defined with eUML as transititon table only. Caution:
|
||||
Breaking Change!</p></li><li class="listitem"><p>Bugfix: graph building was only working if
|
||||
<code class="code">initial_state</code> defined as a sequence</p></li><li class="listitem"><p>Bugfix: flags defined for a Terminate or Interrupt state do not
|
||||
break the blocking function of these states any more.</p></li><li class="listitem"><p>Bugfix: multiple deferred events from several regions were not
|
||||
working in every case.</p></li><li class="listitem"><p>Bugfix: visitor was passed by value to submachines.</p></li><li class="listitem"><p>Bugfix: <code class="code">no_transition</code> was not called for submachines who send an
|
||||
event to themselves.</p></li><li class="listitem"><p>Fixed warnings with gcc</p></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 8. Version history </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.21 to V2.22 (Boost 1.48)</td></tr></table></div></body></html>
|
||||
<title>From V2.23 to V2.24 (Boost 1.51)</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08.html" title="Chapter 8. Version history"><link rel="next" href="ch08s03.html" title="From V2.22 to V2.23 (Boost 1.50)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.23 to V2.24 (Boost 1.51)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.23 to V2.24 (Boost 1.51)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3368"></a>From V2.23 to V2.24 (Boost 1.51)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p> Support for <span class="command"><strong><a class="command" href="ch03s03.html#any-event">boost::any</a></strong></span>
|
||||
or <span class="command"><strong><a class="command" href="ch03s04.html#kleene-event">kleene</a></strong></span> as an
|
||||
acceptable event.</p></li><li class="listitem"><p>Bugfix: compiler error with fsm internal table and
|
||||
<code class="code">none</code>(compound) event.</p></li><li class="listitem"><p>Bugfix: <code class="code">euml::defer_</code> leading to stack overflow.</p></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 8. Version history </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.22 to V2.23 (Boost 1.50)</td></tr></table></div></body></html>
|
||||
@@ -1,21 +1,11 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>From V2.21 to V2.22 (Boost 1.48)</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s02.html" title="From V2.22 to V2.23 (Boost 1.50)"><link rel="next" href="ch08s04.html" title="From V2.20 to V2.21 (Boost 1.47)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.21 to V2.22 (Boost 1.48)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s02.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.21 to V2.22 (Boost 1.48)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3409"></a>From V2.21 to V2.22 (Boost 1.48)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>eUML: added easier event reprocessing:
|
||||
<code class="code">process(event_)</code> and <code class="code">reprocess()</code></p></li><li class="listitem"><p>Rewrite of internal transition tables. There were a few bugs
|
||||
(failing recursivity in internal transition tables of sub-sub
|
||||
machines) and a missing feature (unused internal transition table of
|
||||
the main state machine).</p></li><li class="listitem"><p>Bugfixes</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Reverted favor_compile_time policy to Boost 1.46
|
||||
state</p></li><li class="listitem"><p><code class="code">none</code> event now is convertible from any
|
||||
other event </p></li><li class="listitem"><p>eUML and pseudo exit states</p></li><li class="listitem"><p>Fixed not working Flag_AND</p></li><li class="listitem"><p>Fixed rare bugs causing multiple processing of the
|
||||
same event in a submachine whose transition table
|
||||
contains this event and a base event of it.</p></li><li class="listitem"><p>gcc warnings about unused variables</p></li></ul></div></li><li class="listitem"><p>Breaking change: the new internal transition table feature causes
|
||||
a minor breaking change. In a submachine, the "Fsm" template
|
||||
parameter for guards / actions of an internal table declared using
|
||||
<code class="code">internal_transition_table</code> now is the submachine,
|
||||
not the higher-level state machine. Internal transitions declared
|
||||
using internal rows in the higher-level state machine keep their
|
||||
behavior (the "Fsm" parameter is the higher-level state machine). To
|
||||
sum up, the internal transition "Fsm" parameter is the closest state
|
||||
machine containing this transition.</p></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.22 to V2.23 (Boost 1.50) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.20 to V2.21 (Boost 1.47)</td></tr></table></div></body></html>
|
||||
<title>From V2.22 to V2.23 (Boost 1.50)</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s02.html" title="From V2.23 to V2.24 (Boost 1.51)"><link rel="next" href="ch08s04.html" title="From V2.21 to V2.22 (Boost 1.48)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.22 to V2.23 (Boost 1.50)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s02.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s04.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.22 to V2.23 (Boost 1.50)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3396"></a>From V2.22 to V2.23 (Boost 1.50)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p> <span class="command"><strong><a class="command" href="ch03s04.html#eUML-composite-table">eUML</a></strong></span> : better syntax
|
||||
for front-ends defined with eUML as transititon table only. Caution:
|
||||
Breaking Change!</p></li><li class="listitem"><p>Bugfix: graph building was only working if
|
||||
<code class="code">initial_state</code> defined as a sequence</p></li><li class="listitem"><p>Bugfix: flags defined for a Terminate or Interrupt state do not
|
||||
break the blocking function of these states any more.</p></li><li class="listitem"><p>Bugfix: multiple deferred events from several regions were not
|
||||
working in every case.</p></li><li class="listitem"><p>Bugfix: visitor was passed by value to submachines.</p></li><li class="listitem"><p>Bugfix: <code class="code">no_transition</code> was not called for submachines who send an
|
||||
event to themselves.</p></li><li class="listitem"><p>Fixed warnings with gcc</p></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.23 to V2.24 (Boost 1.51) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.21 to V2.22 (Boost 1.48)</td></tr></table></div></body></html>
|
||||
@@ -1,10 +1,21 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>From V2.20 to V2.21 (Boost 1.47)</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s03.html" title="From V2.21 to V2.22 (Boost 1.48)"><link rel="next" href="ch08s05.html" title="From V2.12 to V2.20 (Boost 1.46)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.20 to V2.21 (Boost 1.47)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s03.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s05.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.20 to V2.21 (Boost 1.47)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3457"></a>From V2.20 to V2.21 (Boost 1.47)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Added a <span class="command"><strong><a class="command" href="ch03s05.html#backend-start">stop()</a></strong></span>
|
||||
method in the back-end.</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s04.html#eUML-phoenix">Added partial support for
|
||||
Boost.Phoenix functors in eUML</a></strong></span></p></li><li class="listitem"><p>Added the possibility to choose when <span class="command"><strong><a class="command" href="ch03s05.html#backend-state-switch">state switching</a></strong></span>
|
||||
occurs.</p></li><li class="listitem"><p>Bugfixes</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Trac 5117, 5253, 5533, 5573</p></li><li class="listitem"><p>gcc warnings about unused variables</p></li><li class="listitem"><p>better implemenation of favor_compile_time back-end
|
||||
policy</p></li><li class="listitem"><p>bug with eUML and state construction</p></li><li class="listitem"><p>incorrect eUML event and state macros</p></li><li class="listitem"><p>incorrect event type passed to a direct entry state's
|
||||
on_entry action</p></li><li class="listitem"><p>more examples</p></li></ul></div></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.21 to V2.22 (Boost 1.48) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.12 to V2.20 (Boost 1.46)</td></tr></table></div></body></html>
|
||||
<title>From V2.21 to V2.22 (Boost 1.48)</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s03.html" title="From V2.22 to V2.23 (Boost 1.50)"><link rel="next" href="ch08s05.html" title="From V2.20 to V2.21 (Boost 1.47)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.21 to V2.22 (Boost 1.48)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s03.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s05.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.21 to V2.22 (Boost 1.48)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3433"></a>From V2.21 to V2.22 (Boost 1.48)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>eUML: added easier event reprocessing:
|
||||
<code class="code">process(event_)</code> and <code class="code">reprocess()</code></p></li><li class="listitem"><p>Rewrite of internal transition tables. There were a few bugs
|
||||
(failing recursivity in internal transition tables of sub-sub
|
||||
machines) and a missing feature (unused internal transition table of
|
||||
the main state machine).</p></li><li class="listitem"><p>Bugfixes</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Reverted favor_compile_time policy to Boost 1.46
|
||||
state</p></li><li class="listitem"><p><code class="code">none</code> event now is convertible from any
|
||||
other event </p></li><li class="listitem"><p>eUML and pseudo exit states</p></li><li class="listitem"><p>Fixed not working Flag_AND</p></li><li class="listitem"><p>Fixed rare bugs causing multiple processing of the
|
||||
same event in a submachine whose transition table
|
||||
contains this event and a base event of it.</p></li><li class="listitem"><p>gcc warnings about unused variables</p></li></ul></div></li><li class="listitem"><p>Breaking change: the new internal transition table feature causes
|
||||
a minor breaking change. In a submachine, the "Fsm" template
|
||||
parameter for guards / actions of an internal table declared using
|
||||
<code class="code">internal_transition_table</code> now is the submachine,
|
||||
not the higher-level state machine. Internal transitions declared
|
||||
using internal rows in the higher-level state machine keep their
|
||||
behavior (the "Fsm" parameter is the higher-level state machine). To
|
||||
sum up, the internal transition "Fsm" parameter is the closest state
|
||||
machine containing this transition.</p></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.22 to V2.23 (Boost 1.50) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.20 to V2.21 (Boost 1.47)</td></tr></table></div></body></html>
|
||||
@@ -1,12 +1,10 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>From V2.12 to V2.20 (Boost 1.46)</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s04.html" title="From V2.20 to V2.21 (Boost 1.47)"><link rel="next" href="ch08s06.html" title="From V2.10 to V2.12 (Boost 1.45)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.12 to V2.20 (Boost 1.46)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s04.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s06.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.12 to V2.20 (Boost 1.46)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3505"></a>From V2.12 to V2.20 (Boost 1.46)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Compile-time state machine analysis using mpl_graph:</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s05.html#backend-compile-time-analysis">checking of region orthogonality</a></strong></span>.</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s05.html#backend-compile-time-analysis">search for unreachable states</a></strong></span>.</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s02.html#explicit-entry-no-region-id">automatic region index search for pseudo entry or explicit
|
||||
entry states</a></strong></span>.</p></li></ul></div></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s05.html#backend-boost-parameter">Boost.Parameter interface definition</a></strong></span> for
|
||||
msm::back::state_machine<> template arguments.</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s05.html#backend-queues">Possibility to provide a
|
||||
container</a></strong></span> for the event and deferred event queues. A
|
||||
policy implementation based on a more efficient Boost.CircularBuffer
|
||||
is provided.</p></li><li class="listitem"><p>msm::back::state_machine<>::is_flag_active method made
|
||||
const.</p></li><li class="listitem"><p>added possibility to <span class="command"><strong><a class="command" href="ch03s05.html#backend-enqueueing">enqueue events</a></strong></span> for delayed processing.</p></li><li class="listitem"><p>Bugfixes</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Trac 4926</p></li><li class="listitem"><p>stack overflow using the Defer functor</p></li><li class="listitem"><p>anonymous transition of a submachine not called for
|
||||
the initial state</p></li></ul></div></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s04.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s06.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.20 to V2.21 (Boost 1.47) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.10 to V2.12 (Boost 1.45)</td></tr></table></div></body></html>
|
||||
<title>From V2.20 to V2.21 (Boost 1.47)</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s04.html" title="From V2.21 to V2.22 (Boost 1.48)"><link rel="next" href="ch08s06.html" title="From V2.12 to V2.20 (Boost 1.46)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.20 to V2.21 (Boost 1.47)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s04.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s06.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.20 to V2.21 (Boost 1.47)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3481"></a>From V2.20 to V2.21 (Boost 1.47)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Added a <span class="command"><strong><a class="command" href="ch03s05.html#backend-start">stop()</a></strong></span>
|
||||
method in the back-end.</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s04.html#eUML-phoenix">Added partial support for
|
||||
Boost.Phoenix functors in eUML</a></strong></span></p></li><li class="listitem"><p>Added the possibility to choose when <span class="command"><strong><a class="command" href="ch03s05.html#backend-state-switch">state switching</a></strong></span>
|
||||
occurs.</p></li><li class="listitem"><p>Bugfixes</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Trac 5117, 5253, 5533, 5573</p></li><li class="listitem"><p>gcc warnings about unused variables</p></li><li class="listitem"><p>better implemenation of favor_compile_time back-end
|
||||
policy</p></li><li class="listitem"><p>bug with eUML and state construction</p></li><li class="listitem"><p>incorrect eUML event and state macros</p></li><li class="listitem"><p>incorrect event type passed to a direct entry state's
|
||||
on_entry action</p></li><li class="listitem"><p>more examples</p></li></ul></div></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s04.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s06.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.21 to V2.22 (Boost 1.48) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.12 to V2.20 (Boost 1.46)</td></tr></table></div></body></html>
|
||||
@@ -1,9 +1,12 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>From V2.10 to V2.12 (Boost 1.45)</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s05.html" title="From V2.12 to V2.20 (Boost 1.46)"><link rel="next" href="ch08s07.html" title="From V2.0 to V2.12 (Boost 1.44)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.10 to V2.12 (Boost 1.45)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s05.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s07.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.10 to V2.12 (Boost 1.45)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3563"></a>From V2.10 to V2.12 (Boost 1.45)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Support for <span class="command"><strong><a class="command" href="ch03s05.html#back-end-serialization">serialization</a></strong></span></p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s04.html#eUML-reuse-functor">Possibility to use
|
||||
normal functors</a></strong></span> (from functor front-end) in
|
||||
eUML.</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s05.html#backend-fsm-constructor-args">New constructors</a></strong></span> where substates / submachines can be taken as
|
||||
arguments. This allows passing arguments to the constructor of a
|
||||
submachine.</p></li><li class="listitem"><p>Bugfixes</p></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s05.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s07.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.12 to V2.20 (Boost 1.46) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.0 to V2.12 (Boost 1.44)</td></tr></table></div></body></html>
|
||||
<title>From V2.12 to V2.20 (Boost 1.46)</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s05.html" title="From V2.20 to V2.21 (Boost 1.47)"><link rel="next" href="ch08s07.html" title="From V2.10 to V2.12 (Boost 1.45)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.12 to V2.20 (Boost 1.46)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s05.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s07.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.12 to V2.20 (Boost 1.46)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3529"></a>From V2.12 to V2.20 (Boost 1.46)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Compile-time state machine analysis using mpl_graph:</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s05.html#backend-compile-time-analysis">checking of region orthogonality</a></strong></span>.</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s05.html#backend-compile-time-analysis">search for unreachable states</a></strong></span>.</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s02.html#explicit-entry-no-region-id">automatic region index search for pseudo entry or explicit
|
||||
entry states</a></strong></span>.</p></li></ul></div></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s05.html#backend-boost-parameter">Boost.Parameter interface definition</a></strong></span> for
|
||||
msm::back::state_machine<> template arguments.</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s05.html#backend-queues">Possibility to provide a
|
||||
container</a></strong></span> for the event and deferred event queues. A
|
||||
policy implementation based on a more efficient Boost.CircularBuffer
|
||||
is provided.</p></li><li class="listitem"><p>msm::back::state_machine<>::is_flag_active method made
|
||||
const.</p></li><li class="listitem"><p>added possibility to <span class="command"><strong><a class="command" href="ch03s05.html#backend-enqueueing">enqueue events</a></strong></span> for delayed processing.</p></li><li class="listitem"><p>Bugfixes</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Trac 4926</p></li><li class="listitem"><p>stack overflow using the Defer functor</p></li><li class="listitem"><p>anonymous transition of a submachine not called for
|
||||
the initial state</p></li></ul></div></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s05.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s07.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.20 to V2.21 (Boost 1.47) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.10 to V2.12 (Boost 1.45)</td></tr></table></div></body></html>
|
||||
@@ -1,9 +1,9 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>From V2.0 to V2.12 (Boost 1.44)</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s06.html" title="From V2.10 to V2.12 (Boost 1.45)"><link rel="next" href="pt02.html" title="Part II. Reference"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.0 to V2.12 (Boost 1.44)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s06.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="pt02.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.0 to V2.12 (Boost 1.44)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3588"></a>From V2.0 to V2.12 (Boost 1.44)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>New documentation</p></li><li class="listitem"><p>Internal transitions. Either as part of the transition table or
|
||||
using a state's internal transition table</p></li><li class="listitem"><p>increased dispatch and copy speed</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s02.html#basic-row2">new row types</a></strong></span> for the
|
||||
basic front-end</p></li><li class="listitem"><p>new eUML syntax, better attribute support, macros to ease
|
||||
developer's life. Even VC8 seems to like it better.</p></li><li class="listitem"><p>New policy for reduced compile-time at the cost of dispatch
|
||||
speed</p></li><li class="listitem"><p>Support for base events</p></li><li class="listitem"><p>possibility to choose the initial event</p></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s06.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="pt02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.10 to V2.12 (Boost 1.45) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Part II. Reference</td></tr></table></div></body></html>
|
||||
<title>From V2.10 to V2.12 (Boost 1.45)</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s06.html" title="From V2.12 to V2.20 (Boost 1.46)"><link rel="next" href="ch08s08.html" title="From V2.0 to V2.12 (Boost 1.44)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.10 to V2.12 (Boost 1.45)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s06.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="ch08s08.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.10 to V2.12 (Boost 1.45)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3587"></a>From V2.10 to V2.12 (Boost 1.45)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Support for <span class="command"><strong><a class="command" href="ch03s05.html#back-end-serialization">serialization</a></strong></span></p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s04.html#eUML-reuse-functor">Possibility to use
|
||||
normal functors</a></strong></span> (from functor front-end) in
|
||||
eUML.</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s05.html#backend-fsm-constructor-args">New constructors</a></strong></span> where substates / submachines can be taken as
|
||||
arguments. This allows passing arguments to the constructor of a
|
||||
submachine.</p></li><li class="listitem"><p>Bugfixes</p></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s06.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch08s08.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.12 to V2.20 (Boost 1.46) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> From V2.0 to V2.12 (Boost 1.44)</td></tr></table></div></body></html>
|
||||
9
doc/HTML/ch08s08.html
Normal file
9
doc/HTML/ch08s08.html
Normal file
@@ -0,0 +1,9 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>From V2.0 to V2.12 (Boost 1.44)</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="ch08.html" title="Chapter 8. Version history"><link rel="prev" href="ch08s07.html" title="From V2.10 to V2.12 (Boost 1.45)"><link rel="next" href="pt02.html" title="Part II. Reference"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">From V2.0 to V2.12 (Boost 1.44)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s07.html">Prev</a> </td><th width="60%" align="center">Chapter 8. Version history</th><td width="20%" align="right"> <a accesskey="n" href="pt02.html">Next</a></td></tr></table><hr></div><div class="sect1" title="From V2.0 to V2.12 (Boost 1.44)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e3612"></a>From V2.0 to V2.12 (Boost 1.44)</h2></div></div></div><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>New documentation</p></li><li class="listitem"><p>Internal transitions. Either as part of the transition table or
|
||||
using a state's internal transition table</p></li><li class="listitem"><p>increased dispatch and copy speed</p></li><li class="listitem"><p><span class="command"><strong><a class="command" href="ch03s02.html#basic-row2">new row types</a></strong></span> for the
|
||||
basic front-end</p></li><li class="listitem"><p>new eUML syntax, better attribute support, macros to ease
|
||||
developer's life. Even VC8 seems to like it better.</p></li><li class="listitem"><p>New policy for reduced compile-time at the cost of dispatch
|
||||
speed</p></li><li class="listitem"><p>Support for base events</p></li><li class="listitem"><p>possibility to choose the initial event</p></li></ul></div><p>
|
||||
</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s07.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch08.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="pt02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.10 to V2.12 (Boost 1.45) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Part II. Reference</td></tr></table></div></body></html>
|
||||
@@ -1,4 +1,4 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 9. External references to MSM</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="pt02.html" title="Part II. Reference"><link rel="next" href="ch10.html" title="Chapter 10. eUML operators and basic helpers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 9. External references to MSM</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="pt02.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> <a accesskey="n" href="ch10.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 9. External references to MSM"><div class="titlepage"><div><div><h2 class="title"><a name="d0e3625"></a>Chapter 9. External references to MSM</h2></div></div></div><p>An interesting mapping UML <-> MSM from Takatoshi Kondo can be found at
|
||||
<title>Chapter 9. External references to MSM</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="pt02.html" title="Part II. Reference"><link rel="next" href="ch10.html" title="Chapter 10. eUML operators and basic helpers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 9. External references to MSM</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="pt02.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> <a accesskey="n" href="ch10.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 9. External references to MSM"><div class="titlepage"><div><div><h2 class="title"><a name="d0e3649"></a>Chapter 9. External references to MSM</h2></div></div></div><p>An interesting mapping UML <-> MSM from Takatoshi Kondo can be found at
|
||||
<span class="command"><strong><a class="command" href="http://redboltz.wikidot.com/boost-msm-guide" target="_top">Redboltz</a></strong></span>.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="pt02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="pt02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch10.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Part II. Reference </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 10. eUML operators and basic helpers</td></tr></table></div></body></html>
|
||||
@@ -1,7 +1,7 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 10. eUML operators and basic helpers</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="ch09.html" title="Chapter 9. External references to MSM"><link rel="next" href="ch11.html" title="Chapter 11. Functional programming"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 10. eUML operators and basic helpers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch09.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> <a accesskey="n" href="ch11.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 10. eUML operators and basic helpers"><div class="titlepage"><div><div><h2 class="title"><a name="d0e3633"></a>Chapter 10. eUML operators and basic helpers</h2></div></div></div><p>The following table lists the supported operators: </p><p>
|
||||
</p><div class="table"><a name="d0e3640"></a><p class="title"><b>Table 10.1. Operators and state machine helpers</b></p><div class="table-contents"><table summary="Operators and state machine helpers" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>eUML function / operator</th><th>Description</th><th>Functor</th></tr></thead><tbody><tr><td>&&</td><td>Calls lazily Action1&& Action2</td><td>And_</td></tr><tr><td>||</td><td>Calls lazily Action1|| Action2</td><td>Or_</td></tr><tr><td>!</td><td>Calls lazily !Action1</td><td>Not_</td></tr><tr><td>!=</td><td>Calls lazily Action1 != Action2</td><td>NotEqualTo_</td></tr><tr><td>==</td><td>Calls lazily Action1 == Action2</td><td>EqualTo_</td></tr><tr><td>></td><td>Calls lazily Action1 > Action2</td><td>Greater_</td></tr><tr><td>>=</td><td>Calls lazily Action1 >= Action2</td><td>Greater_Equal_</td></tr><tr><td><</td><td>Calls lazily Action1 < Action2</td><td>Less_</td></tr><tr><td><=</td><td>Calls lazily Action1 <= Action2</td><td>Less_Equal_</td></tr><tr><td>&</td><td>Calls lazily Action1 & Action2</td><td>Bitwise_And_</td></tr><tr><td>|</td><td>Calls lazily Action1 | Action2</td><td>Bitwise_Or_</td></tr><tr><td>^</td><td>Calls lazily Action1 ^ Action2</td><td>Bitwise_Xor_</td></tr><tr><td>--</td><td>Calls lazily --Action1 / Action1--</td><td>Pre_Dec_ / Post_Dec_</td></tr><tr><td>++</td><td>Calls lazily ++Action1 / Action1++</td><td>Pre_Inc_ / Post_Inc_</td></tr><tr><td>/</td><td>Calls lazily Action1 / Action2</td><td>Divides_</td></tr><tr><td>/=</td><td>Calls lazily Action1 /= Action2</td><td>Divides_Assign_</td></tr><tr><td>*</td><td>Calls lazily Action1 * Action2</td><td>Multiplies_</td></tr><tr><td>*=</td><td>Calls lazily Action1 *= Action2</td><td>Multiplies_Assign_</td></tr><tr><td>+ (binary)</td><td>Calls lazily Action1 + Action2</td><td>Plus_</td></tr><tr><td>+ (unary)</td><td>Calls lazily +Action1</td><td>Unary_Plus_</td></tr><tr><td>+=</td><td>Calls lazily Action1 += Action2</td><td>Plus_Assign_</td></tr><tr><td>- (binary)</td><td>Calls lazily Action1 - Action2</td><td>Minus_</td></tr><tr><td>- (unary)</td><td>Calls lazily -Action1</td><td>Unary_Minus_</td></tr><tr><td>-=</td><td>Calls lazily Action1 -= Action2</td><td>Minus_Assign_</td></tr><tr><td>%</td><td>Calls lazily Action1 % Action2</td><td>Modulus_</td></tr><tr><td>%=</td><td>Calls lazily Action1 %= Action2</td><td>Modulus_Assign_</td></tr><tr><td>>></td><td>Calls lazily Action1 >> Action2</td><td>ShiftRight_</td></tr><tr><td>>>=</td><td>Calls lazily Action1 >>= Action2</td><td>ShiftRight_Assign_</td></tr><tr><td><<</td><td>Calls lazily Action1 << Action2</td><td>ShiftLeft_</td></tr><tr><td><<=</td><td>Calls lazily Action1 <<= Action2</td><td>ShiftLeft_Assign_</td></tr><tr><td>[] (works on vector, map, arrays)</td><td>Calls lazily Action1 [Action2]</td><td>Subscript_</td></tr><tr><td>if_then_else_(Condition,Action1,Action2)</td><td>Returns either the result of calling Action1 or the result of
|
||||
<title>Chapter 10. eUML operators and basic helpers</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="ch09.html" title="Chapter 9. External references to MSM"><link rel="next" href="ch11.html" title="Chapter 11. Functional programming"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 10. eUML operators and basic helpers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch09.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> <a accesskey="n" href="ch11.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 10. eUML operators and basic helpers"><div class="titlepage"><div><div><h2 class="title"><a name="d0e3657"></a>Chapter 10. eUML operators and basic helpers</h2></div></div></div><p>The following table lists the supported operators: </p><p>
|
||||
</p><div class="table"><a name="d0e3664"></a><p class="title"><b>Table 10.1. Operators and state machine helpers</b></p><div class="table-contents"><table summary="Operators and state machine helpers" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>eUML function / operator</th><th>Description</th><th>Functor</th></tr></thead><tbody><tr><td>&&</td><td>Calls lazily Action1&& Action2</td><td>And_</td></tr><tr><td>||</td><td>Calls lazily Action1|| Action2</td><td>Or_</td></tr><tr><td>!</td><td>Calls lazily !Action1</td><td>Not_</td></tr><tr><td>!=</td><td>Calls lazily Action1 != Action2</td><td>NotEqualTo_</td></tr><tr><td>==</td><td>Calls lazily Action1 == Action2</td><td>EqualTo_</td></tr><tr><td>></td><td>Calls lazily Action1 > Action2</td><td>Greater_</td></tr><tr><td>>=</td><td>Calls lazily Action1 >= Action2</td><td>Greater_Equal_</td></tr><tr><td><</td><td>Calls lazily Action1 < Action2</td><td>Less_</td></tr><tr><td><=</td><td>Calls lazily Action1 <= Action2</td><td>Less_Equal_</td></tr><tr><td>&</td><td>Calls lazily Action1 & Action2</td><td>Bitwise_And_</td></tr><tr><td>|</td><td>Calls lazily Action1 | Action2</td><td>Bitwise_Or_</td></tr><tr><td>^</td><td>Calls lazily Action1 ^ Action2</td><td>Bitwise_Xor_</td></tr><tr><td>--</td><td>Calls lazily --Action1 / Action1--</td><td>Pre_Dec_ / Post_Dec_</td></tr><tr><td>++</td><td>Calls lazily ++Action1 / Action1++</td><td>Pre_Inc_ / Post_Inc_</td></tr><tr><td>/</td><td>Calls lazily Action1 / Action2</td><td>Divides_</td></tr><tr><td>/=</td><td>Calls lazily Action1 /= Action2</td><td>Divides_Assign_</td></tr><tr><td>*</td><td>Calls lazily Action1 * Action2</td><td>Multiplies_</td></tr><tr><td>*=</td><td>Calls lazily Action1 *= Action2</td><td>Multiplies_Assign_</td></tr><tr><td>+ (binary)</td><td>Calls lazily Action1 + Action2</td><td>Plus_</td></tr><tr><td>+ (unary)</td><td>Calls lazily +Action1</td><td>Unary_Plus_</td></tr><tr><td>+=</td><td>Calls lazily Action1 += Action2</td><td>Plus_Assign_</td></tr><tr><td>- (binary)</td><td>Calls lazily Action1 - Action2</td><td>Minus_</td></tr><tr><td>- (unary)</td><td>Calls lazily -Action1</td><td>Unary_Minus_</td></tr><tr><td>-=</td><td>Calls lazily Action1 -= Action2</td><td>Minus_Assign_</td></tr><tr><td>%</td><td>Calls lazily Action1 % Action2</td><td>Modulus_</td></tr><tr><td>%=</td><td>Calls lazily Action1 %= Action2</td><td>Modulus_Assign_</td></tr><tr><td>>></td><td>Calls lazily Action1 >> Action2</td><td>ShiftRight_</td></tr><tr><td>>>=</td><td>Calls lazily Action1 >>= Action2</td><td>ShiftRight_Assign_</td></tr><tr><td><<</td><td>Calls lazily Action1 << Action2</td><td>ShiftLeft_</td></tr><tr><td><<=</td><td>Calls lazily Action1 <<= Action2</td><td>ShiftLeft_Assign_</td></tr><tr><td>[] (works on vector, map, arrays)</td><td>Calls lazily Action1 [Action2]</td><td>Subscript_</td></tr><tr><td>if_then_else_(Condition,Action1,Action2)</td><td>Returns either the result of calling Action1 or the result of
|
||||
calling Action2</td><td>If_Else_</td></tr><tr><td>if_then_(Condition,Action)</td><td>Returns the result of calling Action if Condition</td><td>If_Then_</td></tr><tr><td>while_(Condition, Body)</td><td>While Condition(), calls Body(). Returns nothing</td><td>While_Do_</td></tr><tr><td>do_while_(Condition, Body)</td><td>Calls Body() while Condition(). Returns nothing</td><td>Do_While_</td></tr><tr><td>for_(Begin,Stop,EndLoop,Body)</td><td>Calls for(Begin;Stop;EndLoop){Body;}</td><td>For_Loop_</td></tr><tr><td>process_(Event [,fsm1] [,fsm2] [,fsm3] [,fsm4])</td><td>Processes Event on the current state machine (if no fsm
|
||||
specified) or on up to 4 state machines returned by an
|
||||
appropriate functor.</td><td>Process_</td></tr><tr><td>process2_(Event, Data [,fsm1] [,fsm2] [,fsm3])</td><td>Processes Event on the current state machine (if no fsm
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 11. Functional programming</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="ch10.html" title="Chapter 10. eUML operators and basic helpers"><link rel="next" href="re01.html" title="Common headers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 11.
|
||||
Functional programming </th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch10.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> <a accesskey="n" href="re01.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 11. Functional programming"><div class="titlepage"><div><div><h2 class="title"><a name="d0e3977"></a>Chapter 11.
|
||||
<title>Chapter 11. Functional programming</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="ch10.html" title="Chapter 10. eUML operators and basic helpers"><link rel="next" href="re01.html" title="Common headers"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 11.
|
||||
Functional programming </th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch10.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> <a accesskey="n" href="re01.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 11. Functional programming"><div class="titlepage"><div><div><h2 class="title"><a name="d0e4001"></a>Chapter 11.
|
||||
<span class="command"><strong><a name="eUML-STL-all"></a></strong></span>Functional programming </h2></div></div></div><p>To use these functions, you need to include: </p><p><code class="code">#include <msm/front/euml/stl.hpp></code></p><p>or the specified header in the following tables.</p><p>The following tables list the supported STL algorithms: </p><p>
|
||||
<span class="command"><strong><a name="eUML-STL-querying"></a></strong></span>
|
||||
</p><div class="table"><a name="d0e3995"></a><p class="title"><b>Table 11.1. STL algorithms</b></p><div class="table-contents"><table summary="STL algorithms" border="1"><colgroup><col><col></colgroup><thead><tr><th>STL algorithms in querying.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>find_(first, last, value)</td><td>Find_</td></tr><tr><td>find_if_(first, last, value)</td><td>FindIf_</td></tr><tr><td>lower_bound_(first, last, value [,opᵃ])</td><td>LowerBound_</td></tr><tr><td>upper_bound_(first, last, value [,opᵃ])</td><td>UpperBound_</td></tr><tr><td>equal_range_(first, last, value [,opᵃ])</td><td>EqualRange_</td></tr><tr><td>binary_search_(first, last, value [,opᵃ])</td><td>BinarySearch_</td></tr><tr><td>min_element_(first, last[,opᵃ])</td><td>MinElement_</td></tr><tr><td>max_element_(first, last[,opᵃ])</td><td>MaxElement_</td></tr><tr><td>adjacent_find_(first, last[,opᵃ])</td><td>AdjacentFind_</td></tr><tr><td>find_end_( first1, last1, first2, last2 [,op ᵃ])</td><td>FindEnd_</td></tr><tr><td>find_first_of_( first1, last1, first2, last2 [,op ᵃ])</td><td>FindFirstOf_</td></tr><tr><td>equal_( first1, last1, first2 [,op ᵃ])</td><td>Equal_</td></tr><tr><td>search_( first1, last1, first2, last2 [,op ᵃ])</td><td>Search_</td></tr><tr><td>includes_( first1, last1, first2, last2 [,op ᵃ])</td><td>Includes_</td></tr><tr><td>lexicographical_compare_ ( first1, last1, first2, last2 [,op
|
||||
</p><div class="table"><a name="d0e4019"></a><p class="title"><b>Table 11.1. STL algorithms</b></p><div class="table-contents"><table summary="STL algorithms" border="1"><colgroup><col><col></colgroup><thead><tr><th>STL algorithms in querying.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>find_(first, last, value)</td><td>Find_</td></tr><tr><td>find_if_(first, last, value)</td><td>FindIf_</td></tr><tr><td>lower_bound_(first, last, value [,opᵃ])</td><td>LowerBound_</td></tr><tr><td>upper_bound_(first, last, value [,opᵃ])</td><td>UpperBound_</td></tr><tr><td>equal_range_(first, last, value [,opᵃ])</td><td>EqualRange_</td></tr><tr><td>binary_search_(first, last, value [,opᵃ])</td><td>BinarySearch_</td></tr><tr><td>min_element_(first, last[,opᵃ])</td><td>MinElement_</td></tr><tr><td>max_element_(first, last[,opᵃ])</td><td>MaxElement_</td></tr><tr><td>adjacent_find_(first, last[,opᵃ])</td><td>AdjacentFind_</td></tr><tr><td>find_end_( first1, last1, first2, last2 [,op ᵃ])</td><td>FindEnd_</td></tr><tr><td>find_first_of_( first1, last1, first2, last2 [,op ᵃ])</td><td>FindFirstOf_</td></tr><tr><td>equal_( first1, last1, first2 [,op ᵃ])</td><td>Equal_</td></tr><tr><td>search_( first1, last1, first2, last2 [,op ᵃ])</td><td>Search_</td></tr><tr><td>includes_( first1, last1, first2, last2 [,op ᵃ])</td><td>Includes_</td></tr><tr><td>lexicographical_compare_ ( first1, last1, first2, last2 [,op
|
||||
ᵃ]) </td><td>LexicographicalCompare_</td></tr><tr><td>count_(first, last, value [,size])</td><td>Count_</td></tr><tr><td>count_if_(first, last, op ᵃ [,size])</td><td>CountIf_</td></tr><tr><td>distance_(first, last)</td><td>Distance_</td></tr><tr><td>mismatch _( first1, last1, first2 [,op ᵃ])</td><td>Mismatch_</td></tr></tbody></table></div></div><p><br class="table-break">
|
||||
</p><p>
|
||||
<span class="command"><strong><a name="eUML-STL-iteration"></a></strong></span>
|
||||
</p><div class="table"><a name="d0e4108"></a><p class="title"><b>Table 11.2. STL algorithms</b></p><div class="table-contents"><table summary="STL algorithms" border="1"><colgroup><col><col></colgroup><thead><tr><th>STL algorithms in iteration.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>for_each_(first,last, unary opᵃ)</td><td>ForEach_</td></tr><tr><td>accumulate_first, last, init [,opᵃ])</td><td>Accumulate_</td></tr></tbody></table></div></div><p><br class="table-break">
|
||||
</p><div class="table"><a name="d0e4132"></a><p class="title"><b>Table 11.2. STL algorithms</b></p><div class="table-contents"><table summary="STL algorithms" border="1"><colgroup><col><col></colgroup><thead><tr><th>STL algorithms in iteration.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>for_each_(first,last, unary opᵃ)</td><td>ForEach_</td></tr><tr><td>accumulate_first, last, init [,opᵃ])</td><td>Accumulate_</td></tr></tbody></table></div></div><p><br class="table-break">
|
||||
</p><p>
|
||||
<span class="command"><strong><a name="eUML-STL-transformation"></a></strong></span>
|
||||
</p><div class="table"><a name="d0e4136"></a><p class="title"><b>Table 11.3. STL algorithms</b></p><div class="table-contents"><table summary="STL algorithms" border="1"><colgroup><col><col></colgroup><thead><tr><th>STL algorithms in transformation.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>copy_(first, last, result)</td><td>Copy_</td></tr><tr><td>copy_backward_(first, last, result)</td><td>CopyBackward_</td></tr><tr><td>reverse_(first, last)</td><td>Reverse_</td></tr><tr><td>reverse_copy_(first, last , result)</td><td>ReverseCopy_</td></tr><tr><td>remove_(first, last, value)</td><td>Remove_</td></tr><tr><td>remove_if_(first, last , opᵃ)</td><td>RemoveIf_</td></tr><tr><td>remove_copy_(first, last , output, value)</td><td>RemoveCopy_</td></tr><tr><td>remove_copy_if_(first, last, output, opᵃ)</td><td>RemoveCopyIf_</td></tr><tr><td>fill_(first, last, value)</td><td>Fill_</td></tr><tr><td>fill_n_(first, size, value)ᵇ</td><td>FillN_</td></tr><tr><td>generate_(first, last, generatorᵃ)</td><td>Generate_</td></tr><tr><td>generate_(first, size, generatorᵃ)ᵇ</td><td>GenerateN_</td></tr><tr><td>unique_(first, last [,opᵃ])</td><td>Unique_</td></tr><tr><td>unique_copy_(first, last, output [,opᵃ])</td><td>UniqueCopy_</td></tr><tr><td>random_shuffle_(first, last [,opᵃ])</td><td>RandomShuffle_</td></tr><tr><td>rotate_copy_(first, middle, last, output)</td><td>RotateCopy_</td></tr><tr><td>partition_ (first, last [,opᵃ])</td><td>Partition_</td></tr><tr><td>stable_partition_ (first, last [,opᵃ])</td><td>StablePartition_</td></tr><tr><td>stable_sort_(first, last [,opᵃ])</td><td>StableSort_</td></tr><tr><td>sort_(first, last [,opᵃ])</td><td>Sort_</td></tr><tr><td>partial_sort_(first, middle, last [,opᵃ])</td><td>PartialSort_</td></tr><tr><td>partial_sort_copy_ (first, last, res_first, res_last [,opᵃ]) </td><td>PartialSortCopy_</td></tr><tr><td>nth_element_(first, nth, last [,opᵃ])</td><td>NthElement_</td></tr><tr><td>merge_( first1, last1, first2, last2, output [,op ᵃ])</td><td>Merge_</td></tr><tr><td>inplace_merge_(first, middle, last [,opᵃ])</td><td>InplaceMerge_</td></tr><tr><td>set_union_(first1, last1, first2, last2, output [,op
|
||||
</p><div class="table"><a name="d0e4160"></a><p class="title"><b>Table 11.3. STL algorithms</b></p><div class="table-contents"><table summary="STL algorithms" border="1"><colgroup><col><col></colgroup><thead><tr><th>STL algorithms in transformation.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>copy_(first, last, result)</td><td>Copy_</td></tr><tr><td>copy_backward_(first, last, result)</td><td>CopyBackward_</td></tr><tr><td>reverse_(first, last)</td><td>Reverse_</td></tr><tr><td>reverse_copy_(first, last , result)</td><td>ReverseCopy_</td></tr><tr><td>remove_(first, last, value)</td><td>Remove_</td></tr><tr><td>remove_if_(first, last , opᵃ)</td><td>RemoveIf_</td></tr><tr><td>remove_copy_(first, last , output, value)</td><td>RemoveCopy_</td></tr><tr><td>remove_copy_if_(first, last, output, opᵃ)</td><td>RemoveCopyIf_</td></tr><tr><td>fill_(first, last, value)</td><td>Fill_</td></tr><tr><td>fill_n_(first, size, value)ᵇ</td><td>FillN_</td></tr><tr><td>generate_(first, last, generatorᵃ)</td><td>Generate_</td></tr><tr><td>generate_(first, size, generatorᵃ)ᵇ</td><td>GenerateN_</td></tr><tr><td>unique_(first, last [,opᵃ])</td><td>Unique_</td></tr><tr><td>unique_copy_(first, last, output [,opᵃ])</td><td>UniqueCopy_</td></tr><tr><td>random_shuffle_(first, last [,opᵃ])</td><td>RandomShuffle_</td></tr><tr><td>rotate_copy_(first, middle, last, output)</td><td>RotateCopy_</td></tr><tr><td>partition_ (first, last [,opᵃ])</td><td>Partition_</td></tr><tr><td>stable_partition_ (first, last [,opᵃ])</td><td>StablePartition_</td></tr><tr><td>stable_sort_(first, last [,opᵃ])</td><td>StableSort_</td></tr><tr><td>sort_(first, last [,opᵃ])</td><td>Sort_</td></tr><tr><td>partial_sort_(first, middle, last [,opᵃ])</td><td>PartialSort_</td></tr><tr><td>partial_sort_copy_ (first, last, res_first, res_last [,opᵃ]) </td><td>PartialSortCopy_</td></tr><tr><td>nth_element_(first, nth, last [,opᵃ])</td><td>NthElement_</td></tr><tr><td>merge_( first1, last1, first2, last2, output [,op ᵃ])</td><td>Merge_</td></tr><tr><td>inplace_merge_(first, middle, last [,opᵃ])</td><td>InplaceMerge_</td></tr><tr><td>set_union_(first1, last1, first2, last2, output [,op
|
||||
ᵃ])</td><td>SetUnion_</td></tr><tr><td>push_heap_(first, last [,op ᵃ])</td><td>PushHeap_</td></tr><tr><td>pop_heap_(first, last [,op ᵃ])</td><td>PopHeap_</td></tr><tr><td>make_heap_(first, last [,op ᵃ])</td><td>MakeHeap_</td></tr><tr><td>sort_heap_(first, last [,op ᵃ])</td><td>SortHeap_</td></tr><tr><td>next_permutation_(first, last [,op ᵃ])</td><td>NextPermutation_</td></tr><tr><td>prev_permutation_(first, last [,op ᵃ])</td><td>PrevPermutation_</td></tr><tr><td>inner_product_(first1, last1, first2, init [,op1ᵃ] [,op2ᵃ]) </td><td>InnerProduct_</td></tr><tr><td>partial_sum_(first, last, output [,opᵃ])</td><td>PartialSum_</td></tr><tr><td>adjacent_difference_(first, last, output [,opᵃ])</td><td>AdjacentDifference_</td></tr><tr><td>replace_(first, last, old_value, new_value)</td><td>Replace_</td></tr><tr><td>replace_if_(first, last, opᵃ, new_value)</td><td>ReplaceIf_</td></tr><tr><td>replace_copy_(first, last, result, old_value,
|
||||
new_value)</td><td>ReplaceCopy_</td></tr><tr><td>replace_copy_if_(first, last, result, opᵃ, new_value)</td><td>ReplaceCopyIf_</td></tr><tr><td>rotate_(first, middle, last)ᵇ</td><td>Rotate_</td></tr></tbody></table></div></div><p><br class="table-break">
|
||||
</p><p>
|
||||
<span class="command"><strong><a name="eUML-STL-container"></a></strong></span>
|
||||
</p><div class="table"><a name="d0e4354"></a><p class="title"><b>Table 11.4. STL container methods</b></p><div class="table-contents"><table summary="STL container methods" border="1"><colgroup><col><col></colgroup><thead><tr><th>STL container methods(common) in container.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>container::reference front_(container)</td><td>Front_</td></tr><tr><td>container::reference back_(container)</td><td>Back_</td></tr><tr><td>container::iterator begin_(container)</td><td>Begin_</td></tr><tr><td>container::iterator end_(container)</td><td>End_</td></tr><tr><td>container::reverse_iterator rbegin_(container)</td><td>RBegin_</td></tr><tr><td>container::reverse_iterator rend_(container)</td><td>REnd_</td></tr><tr><td>void push_back_(container, value)</td><td>Push_Back_</td></tr><tr><td>void pop_back_(container, value)</td><td>Pop_Back_</td></tr><tr><td>void push_front_(container, value)</td><td>Push_Front_</td></tr><tr><td>void pop_front_(container, value)</td><td>Pop_Front_</td></tr><tr><td>void clear_(container)</td><td>Clear_</td></tr><tr><td>size_type capacity_(container)</td><td>Capacity_</td></tr><tr><td>size_type size_(container)</td><td>Size_</td></tr><tr><td>size_type max_size_(container)</td><td>Max_Size_</td></tr><tr><td>void reserve_(container, value)</td><td>Reserve _</td></tr><tr><td>void resize_(container, value)</td><td>Resize _</td></tr><tr><td>iterator insert_(container, pos, value)</td><td>Insert_</td></tr><tr><td>void insert_( container , pos, first, last)</td><td>Insert_</td></tr><tr><td>void insert_( container , pos, number, value)</td><td>Insert_</td></tr><tr><td>void swap_( container , other_container)</td><td>Swap_</td></tr><tr><td>void erase_( container , pos)</td><td>Erase_</td></tr><tr><td>void erase_( container , first, last) </td><td>Erase_</td></tr><tr><td>bool empty_( container)</td><td>Empty_</td></tr></tbody></table></div></div><p><br class="table-break">
|
||||
</p><div class="table"><a name="d0e4378"></a><p class="title"><b>Table 11.4. STL container methods</b></p><div class="table-contents"><table summary="STL container methods" border="1"><colgroup><col><col></colgroup><thead><tr><th>STL container methods(common) in container.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>container::reference front_(container)</td><td>Front_</td></tr><tr><td>container::reference back_(container)</td><td>Back_</td></tr><tr><td>container::iterator begin_(container)</td><td>Begin_</td></tr><tr><td>container::iterator end_(container)</td><td>End_</td></tr><tr><td>container::reverse_iterator rbegin_(container)</td><td>RBegin_</td></tr><tr><td>container::reverse_iterator rend_(container)</td><td>REnd_</td></tr><tr><td>void push_back_(container, value)</td><td>Push_Back_</td></tr><tr><td>void pop_back_(container, value)</td><td>Pop_Back_</td></tr><tr><td>void push_front_(container, value)</td><td>Push_Front_</td></tr><tr><td>void pop_front_(container, value)</td><td>Pop_Front_</td></tr><tr><td>void clear_(container)</td><td>Clear_</td></tr><tr><td>size_type capacity_(container)</td><td>Capacity_</td></tr><tr><td>size_type size_(container)</td><td>Size_</td></tr><tr><td>size_type max_size_(container)</td><td>Max_Size_</td></tr><tr><td>void reserve_(container, value)</td><td>Reserve _</td></tr><tr><td>void resize_(container, value)</td><td>Resize _</td></tr><tr><td>iterator insert_(container, pos, value)</td><td>Insert_</td></tr><tr><td>void insert_( container , pos, first, last)</td><td>Insert_</td></tr><tr><td>void insert_( container , pos, number, value)</td><td>Insert_</td></tr><tr><td>void swap_( container , other_container)</td><td>Swap_</td></tr><tr><td>void erase_( container , pos)</td><td>Erase_</td></tr><tr><td>void erase_( container , first, last) </td><td>Erase_</td></tr><tr><td>bool empty_( container)</td><td>Empty_</td></tr></tbody></table></div></div><p><br class="table-break">
|
||||
</p><p>
|
||||
</p><div class="table"><a name="d0e4485"></a><p class="title"><b>Table 11.5. STL list methods</b></p><div class="table-contents"><table summary="STL list methods" border="1"><colgroup><col><col></colgroup><thead><tr><th>std::list methods in container.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>void list_remove_(container, value)</td><td>ListRemove_</td></tr><tr><td>void list_remove_if_(container, opᵃ)</td><td>ListRemove_If_</td></tr><tr><td>void list_merge_(container, other_list)</td><td>ListMerge_</td></tr><tr><td>void list_merge_(container, other_list, opᵃ)</td><td>ListMerge_</td></tr><tr><td>void splice_(container, iterator, other_list)</td><td>Splice_</td></tr><tr><td>void splice_(container, iterator, other_list,
|
||||
</p><div class="table"><a name="d0e4509"></a><p class="title"><b>Table 11.5. STL list methods</b></p><div class="table-contents"><table summary="STL list methods" border="1"><colgroup><col><col></colgroup><thead><tr><th>std::list methods in container.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>void list_remove_(container, value)</td><td>ListRemove_</td></tr><tr><td>void list_remove_if_(container, opᵃ)</td><td>ListRemove_If_</td></tr><tr><td>void list_merge_(container, other_list)</td><td>ListMerge_</td></tr><tr><td>void list_merge_(container, other_list, opᵃ)</td><td>ListMerge_</td></tr><tr><td>void splice_(container, iterator, other_list)</td><td>Splice_</td></tr><tr><td>void splice_(container, iterator, other_list,
|
||||
iterator)</td><td>Splice_</td></tr><tr><td>void splice_(container, iterator, other_list, first,
|
||||
last)</td><td>Splice_</td></tr><tr><td>void list_reverse_(container)</td><td>ListReverse_</td></tr><tr><td>void list_unique_(container)</td><td>ListUnique_</td></tr><tr><td>void list_unique_(container, opᵃ)</td><td>ListUnique_</td></tr><tr><td>void list_sort_(container)</td><td>ListSort_</td></tr><tr><td>void list_sort_(container, opᵃ)</td><td>ListSort_</td></tr></tbody></table></div></div><p><br class="table-break">
|
||||
</p><p>
|
||||
</p><div class="table"><a name="d0e4561"></a><p class="title"><b>Table 11.6. STL associative container methods </b></p><div class="table-contents"><table summary="STL associative container methods " border="1"><colgroup><col><col></colgroup><thead><tr><th>Associative container methods in container.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>iterator insert_(container, pos, value)</td><td>Insert_</td></tr><tr><td>void insert_( container , first, last)</td><td>Insert_</td></tr><tr><td>pair<iterator, bool> insert_( container , value)</td><td>Insert_</td></tr><tr><td>void associative_erase_( container , pos)</td><td>Associative_Erase_</td></tr><tr><td>void associative_erase_( container , first, last)</td><td>Associative_Erase_</td></tr><tr><td>size_type associative_erase_( container , key)</td><td>Associative_Erase_</td></tr><tr><td>iterator associative_find_( container , key)</td><td>Associative_Find_</td></tr><tr><td>size_type associative_count_( container , key)</td><td>AssociativeCount_</td></tr><tr><td>iterator associative_lower_bound_( container , key)</td><td>Associative_Lower_Bound_</td></tr><tr><td>iterator associative_upper_bound_( container , key)</td><td>Associative_Upper_Bound_</td></tr><tr><td>pair<iterator, iterator> associative_equal_range_(
|
||||
</p><div class="table"><a name="d0e4585"></a><p class="title"><b>Table 11.6. STL associative container methods </b></p><div class="table-contents"><table summary="STL associative container methods " border="1"><colgroup><col><col></colgroup><thead><tr><th>Associative container methods in container.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>iterator insert_(container, pos, value)</td><td>Insert_</td></tr><tr><td>void insert_( container , first, last)</td><td>Insert_</td></tr><tr><td>pair<iterator, bool> insert_( container , value)</td><td>Insert_</td></tr><tr><td>void associative_erase_( container , pos)</td><td>Associative_Erase_</td></tr><tr><td>void associative_erase_( container , first, last)</td><td>Associative_Erase_</td></tr><tr><td>size_type associative_erase_( container , key)</td><td>Associative_Erase_</td></tr><tr><td>iterator associative_find_( container , key)</td><td>Associative_Find_</td></tr><tr><td>size_type associative_count_( container , key)</td><td>AssociativeCount_</td></tr><tr><td>iterator associative_lower_bound_( container , key)</td><td>Associative_Lower_Bound_</td></tr><tr><td>iterator associative_upper_bound_( container , key)</td><td>Associative_Upper_Bound_</td></tr><tr><td>pair<iterator, iterator> associative_equal_range_(
|
||||
container , key)</td><td>Associative_Equal_Range_</td></tr></tbody></table></div></div><p><br class="table-break">
|
||||
</p><p>
|
||||
</p><div class="table"><a name="d0e4632"></a><p class="title"><b>Table 11.7. STL pair</b></p><div class="table-contents"><table summary="STL pair" border="1"><colgroup><col><col></colgroup><thead><tr><th>std::pair in container.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>first_type first_(pair<T1, T2>)</td><td>First_</td></tr><tr><td>second_type second_(pair<T1, T2>)</td><td>Second_</td></tr></tbody></table></div></div><p><br class="table-break">
|
||||
</p><div class="table"><a name="d0e4656"></a><p class="title"><b>Table 11.7. STL pair</b></p><div class="table-contents"><table summary="STL pair" border="1"><colgroup><col><col></colgroup><thead><tr><th>std::pair in container.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>first_type first_(pair<T1, T2>)</td><td>First_</td></tr><tr><td>second_type second_(pair<T1, T2>)</td><td>Second_</td></tr></tbody></table></div></div><p><br class="table-break">
|
||||
</p><p>
|
||||
</p><div class="table"><a name="d0e4658"></a><p class="title"><b>Table 11.8. STL string</b></p><div class="table-contents"><table summary="STL string" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>STL string method</th><th>std::string method in container.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>substr (size_type pos, size_type size)</td><td>string substr_(container, pos, length)</td><td>Substr_</td></tr><tr><td>int compare(string)</td><td>int string_compare_(container, another_string)</td><td>StringCompare_</td></tr><tr><td>int compare(char*)</td><td>int string_compare_(container, another_string)</td><td>StringCompare_</td></tr><tr><td>int compare(size_type pos, size_type size, string)</td><td>int string_compare_(container, pos, size,
|
||||
</p><div class="table"><a name="d0e4682"></a><p class="title"><b>Table 11.8. STL string</b></p><div class="table-contents"><table summary="STL string" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>STL string method</th><th>std::string method in container.hpp</th><th>Functor</th></tr></thead><tbody><tr><td>substr (size_type pos, size_type size)</td><td>string substr_(container, pos, length)</td><td>Substr_</td></tr><tr><td>int compare(string)</td><td>int string_compare_(container, another_string)</td><td>StringCompare_</td></tr><tr><td>int compare(char*)</td><td>int string_compare_(container, another_string)</td><td>StringCompare_</td></tr><tr><td>int compare(size_type pos, size_type size, string)</td><td>int string_compare_(container, pos, size,
|
||||
another_string)</td><td>StringCompare_</td></tr><tr><td>int compare (size_type pos, size_type size, string, size_type
|
||||
length)</td><td>int string_compare_(container, pos, size, another_string,
|
||||
length)</td><td>StringCompare_</td></tr><tr><td>string& append(const string&)</td><td>string& append_(container, another_string)</td><td>Append_</td></tr><tr><td>string& append (charT*)</td><td>string& append_(container, another_string)</td><td>Append_</td></tr><tr><td>string& append (string , size_type pos, size_type
|
||||
|
||||
169
doc/HTML/examples/SimpleTutorialWithEumlTableKleene.cpp
Normal file
169
doc/HTML/examples/SimpleTutorialWithEumlTableKleene.cpp
Normal file
@@ -0,0 +1,169 @@
|
||||
#include <iostream>
|
||||
// back-end
|
||||
#include <boost/msm/back/state_machine.hpp>
|
||||
//front-end
|
||||
#include <boost/msm/front/state_machine_def.hpp>
|
||||
#include <boost/msm/front/euml/euml.hpp>
|
||||
|
||||
namespace msm = boost::msm;
|
||||
namespace mpl = boost::mpl;
|
||||
using namespace std;
|
||||
using namespace msm::front::euml;
|
||||
|
||||
// entry/exit/action/guard logging functors
|
||||
#include "logging_functors.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
// events
|
||||
struct play_impl : msm::front::euml::euml_event<play_impl> {};
|
||||
struct end_pause_impl : msm::front::euml::euml_event<end_pause_impl>{};
|
||||
struct stop_impl : msm::front::euml::euml_event<stop_impl>{};
|
||||
struct pause_impl : msm::front::euml::euml_event<pause_impl>{};
|
||||
struct open_close_impl : msm::front::euml::euml_event<open_close_impl>{};
|
||||
struct cd_detected_impl : msm::front::euml::euml_event<cd_detected_impl>{};
|
||||
|
||||
// define some dummy instances for use in the transition table
|
||||
// it is also possible to default-construct them instead:
|
||||
// struct play {};
|
||||
// inside the table: play()
|
||||
play_impl play;
|
||||
end_pause_impl end_pause;
|
||||
stop_impl stop;
|
||||
pause_impl pause;
|
||||
open_close_impl open_close;
|
||||
cd_detected_impl cd_detected;
|
||||
|
||||
// The list of FSM states
|
||||
// they have to be declared outside of the front-end only to make VC happy :(
|
||||
// note: gcc would have no problem
|
||||
struct Empty_impl : public msm::front::state<> , public msm::front::euml::euml_state<Empty_impl>
|
||||
{
|
||||
// every (optional) entry/exit methods get the event passed.
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const&,FSM& ) {std::cout << "entering: Empty" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Empty" << std::endl;}
|
||||
};
|
||||
struct Open_impl : public msm::front::state<> , public msm::front::euml::euml_state<Open_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const& ,FSM&) {std::cout << "entering: Open" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Open" << std::endl;}
|
||||
};
|
||||
|
||||
struct Stopped_impl : public msm::front::state<> , public msm::front::euml::euml_state<Stopped_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const& ,FSM&) {std::cout << "entering: Stopped" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Stopped" << std::endl;}
|
||||
};
|
||||
|
||||
struct Playing_impl : public msm::front::state<> , public msm::front::euml::euml_state<Playing_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const&,FSM& ) {std::cout << "entering: Playing" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Playing" << std::endl;}
|
||||
};
|
||||
|
||||
// state not defining any entry or exit
|
||||
struct Paused_impl : public msm::front::state<> , public msm::front::euml::euml_state<Paused_impl>
|
||||
{
|
||||
};
|
||||
//to make the transition table more readable
|
||||
Empty_impl const Empty;
|
||||
Open_impl const Open;
|
||||
Stopped_impl const Stopped;
|
||||
Playing_impl const Playing;
|
||||
Paused_impl const Paused;
|
||||
|
||||
BOOST_MSM_EUML_ACTION(pause_playback2)
|
||||
{
|
||||
template <class FSM,class EVT,class SourceState,class TargetState>
|
||||
void operator()(EVT const& evt,FSM&,SourceState& ,TargetState& )
|
||||
{
|
||||
cout << "player::pause_playback2" << endl;
|
||||
std::cout << "event type: " << typeid(EVT).name() << std::endl;
|
||||
std::cout << "pause_playback2 with any event: " << evt.type().name() << std::endl;
|
||||
}
|
||||
};
|
||||
// front-end: define the FSM structure
|
||||
struct player_ : public msm::front::state_machine_def<player_>
|
||||
{
|
||||
|
||||
// the initial state of the player SM. Must be defined
|
||||
typedef Empty_impl initial_state;
|
||||
|
||||
// Transition table for player
|
||||
// replaces the old transition table
|
||||
BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE((
|
||||
Stopped + play / 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 /(store_cd_info,
|
||||
msm::front::euml::process_(play)) == Stopped ,
|
||||
// +------------------------------------------------------------------------------+
|
||||
Playing + stop / stop_playback == Stopped ,
|
||||
Playing + kleene / pause_playback2 == Paused ,
|
||||
Playing + open_close / stop_and_open == Open ,
|
||||
// +------------------------------------------------------------------------------+
|
||||
Paused + end_pause / resume_playback == Playing ,
|
||||
Paused + stop / stop_playback == Stopped ,
|
||||
Paused + open_close / stop_and_open == Open
|
||||
// +------------------------------------------------------------------------------+
|
||||
),transition_table)
|
||||
|
||||
// Replaces the default no-transition response.
|
||||
template <class FSM,class Event>
|
||||
void no_transition(Event const& e, FSM&,int state)
|
||||
{
|
||||
std::cout << "no transition from state " << state
|
||||
<< " on event " << typeid(e).name() << std::endl;
|
||||
}
|
||||
};
|
||||
// Pick a back-end
|
||||
typedef msm::back::state_machine<player_> player;
|
||||
|
||||
//
|
||||
// Testing utilities.
|
||||
//
|
||||
static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused" };
|
||||
void pstate(player const& p)
|
||||
{
|
||||
std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
|
||||
}
|
||||
|
||||
void test()
|
||||
{
|
||||
player p;
|
||||
// needed to start the highest-level SM. This will call on_entry and mark the start of the SM
|
||||
p.start();
|
||||
// go to Open, call on_exit on Empty, then action, then on_entry on Open
|
||||
p.process_event(open_close); pstate(p);
|
||||
p.process_event(open_close); pstate(p);
|
||||
p.process_event(cd_detected); pstate(p);
|
||||
|
||||
// at this point, Play is active
|
||||
p.process_event(pause); pstate(p);
|
||||
// go back to Playing
|
||||
p.process_event(end_pause); pstate(p);
|
||||
p.process_event(pause); pstate(p);
|
||||
p.process_event(stop); pstate(p);
|
||||
// event leading to the same state
|
||||
// no action method called as it is not present in the transition table
|
||||
p.process_event(stop); pstate(p);
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test();
|
||||
return 0;
|
||||
}
|
||||
205
doc/HTML/examples/SimpleTutorialWithEumlTableTypeErasure.cpp
Normal file
205
doc/HTML/examples/SimpleTutorialWithEumlTableTypeErasure.cpp
Normal file
@@ -0,0 +1,205 @@
|
||||
#include <iostream>
|
||||
// back-end
|
||||
#include <boost/msm/back/state_machine.hpp>
|
||||
//front-end
|
||||
#include <boost/msm/front/state_machine_def.hpp>
|
||||
#include <boost/msm/front/euml/euml.hpp>
|
||||
#include <boost/msm/event_traits.hpp>
|
||||
|
||||
#include <boost/type_erasure/any.hpp>
|
||||
#include <boost/type_erasure/member.hpp>
|
||||
#include <boost/type_erasure/builtin.hpp>
|
||||
#include <boost/type_erasure/constructible.hpp>
|
||||
#include <boost/type_erasure/relaxed_match.hpp>
|
||||
#include <boost/type_erasure/any_cast.hpp>
|
||||
|
||||
namespace msm = boost::msm;
|
||||
namespace mpl = boost::mpl;
|
||||
using namespace std;
|
||||
using namespace msm::front::euml;
|
||||
|
||||
// entry/exit/action/guard logging functors
|
||||
#include "logging_functors.h"
|
||||
|
||||
BOOST_TYPE_ERASURE_MEMBER((has_getNumber), getNumber, 0);
|
||||
//type erasure event
|
||||
typedef ::boost::mpl::vector<
|
||||
has_getNumber<int(), const boost::type_erasure::_self>,
|
||||
boost::type_erasure::relaxed_match,
|
||||
boost::type_erasure::copy_constructible<>,
|
||||
boost::type_erasure::typeid_<>
|
||||
> any_number_event_concept;
|
||||
struct any_number_event : boost::type_erasure::any<any_number_event_concept>,
|
||||
msm::front::euml::euml_event<any_number_event>
|
||||
{
|
||||
template <class U>
|
||||
any_number_event(U const& u): boost::type_erasure::any<any_number_event_concept> (u){}
|
||||
any_number_event(): boost::type_erasure::any<any_number_event_concept> (){}
|
||||
};
|
||||
|
||||
|
||||
namespace boost { namespace msm{
|
||||
template<>
|
||||
struct is_kleene_event< any_number_event >
|
||||
{
|
||||
typedef boost::mpl::true_ type;
|
||||
};
|
||||
}}
|
||||
|
||||
namespace
|
||||
{
|
||||
// events
|
||||
struct play_impl : msm::front::euml::euml_event<play_impl> {int getNumber()const {return 0;}};
|
||||
struct end_pause_impl : msm::front::euml::euml_event<end_pause_impl>{int getNumber()const {return 1;}};
|
||||
struct stop_impl : msm::front::euml::euml_event<stop_impl>{int getNumber()const {return 2;}};
|
||||
struct pause_impl : msm::front::euml::euml_event<pause_impl>{int getNumber()const {return 3;}};
|
||||
struct open_close_impl : msm::front::euml::euml_event<open_close_impl>{int getNumber()const {return 4;}};
|
||||
struct cd_detected_impl : msm::front::euml::euml_event<cd_detected_impl>{int getNumber()const {return 5;}};
|
||||
|
||||
// define some dummy instances for use in the transition table
|
||||
// it is also possible to default-construct them instead:
|
||||
// struct play {};
|
||||
// inside the table: play()
|
||||
play_impl play;
|
||||
end_pause_impl end_pause;
|
||||
stop_impl stop;
|
||||
pause_impl pause;
|
||||
open_close_impl open_close;
|
||||
cd_detected_impl cd_detected;
|
||||
any_number_event number_event;
|
||||
|
||||
// The list of FSM states
|
||||
// they have to be declared outside of the front-end only to make VC happy :(
|
||||
// note: gcc would have no problem
|
||||
struct Empty_impl : public msm::front::state<> , public msm::front::euml::euml_state<Empty_impl>
|
||||
{
|
||||
// every (optional) entry/exit methods get the event passed.
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const&,FSM& ) {std::cout << "entering: Empty" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Empty" << std::endl;}
|
||||
};
|
||||
struct Open_impl : public msm::front::state<> , public msm::front::euml::euml_state<Open_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const& ,FSM&) {std::cout << "entering: Open" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Open" << std::endl;}
|
||||
};
|
||||
|
||||
struct Stopped_impl : public msm::front::state<> , public msm::front::euml::euml_state<Stopped_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const& ,FSM&) {std::cout << "entering: Stopped" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Stopped" << std::endl;}
|
||||
};
|
||||
|
||||
struct Playing_impl : public msm::front::state<> , public msm::front::euml::euml_state<Playing_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const&,FSM& ) {std::cout << "entering: Playing" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Playing" << std::endl;}
|
||||
};
|
||||
|
||||
// state not defining any entry or exit
|
||||
struct Paused_impl : public msm::front::state<> , public msm::front::euml::euml_state<Paused_impl>
|
||||
{
|
||||
};
|
||||
//to make the transition table more readable
|
||||
Empty_impl const Empty;
|
||||
Open_impl const Open;
|
||||
Stopped_impl const Stopped;
|
||||
Playing_impl const Playing;
|
||||
Paused_impl const Paused;
|
||||
|
||||
BOOST_MSM_EUML_ACTION(pause_playback2)
|
||||
{
|
||||
template <class FSM,class EVT,class SourceState,class TargetState>
|
||||
void operator()(EVT const& evt,FSM&,SourceState& ,TargetState& )
|
||||
{
|
||||
cout << "player::pause_playback2" << endl;
|
||||
std::cout << "event type: " << typeid(EVT).name() << std::endl;
|
||||
std::cout << "event's number: " << evt.getNumber() << std::endl;
|
||||
}
|
||||
};
|
||||
// front-end: define the FSM structure
|
||||
struct player_ : public msm::front::state_machine_def<player_>
|
||||
{
|
||||
|
||||
// the initial state of the player SM. Must be defined
|
||||
typedef Empty_impl initial_state;
|
||||
|
||||
// Transition table for player
|
||||
// replaces the old transition table
|
||||
BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE((
|
||||
Stopped + play / 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 /(store_cd_info,
|
||||
msm::front::euml::process_(play)) == Stopped ,
|
||||
// +------------------------------------------------------------------------------+
|
||||
Playing + stop / stop_playback == Stopped ,
|
||||
Playing + number_event / pause_playback == Paused ,
|
||||
Playing + open_close / stop_and_open == Open ,
|
||||
// +------------------------------------------------------------------------------+
|
||||
Paused + end_pause / resume_playback == Playing ,
|
||||
Paused + stop / stop_playback == Stopped ,
|
||||
Paused + open_close / stop_and_open == Open
|
||||
// +------------------------------------------------------------------------------+
|
||||
),transition_table)
|
||||
|
||||
// Replaces the default no-transition response.
|
||||
template <class FSM,class Event>
|
||||
void no_transition(Event const& e, FSM&,int state)
|
||||
{
|
||||
std::cout << "no transition from state " << state
|
||||
<< " on event " << typeid(e).name() << std::endl;
|
||||
}
|
||||
};
|
||||
// Pick a back-end
|
||||
typedef msm::back::state_machine<player_> player;
|
||||
|
||||
//
|
||||
// Testing utilities.
|
||||
//
|
||||
static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused" };
|
||||
void pstate(player const& p)
|
||||
{
|
||||
std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
|
||||
}
|
||||
|
||||
void test()
|
||||
{
|
||||
player p;
|
||||
// needed to start the highest-level SM. This will call on_entry and mark the start of the SM
|
||||
p.start();
|
||||
// go to Open, call on_exit on Empty, then action, then on_entry on Open
|
||||
p.process_event(open_close); pstate(p);
|
||||
p.process_event(open_close); pstate(p);
|
||||
p.process_event(cd_detected); pstate(p);
|
||||
|
||||
// at this point, Play is active
|
||||
p.process_event(pause); pstate(p);
|
||||
// go back to Playing
|
||||
p.process_event(end_pause); pstate(p);
|
||||
p.process_event(pause); pstate(p);
|
||||
p.process_event(stop); pstate(p);
|
||||
// event leading to the same state
|
||||
// no action method called as it is not present in the transition table
|
||||
p.process_event(stop); pstate(p);
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,19 +1,19 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Meta State Machine (MSM)</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="next" href="pr01.html" title="Preface"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Meta State Machine (MSM)</th></tr><tr><td width="20%" align="left"> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="pr01.html">Next</a></td></tr></table><hr></div><div class="book" title="Meta State Machine (MSM)"><div class="titlepage"><div><div><h1 class="title"><a name="d0e2"></a>Meta State Machine (MSM)</h1></div><div><div class="author"><h3 class="author">Christophe Henry</h3><code class="email"><<a class="email" href="mailto:christophe.j.henry@googlemail.com">christophe.j.henry@googlemail.com</a>></code></div></div><div><p class="copyright">Copyright © 2008-2010
|
||||
<title>Meta State Machine (MSM)</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="next" href="pr01.html" title="Preface"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Meta State Machine (MSM)</th></tr><tr><td width="20%" align="left"> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="pr01.html">Next</a></td></tr></table><hr></div><div class="book" title="Meta State Machine (MSM)"><div class="titlepage"><div><div><h1 class="title"><a name="d0e2"></a>Meta State Machine (MSM)</h1></div><div><div class="author"><h3 class="author">Christophe Henry</h3><code class="email"><<a class="email" href="mailto:christophe.j.henry@googlemail.com">christophe.j.henry@googlemail.com</a>></code></div></div><div><p class="copyright">Copyright © 2008-2010
|
||||
<span> Distributed under the Boost Software License, Version 1.0. (See
|
||||
accompanying file LICENSE_1_0.txt or copy at <a class="link" href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a> ) </span>
|
||||
</p></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="preface"><a href="pr01.html">Preface</a></span></dt><dt><span class="part"><a href="pt01.html">I. User' guide</a></span></dt><dd><dl><dt><span class="chapter"><a href="ch01.html">1. Founding idea</a></span></dt><dt><span class="chapter"><a href="ch02.html">2. UML Short Guide</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch02.html#d0e111">What are state machines?</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">Concepts</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#d0e121">State machine, state, transition, event </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e151">Submachines, orthogonal regions, pseudostates </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e194">
|
||||
History </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e208">Completion transitions / anonymous
|
||||
transitions</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e220"> Internal transitions </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e226">
|
||||
Conflicting transitions </a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">Added concepts</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">State machine glossary</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch03.html">3. Tutorial</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch03.html#d0e325">Design</a></span></dt><dt><span class="sect1"><a href="ch03s02.html">Basic front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s02.html#d0e344">A simple example</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e358">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e406">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e419">What do you actually do inside actions / guards?</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e471">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e529">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e577">Orthogonal regions, terminate state, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e668">History</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e713">Completion (anonymous) transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e740">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e842">more row types</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e875">Explicit entry / entry and exit pseudo-state / fork</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1064">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1118">Event Hierarchy</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1139">Customizing a state machine / Getting more speed</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1188">Choosing the initial event</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1201"> Containing state machine (deprecated)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s03.html">Functor front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s03.html#d0e1240"> Transition table </a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1273">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1292">What do you actually do inside actions / guards (Part 2)?</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1304">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1312">Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1338">Internal
|
||||
transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1384">Kleene (any) event</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s04.html">eUML (experimental)</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s04.html#d0e1454">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1495">A simple example: rewriting only our transition table </a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1528">Defining events, actions and states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1641">Wrapping up a simple state machine and first complete examples</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1689">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1705">
|
||||
Attributes / Function call</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1805">Orthogonal regions, flags, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1917">
|
||||
Conflicting transitions </a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">Added concepts</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">State machine glossary</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch03.html">3. Tutorial</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch03.html#d0e325">Design</a></span></dt><dt><span class="sect1"><a href="ch03s02.html">Basic front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s02.html#d0e344">A simple example</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e358">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e406">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e419">What do you actually do inside actions / guards?</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e471">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e529">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e577">Orthogonal regions, terminate state, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e668">History</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e713">Completion (anonymous) transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e740">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e842">more row types</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e875">Explicit entry / entry and exit pseudo-state / fork</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1064">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1126">Event Hierarchy</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1147">Customizing a state machine / Getting more speed</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1196">Choosing the initial event</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1209"> Containing state machine (deprecated)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s03.html">Functor front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s03.html#d0e1248"> Transition table </a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1281">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1300">What do you actually do inside actions / guards (Part 2)?</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1312">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1320">Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1346">Internal
|
||||
transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1392">Kleene (any) event</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s04.html">eUML (experimental)</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s04.html#d0e1462">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1503">A simple example: rewriting only our transition table </a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1536">Defining events, actions and states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1649">Wrapping up a simple state machine and first complete examples</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1697">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1713">
|
||||
Attributes / Function call</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1813">Orthogonal regions, flags, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1925">
|
||||
Customizing a state machine / Getting
|
||||
more speed</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1952">Completion / Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1970">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2001">Kleene(any) event)</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2016">Other state types</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2080">Helper functions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2183">Phoenix-like STL support</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2236">Writing actions with Boost.Phoenix (in development)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s05.html">Back-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s05.html#d0e2295">Creation </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2304">Starting and stopping a state
|
||||
machine</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2323">Event dispatching</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2332">Active state(s)</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2346">Serialization</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2399">Base state type </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2425">Visitor</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2468">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2481">Getting a state</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2494"> State machine constructor with arguments </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2534">Trading run-time speed for
|
||||
better compile-time / multi-TU compilation</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2616">Compile-time state machine analysis </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2660"> Enqueueing events for later
|
||||
processing </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2680"> Customizing the message queues </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2695">Policy definition with Boost.Parameter </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2703">Choosing when to switch active
|
||||
states </a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch04.html">4. Performance / Compilers</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch04.html#d0e2784">Speed</a></span></dt><dt><span class="sect1"><a href="ch04s02.html">Executable size</a></span></dt><dt><span class="sect1"><a href="ch04s03.html">Supported compilers</a></span></dt><dt><span class="sect1"><a href="ch04s04.html"> Limitations </a></span></dt><dt><span class="sect1"><a href="ch04s05.html"> Compilers corner </a></span></dt></dl></dd><dt><span class="chapter"><a href="ch05.html">5. Questions & Answers, tips</a></span></dt><dt><span class="chapter"><a href="ch06.html">6. Internals</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch06.html#d0e3002">Backend: Run To Completion</a></span></dt><dt><span class="sect1"><a href="ch06s02.html">Frontend / Backend
|
||||
interface</a></span></dt><dt><span class="sect1"><a href="ch06s03.html"> Generated state ids </a></span></dt><dt><span class="sect1"><a href="ch06s04.html">Metaprogramming tools</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch07.html">7. Acknowledgements</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch07.html#d0e3297">MSM v2</a></span></dt><dt><span class="sect1"><a href="ch07s02.html"> MSM v1</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch08.html">8. Version history</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch08.html#d0e3344">From V2.23 to V2.24 (Boost 1.51)</a></span></dt><dt><span class="sect1"><a href="ch08s02.html">From V2.22 to V2.23 (Boost 1.50)</a></span></dt><dt><span class="sect1"><a href="ch08s03.html">From V2.21 to V2.22 (Boost 1.48)</a></span></dt><dt><span class="sect1"><a href="ch08s04.html">From V2.20 to V2.21 (Boost 1.47)</a></span></dt><dt><span class="sect1"><a href="ch08s05.html">From V2.12 to V2.20 (Boost 1.46)</a></span></dt><dt><span class="sect1"><a href="ch08s06.html">From V2.10 to V2.12 (Boost 1.45)</a></span></dt><dt><span class="sect1"><a href="ch08s07.html">From V2.0 to V2.12 (Boost 1.44)</a></span></dt></dl></dd></dl></dd><dt><span class="part"><a href="pt02.html">II. Reference</a></span></dt><dd><dl><dt><span class="chapter"><a href="ch09.html">9. External references to MSM</a></span></dt><dt><span class="chapter"><a href="ch10.html">10. eUML operators and basic helpers</a></span></dt><dt><span class="chapter"><a href="ch11.html">11.
|
||||
Functional programming </a></span></dt><dt><span class="refentrytitle"><a href="re01.html">Common headers</a></span><span class="refpurpose"> — The common types used by front- and back-ends</span></dt><dt><span class="refentrytitle"><a href="re02.html">Back-end</a></span><span class="refpurpose"> — The back-end headers</span></dt><dt><span class="refentrytitle"><a href="re03.html">Front-end</a></span><span class="refpurpose"> — The front-end headers</span></dt></dl></dd></dl></div><div class="list-of-tables"><p><b>List of Tables</b></p><dl><dt>10.1. <a href="ch10.html#d0e3640">Operators and state machine helpers</a></dt><dt>11.1. <a href="ch11.html#d0e3995">STL algorithms</a></dt><dt>11.2. <a href="ch11.html#d0e4108">STL algorithms</a></dt><dt>11.3. <a href="ch11.html#d0e4136">STL algorithms</a></dt><dt>11.4. <a href="ch11.html#d0e4354">STL container methods</a></dt><dt>11.5. <a href="ch11.html#d0e4485">STL list methods</a></dt><dt>11.6. <a href="ch11.html#d0e4561">STL associative container methods </a></dt><dt>11.7. <a href="ch11.html#d0e4632">STL pair</a></dt><dt>11.8. <a href="ch11.html#d0e4658">STL string</a></dt></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="pr01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"> </td><td width="40%" align="right" valign="top"> Preface</td></tr></table></div></body></html>
|
||||
more speed</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1960">Completion / Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1978">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2009">Kleene(any) event)</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2024">Other state types</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2088">Helper functions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2191">Phoenix-like STL support</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2244">Writing actions with Boost.Phoenix (in development)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s05.html">Back-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s05.html#d0e2303">Creation </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2312">Starting and stopping a state
|
||||
machine</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2331">Event dispatching</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2340">Active state(s)</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2354">Serialization</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2407">Base state type </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2433">Visitor</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2476">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2489">Getting a state</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2502"> State machine constructor with arguments </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2542">Trading run-time speed for
|
||||
better compile-time / multi-TU compilation</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2624">Compile-time state machine analysis </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2668"> Enqueueing events for later
|
||||
processing </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2688"> Customizing the message queues </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2703">Policy definition with Boost.Parameter </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2711">Choosing when to switch active
|
||||
states </a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch04.html">4. Performance / Compilers</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch04.html#d0e2792">Speed</a></span></dt><dt><span class="sect1"><a href="ch04s02.html">Executable size</a></span></dt><dt><span class="sect1"><a href="ch04s03.html">Supported compilers</a></span></dt><dt><span class="sect1"><a href="ch04s04.html"> Limitations </a></span></dt><dt><span class="sect1"><a href="ch04s05.html"> Compilers corner </a></span></dt></dl></dd><dt><span class="chapter"><a href="ch05.html">5. Questions & Answers, tips</a></span></dt><dt><span class="chapter"><a href="ch06.html">6. Internals</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch06.html#d0e3010">Backend: Run To Completion</a></span></dt><dt><span class="sect1"><a href="ch06s02.html">Frontend / Backend
|
||||
interface</a></span></dt><dt><span class="sect1"><a href="ch06s03.html"> Generated state ids </a></span></dt><dt><span class="sect1"><a href="ch06s04.html">Metaprogramming tools</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch07.html">7. Acknowledgements</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch07.html#d0e3305">MSM v2</a></span></dt><dt><span class="sect1"><a href="ch07s02.html"> MSM v1</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch08.html">8. Version history</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch08.html#d0e3352">From V2.24 to V2.25 (Boost 1.54)</a></span></dt><dt><span class="sect1"><a href="ch08s02.html">From V2.23 to V2.24 (Boost 1.51)</a></span></dt><dt><span class="sect1"><a href="ch08s03.html">From V2.22 to V2.23 (Boost 1.50)</a></span></dt><dt><span class="sect1"><a href="ch08s04.html">From V2.21 to V2.22 (Boost 1.48)</a></span></dt><dt><span class="sect1"><a href="ch08s05.html">From V2.20 to V2.21 (Boost 1.47)</a></span></dt><dt><span class="sect1"><a href="ch08s06.html">From V2.12 to V2.20 (Boost 1.46)</a></span></dt><dt><span class="sect1"><a href="ch08s07.html">From V2.10 to V2.12 (Boost 1.45)</a></span></dt><dt><span class="sect1"><a href="ch08s08.html">From V2.0 to V2.12 (Boost 1.44)</a></span></dt></dl></dd></dl></dd><dt><span class="part"><a href="pt02.html">II. Reference</a></span></dt><dd><dl><dt><span class="chapter"><a href="ch09.html">9. External references to MSM</a></span></dt><dt><span class="chapter"><a href="ch10.html">10. eUML operators and basic helpers</a></span></dt><dt><span class="chapter"><a href="ch11.html">11.
|
||||
Functional programming </a></span></dt><dt><span class="refentrytitle"><a href="re01.html">Common headers</a></span><span class="refpurpose"> — The common types used by front- and back-ends</span></dt><dt><span class="refentrytitle"><a href="re02.html">Back-end</a></span><span class="refpurpose"> — The back-end headers</span></dt><dt><span class="refentrytitle"><a href="re03.html">Front-end</a></span><span class="refpurpose"> — The front-end headers</span></dt></dl></dd></dl></div><div class="list-of-tables"><p><b>List of Tables</b></p><dl><dt>10.1. <a href="ch10.html#d0e3664">Operators and state machine helpers</a></dt><dt>11.1. <a href="ch11.html#d0e4019">STL algorithms</a></dt><dt>11.2. <a href="ch11.html#d0e4132">STL algorithms</a></dt><dt>11.3. <a href="ch11.html#d0e4160">STL algorithms</a></dt><dt>11.4. <a href="ch11.html#d0e4378">STL container methods</a></dt><dt>11.5. <a href="ch11.html#d0e4509">STL list methods</a></dt><dt>11.6. <a href="ch11.html#d0e4585">STL associative container methods </a></dt><dt>11.7. <a href="ch11.html#d0e4656">STL pair</a></dt><dt>11.8. <a href="ch11.html#d0e4682">STL string</a></dt></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="pr01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"> </td><td width="40%" align="right" valign="top"> Preface</td></tr></table></div></body></html>
|
||||
@@ -1,6 +1,6 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Preface</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="index.html" title="Meta State Machine (MSM)"><link rel="prev" href="index.html" title="Meta State Machine (MSM)"><link rel="next" href="pt01.html" title="Part I. User' guide"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Preface</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="index.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="pt01.html">Next</a></td></tr></table><hr></div><div class="preface" title="Preface"><div class="titlepage"><div><div><h2 class="title"><a name="d0e22"></a>Preface</h2></div></div></div><p>MSM is a library allowing you to easily and quickly define state machines of very high
|
||||
<title>Preface</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="index.html" title="Meta State Machine (MSM)"><link rel="prev" href="index.html" title="Meta State Machine (MSM)"><link rel="next" href="pt01.html" title="Part I. User' guide"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Preface</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="index.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="pt01.html">Next</a></td></tr></table><hr></div><div class="preface" title="Preface"><div class="titlepage"><div><div><h2 class="title"><a name="d0e22"></a>Preface</h2></div></div></div><p>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.</p><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>When do I need a state machine?</p><p>More often that you think. Very often, one defined a state machine
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Part I. User' guide</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="index.html" title="Meta State Machine (MSM)"><link rel="prev" href="pr01.html" title="Preface"><link rel="next" href="ch01.html" title="Chapter 1. Founding idea"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Part I. User' guide</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="pr01.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch01.html">Next</a></td></tr></table><hr></div><div class="part" title="Part I. User' guide"><div class="titlepage"><div><div><h1 class="title"><a name="d0e96"></a>Part I. User' guide</h1></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Founding idea</a></span></dt><dt><span class="chapter"><a href="ch02.html">2. UML Short Guide</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch02.html#d0e111">What are state machines?</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">Concepts</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#d0e121">State machine, state, transition, event </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e151">Submachines, orthogonal regions, pseudostates </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e194">
|
||||
<title>Part I. User' guide</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="index.html" title="Meta State Machine (MSM)"><link rel="prev" href="pr01.html" title="Preface"><link rel="next" href="ch01.html" title="Chapter 1. Founding idea"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Part I. User' guide</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="pr01.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch01.html">Next</a></td></tr></table><hr></div><div class="part" title="Part I. User' guide"><div class="titlepage"><div><div><h1 class="title"><a name="d0e96"></a>Part I. User' guide</h1></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Founding idea</a></span></dt><dt><span class="chapter"><a href="ch02.html">2. UML Short Guide</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch02.html#d0e111">What are state machines?</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">Concepts</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#d0e121">State machine, state, transition, event </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e151">Submachines, orthogonal regions, pseudostates </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e194">
|
||||
History </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e208">Completion transitions / anonymous
|
||||
transitions</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e220"> Internal transitions </a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e226">
|
||||
Conflicting transitions </a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">Added concepts</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">State machine glossary</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch03.html">3. Tutorial</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch03.html#d0e325">Design</a></span></dt><dt><span class="sect1"><a href="ch03s02.html">Basic front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s02.html#d0e344">A simple example</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e358">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e406">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e419">What do you actually do inside actions / guards?</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e471">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e529">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e577">Orthogonal regions, terminate state, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e668">History</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e713">Completion (anonymous) transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e740">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e842">more row types</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e875">Explicit entry / entry and exit pseudo-state / fork</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1064">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1118">Event Hierarchy</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1139">Customizing a state machine / Getting more speed</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1188">Choosing the initial event</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1201"> Containing state machine (deprecated)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s03.html">Functor front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s03.html#d0e1240"> Transition table </a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1273">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1292">What do you actually do inside actions / guards (Part 2)?</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1304">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1312">Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1338">Internal
|
||||
transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1384">Kleene (any) event</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s04.html">eUML (experimental)</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s04.html#d0e1454">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1495">A simple example: rewriting only our transition table </a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1528">Defining events, actions and states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1641">Wrapping up a simple state machine and first complete examples</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1689">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1705">
|
||||
Attributes / Function call</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1805">Orthogonal regions, flags, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1917">
|
||||
Conflicting transitions </a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">Added concepts</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">State machine glossary</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch03.html">3. Tutorial</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch03.html#d0e325">Design</a></span></dt><dt><span class="sect1"><a href="ch03s02.html">Basic front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s02.html#d0e344">A simple example</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e358">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e406">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e419">What do you actually do inside actions / guards?</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e471">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e529">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e577">Orthogonal regions, terminate state, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e668">History</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e713">Completion (anonymous) transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e740">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e842">more row types</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e875">Explicit entry / entry and exit pseudo-state / fork</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1064">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1126">Event Hierarchy</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1147">Customizing a state machine / Getting more speed</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1196">Choosing the initial event</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#d0e1209"> Containing state machine (deprecated)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s03.html">Functor front-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s03.html#d0e1248"> Transition table </a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1281">Defining states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1300">What do you actually do inside actions / guards (Part 2)?</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1312">Defining a simple state machine</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1320">Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1346">Internal
|
||||
transitions</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#d0e1392">Kleene (any) event</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s04.html">eUML (experimental)</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s04.html#d0e1462">Transition table</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1503">A simple example: rewriting only our transition table </a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1536">Defining events, actions and states with entry/exit actions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1649">Wrapping up a simple state machine and first complete examples</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1697">Defining a submachine</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1713">
|
||||
Attributes / Function call</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1813">Orthogonal regions, flags, event deferring</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1925">
|
||||
Customizing a state machine / Getting
|
||||
more speed</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1952">Completion / Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1970">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2001">Kleene(any) event)</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2016">Other state types</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2080">Helper functions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2183">Phoenix-like STL support</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2236">Writing actions with Boost.Phoenix (in development)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s05.html">Back-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s05.html#d0e2295">Creation </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2304">Starting and stopping a state
|
||||
machine</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2323">Event dispatching</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2332">Active state(s)</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2346">Serialization</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2399">Base state type </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2425">Visitor</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2468">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2481">Getting a state</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2494"> State machine constructor with arguments </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2534">Trading run-time speed for
|
||||
better compile-time / multi-TU compilation</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2616">Compile-time state machine analysis </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2660"> Enqueueing events for later
|
||||
processing </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2680"> Customizing the message queues </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2695">Policy definition with Boost.Parameter </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2703">Choosing when to switch active
|
||||
states </a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch04.html">4. Performance / Compilers</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch04.html#d0e2784">Speed</a></span></dt><dt><span class="sect1"><a href="ch04s02.html">Executable size</a></span></dt><dt><span class="sect1"><a href="ch04s03.html">Supported compilers</a></span></dt><dt><span class="sect1"><a href="ch04s04.html"> Limitations </a></span></dt><dt><span class="sect1"><a href="ch04s05.html"> Compilers corner </a></span></dt></dl></dd><dt><span class="chapter"><a href="ch05.html">5. Questions & Answers, tips</a></span></dt><dt><span class="chapter"><a href="ch06.html">6. Internals</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch06.html#d0e3002">Backend: Run To Completion</a></span></dt><dt><span class="sect1"><a href="ch06s02.html">Frontend / Backend
|
||||
interface</a></span></dt><dt><span class="sect1"><a href="ch06s03.html"> Generated state ids </a></span></dt><dt><span class="sect1"><a href="ch06s04.html">Metaprogramming tools</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch07.html">7. Acknowledgements</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch07.html#d0e3297">MSM v2</a></span></dt><dt><span class="sect1"><a href="ch07s02.html"> MSM v1</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch08.html">8. Version history</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch08.html#d0e3344">From V2.23 to V2.24 (Boost 1.51)</a></span></dt><dt><span class="sect1"><a href="ch08s02.html">From V2.22 to V2.23 (Boost 1.50)</a></span></dt><dt><span class="sect1"><a href="ch08s03.html">From V2.21 to V2.22 (Boost 1.48)</a></span></dt><dt><span class="sect1"><a href="ch08s04.html">From V2.20 to V2.21 (Boost 1.47)</a></span></dt><dt><span class="sect1"><a href="ch08s05.html">From V2.12 to V2.20 (Boost 1.46)</a></span></dt><dt><span class="sect1"><a href="ch08s06.html">From V2.10 to V2.12 (Boost 1.45)</a></span></dt><dt><span class="sect1"><a href="ch08s07.html">From V2.0 to V2.12 (Boost 1.44)</a></span></dt></dl></dd></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="pr01.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Preface </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 1. Founding idea</td></tr></table></div></body></html>
|
||||
more speed</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1960">Completion / Anonymous transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e1978">Internal transitions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2009">Kleene(any) event)</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2024">Other state types</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2088">Helper functions</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2191">Phoenix-like STL support</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#d0e2244">Writing actions with Boost.Phoenix (in development)</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s05.html">Back-end</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s05.html#d0e2303">Creation </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2312">Starting and stopping a state
|
||||
machine</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2331">Event dispatching</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2340">Active state(s)</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2354">Serialization</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2407">Base state type </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2433">Visitor</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2476">Flags</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2489">Getting a state</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2502"> State machine constructor with arguments </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2542">Trading run-time speed for
|
||||
better compile-time / multi-TU compilation</a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2624">Compile-time state machine analysis </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2668"> Enqueueing events for later
|
||||
processing </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2688"> Customizing the message queues </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2703">Policy definition with Boost.Parameter </a></span></dt><dt><span class="sect2"><a href="ch03s05.html#d0e2711">Choosing when to switch active
|
||||
states </a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch04.html">4. Performance / Compilers</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch04.html#d0e2792">Speed</a></span></dt><dt><span class="sect1"><a href="ch04s02.html">Executable size</a></span></dt><dt><span class="sect1"><a href="ch04s03.html">Supported compilers</a></span></dt><dt><span class="sect1"><a href="ch04s04.html"> Limitations </a></span></dt><dt><span class="sect1"><a href="ch04s05.html"> Compilers corner </a></span></dt></dl></dd><dt><span class="chapter"><a href="ch05.html">5. Questions & Answers, tips</a></span></dt><dt><span class="chapter"><a href="ch06.html">6. Internals</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch06.html#d0e3010">Backend: Run To Completion</a></span></dt><dt><span class="sect1"><a href="ch06s02.html">Frontend / Backend
|
||||
interface</a></span></dt><dt><span class="sect1"><a href="ch06s03.html"> Generated state ids </a></span></dt><dt><span class="sect1"><a href="ch06s04.html">Metaprogramming tools</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch07.html">7. Acknowledgements</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch07.html#d0e3305">MSM v2</a></span></dt><dt><span class="sect1"><a href="ch07s02.html"> MSM v1</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch08.html">8. Version history</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch08.html#d0e3352">From V2.24 to V2.25 (Boost 1.54)</a></span></dt><dt><span class="sect1"><a href="ch08s02.html">From V2.23 to V2.24 (Boost 1.51)</a></span></dt><dt><span class="sect1"><a href="ch08s03.html">From V2.22 to V2.23 (Boost 1.50)</a></span></dt><dt><span class="sect1"><a href="ch08s04.html">From V2.21 to V2.22 (Boost 1.48)</a></span></dt><dt><span class="sect1"><a href="ch08s05.html">From V2.20 to V2.21 (Boost 1.47)</a></span></dt><dt><span class="sect1"><a href="ch08s06.html">From V2.12 to V2.20 (Boost 1.46)</a></span></dt><dt><span class="sect1"><a href="ch08s07.html">From V2.10 to V2.12 (Boost 1.45)</a></span></dt><dt><span class="sect1"><a href="ch08s08.html">From V2.0 to V2.12 (Boost 1.44)</a></span></dt></dl></dd></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="pr01.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Preface </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 1. Founding idea</td></tr></table></div></body></html>
|
||||
@@ -1,4 +1,4 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Part II. Reference</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="index.html" title="Meta State Machine (MSM)"><link rel="prev" href="ch08s07.html" title="From V2.0 to V2.12 (Boost 1.44)"><link rel="next" href="ch09.html" title="Chapter 9. External references to MSM"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Part II. Reference</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s07.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch09.html">Next</a></td></tr></table><hr></div><div class="part" title="Part II. Reference"><div class="titlepage"><div><div><h1 class="title"><a name="d0e3621"></a>Part II. <span class="command"><strong><a name="Reference-begin"></a></strong></span>Reference</h1></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="ch09.html">9. External references to MSM</a></span></dt><dt><span class="chapter"><a href="ch10.html">10. eUML operators and basic helpers</a></span></dt><dt><span class="chapter"><a href="ch11.html">11.
|
||||
Functional programming </a></span></dt><dt><span class="refentrytitle"><a href="re01.html">Common headers</a></span><span class="refpurpose"> — The common types used by front- and back-ends</span></dt><dt><span class="refentrytitle"><a href="re02.html">Back-end</a></span><span class="refpurpose"> — The back-end headers</span></dt><dt><span class="refentrytitle"><a href="re03.html">Front-end</a></span><span class="refpurpose"> — The front-end headers</span></dt></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s07.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch09.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.0 to V2.12 (Boost 1.44) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 9. External references to MSM</td></tr></table></div></body></html>
|
||||
<title>Part II. Reference</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="index.html" title="Meta State Machine (MSM)"><link rel="prev" href="ch08s08.html" title="From V2.0 to V2.12 (Boost 1.44)"><link rel="next" href="ch09.html" title="Chapter 9. External references to MSM"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Part II. Reference</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch08s08.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch09.html">Next</a></td></tr></table><hr></div><div class="part" title="Part II. Reference"><div class="titlepage"><div><div><h1 class="title"><a name="d0e3645"></a>Part II. <span class="command"><strong><a name="Reference-begin"></a></strong></span>Reference</h1></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="ch09.html">9. External references to MSM</a></span></dt><dt><span class="chapter"><a href="ch10.html">10. eUML operators and basic helpers</a></span></dt><dt><span class="chapter"><a href="ch11.html">11.
|
||||
Functional programming </a></span></dt><dt><span class="refentrytitle"><a href="re01.html">Common headers</a></span><span class="refpurpose"> — The common types used by front- and back-ends</span></dt><dt><span class="refentrytitle"><a href="re02.html">Back-end</a></span><span class="refpurpose"> — The back-end headers</span></dt><dt><span class="refentrytitle"><a href="re03.html">Front-end</a></span><span class="refpurpose"> — The front-end headers</span></dt></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch08s08.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch09.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">From V2.0 to V2.12 (Boost 1.44) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 9. External references to MSM</td></tr></table></div></body></html>
|
||||
@@ -1,8 +1,8 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Common headers</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="ch11.html" title="Chapter 11. Functional programming"><link rel="next" href="re02.html" title="Back-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Common headers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch11.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> <a accesskey="n" href="re02.html">Next</a></td></tr></table><hr></div><div class="refentry" title="Common headers"><a name="d0e5100"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>Common headers — The common types used by front- and back-ends</p></div><div class="refsect1" title="msm/common.hpp"><a name="d0e5106"></a><h2>msm/common.hpp</h2><p>This header provides one type, wrap, which is an empty type whose only reason
|
||||
<title>Common headers</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="ch11.html" title="Chapter 11. Functional programming"><link rel="next" href="re02.html" title="Back-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Common headers</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch11.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> <a accesskey="n" href="re02.html">Next</a></td></tr></table><hr></div><div class="refentry" title="Common headers"><a name="d0e5124"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>Common headers — The common types used by front- and back-ends</p></div><div class="refsect1" title="msm/common.hpp"><a name="d0e5130"></a><h2>msm/common.hpp</h2><p>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.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class Dummy> wrap{};</span></span> {<br>}</pre></div><div class="refsect1" title="msm/row_tags.hpp"><a name="d0e5115"></a><h2>msm/row_tags.hpp</h2><p>This header contains the row type tags which front-ends can support partially
|
||||
as shown in the Metaprogramming book, chapter 9.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class Dummy> wrap{};</span></span> {<br>}</pre></div><div class="refsect1" title="msm/row_tags.hpp"><a name="d0e5139"></a><h2>msm/row_tags.hpp</h2><p>This header contains the row type tags which front-ends can support partially
|
||||
or totally. Please see the <span class="command"><strong><a class="command" href="ch06s02.html#internals-front-back-interface">Internals</a></strong></span> section for a description of the different
|
||||
types.</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch11.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="pt02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="re02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 11.
|
||||
Functional programming </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Back-end</td></tr></table></div></body></html>
|
||||
@@ -1,79 +1,79 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Back-end</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="re01.html" title="Common headers"><link rel="next" href="re03.html" title="Front-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Back-end</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="re01.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> <a accesskey="n" href="re03.html">Next</a></td></tr></table><hr></div><div class="refentry" title="Back-end"><a name="d0e5123"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>Back-end — The back-end headers</p></div><div class="refsect1" title="msm/back/state_machine.hpp"><a name="d0e5129"></a><h2>msm/back/state_machine.hpp</h2><p> This header provides one type, state_machine, MSM's state machine engine
|
||||
<title>Back-end</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="re01.html" title="Common headers"><link rel="next" href="re03.html" title="Front-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Back-end</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="re01.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> <a accesskey="n" href="re03.html">Next</a></td></tr></table><hr></div><div class="refentry" title="Back-end"><a name="d0e5147"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>Back-end — The back-end headers</p></div><div class="refsect1" title="msm/back/state_machine.hpp"><a name="d0e5153"></a><h2>msm/back/state_machine.hpp</h2><p> This header provides one type, state_machine, MSM's state machine engine
|
||||
implementation.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class Derived,class HistoryPolicy=NoHistory,class
|
||||
CompilePolicy=favor_runtime_speed> state_machine</span></span> {<br>}</pre><div class="refsect2" title="Template arguments"><a name="d0e5138"></a><h3> Template arguments </h3><div class="refsect3" title="Derived"><a name="d0e5141"></a><h4> Derived </h4><p>The name of the front-end state machine definition. All three
|
||||
front-ends are possible.</p></div><div class="refsect3" title="HistoryPolicy"><a name="d0e5146"></a><h4> HistoryPolicy </h4><p>The desired history. This can be: AlwaysHistory, NoHistory,
|
||||
ShallowHistory. Default is NoHistory.</p></div><div class="refsect3" title="CompilePolicy"><a name="d0e5151"></a><h4> CompilePolicy </h4><p>The trade-off performance / compile-time. There are two predefined
|
||||
CompilePolicy=favor_runtime_speed> state_machine</span></span> {<br>}</pre><div class="refsect2" title="Template arguments"><a name="d0e5162"></a><h3> Template arguments </h3><div class="refsect3" title="Derived"><a name="d0e5165"></a><h4> Derived </h4><p>The name of the front-end state machine definition. All three
|
||||
front-ends are possible.</p></div><div class="refsect3" title="HistoryPolicy"><a name="d0e5170"></a><h4> HistoryPolicy </h4><p>The desired history. This can be: AlwaysHistory, NoHistory,
|
||||
ShallowHistory. Default is NoHistory.</p></div><div class="refsect3" title="CompilePolicy"><a name="d0e5175"></a><h4> CompilePolicy </h4><p>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 <a class="link" href="ch03s05.html#backend-tradeof-rt-ct">the backend</a>.</p></div></div><div class="refsect2" title="methods"><a name="d0e5159"></a><h3> methods </h3><div class="refsect3" title="start"><a name="d0e5162"></a><h4>start</h4><p> The start methods must be called before any call to process_event. It
|
||||
favor_runtime_speed, best performance, longer compile-time. See <a class="link" href="ch03s05.html#backend-tradeof-rt-ct">the backend</a>.</p></div></div><div class="refsect2" title="methods"><a name="d0e5183"></a><h3> methods </h3><div class="refsect3" title="start"><a name="d0e5186"></a><h4>start</h4><p> 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 <a class="link" href="ch03s05.html#backend-start">backend</a>.</p><code class="methodsynopsis"><span class="methodname">void start</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="process_event"><a name="d0e5175"></a><h4>process_event</h4><p>The event processing method implements the double-dispatch. Each call
|
||||
choose when a state machine can start. See <a class="link" href="ch03s05.html#backend-start">backend</a>.</p><code class="methodsynopsis"><span class="methodname">void start</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="process_event"><a name="d0e5199"></a><h4>process_event</h4><p>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.</p><code class="methodsynopsis"><span class="methodname">template <class Event> HandledEnum
|
||||
process_event</span>(<span class="methodparam">Event const&</span>);</code></div><div class="refsect3" title="current_state"><a name="d0e5186"></a><h4>current_state</h4><p>Returns the ids of currently active states. You will typically need it
|
||||
only for debugging or logging purposes.</p><code class="methodsynopsis"><span class="methodname">const int* current_state const</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="get_state_by_id"><a name="d0e5196"></a><h4>get_state_by_id</h4><p>Returns the state whose id is given. As all states of a concrete state
|
||||
process_event</span>(<span class="methodparam">Event const&</span>);</code></div><div class="refsect3" title="current_state"><a name="d0e5210"></a><h4>current_state</h4><p>Returns the ids of currently active states. You will typically need it
|
||||
only for debugging or logging purposes.</p><code class="methodsynopsis"><span class="methodname">const int* current_state const</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="get_state_by_id"><a name="d0e5220"></a><h4>get_state_by_id</h4><p>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.</p><code class="methodsynopsis"><span class="methodname">const BaseState* get_state_by_id const</span>(<span class="methodparam">int id</span>);</code></div><div class="refsect3" title="is_contained"><a name="d0e5207"></a><h4>is_contained</h4><p>Helper returning true if the state machine is contained as a
|
||||
submachine of another state machine.</p><code class="methodsynopsis"><span class="methodname">bool is_contained const</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="get_state"><a name="d0e5217"></a><h4>get_state</h4><p>Returns the required state of the state machine as a pointer. A
|
||||
the id corresponds to no state, a null pointer is returned.</p><code class="methodsynopsis"><span class="methodname">const BaseState* get_state_by_id const</span>(<span class="methodparam">int id</span>);</code></div><div class="refsect3" title="is_contained"><a name="d0e5231"></a><h4>is_contained</h4><p>Helper returning true if the state machine is contained as a
|
||||
submachine of another state machine.</p><code class="methodsynopsis"><span class="methodname">bool is_contained const</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="get_state"><a name="d0e5241"></a><h4>get_state</h4><p>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.</p><code class="methodsynopsis"><span class="methodname">template <class State> State* get_state</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="get_state"><a name="d0e5227"></a><h4>get_state</h4><p>Returns the required state of the state machine as a reference. A
|
||||
machine.</p><code class="methodsynopsis"><span class="methodname">template <class State> State* get_state</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="get_state"><a name="d0e5251"></a><h4>get_state</h4><p>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.</p><code class="methodsynopsis"><span class="methodname">template <class State> State& get_state</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="is_flag_active"><a name="d0e5237"></a><h4>is_flag_active</h4><p>Returns true if the given flag is currently active. A flag is active
|
||||
machine.</p><code class="methodsynopsis"><span class="methodname">template <class State> State& get_state</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="is_flag_active"><a name="d0e5261"></a><h4>is_flag_active</h4><p>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 <span class="underline">all</span>
|
||||
regions (using AND as BinaryOp)</p><code class="methodsynopsis"><span class="methodname">template <class Flag,class BinaryOp> bool
|
||||
is_flag_active</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="is_flag_active"><a name="d0e5250"></a><h4>is_flag_active</h4><p>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.</p><code class="methodsynopsis"><span class="methodname">template <class Flag> bool is_flag_active</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="visit_current_states"><a name="d0e5260"></a><h4>visit_current_states</h4><p>Visits all active states and their substates. A state is visited using
|
||||
is_flag_active</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="is_flag_active"><a name="d0e5274"></a><h4>is_flag_active</h4><p>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.</p><code class="methodsynopsis"><span class="methodname">template <class Flag> bool is_flag_active</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="visit_current_states"><a name="d0e5284"></a><h4>visit_current_states</h4><p>Visits all active states and their substates. A state is visited using
|
||||
the <code class="code">accept</code> method without argument. The base class of all
|
||||
states must provide an <code class="code">accept_sig</code> type.</p><code class="methodsynopsis"><span class="methodname">void visit_current_states</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="visit_current_states"><a name="d0e5276"></a><h4>visit_current_states</h4><p>Visits all active states and their substates. A state is visited using
|
||||
states must provide an <code class="code">accept_sig</code> type.</p><code class="methodsynopsis"><span class="methodname">void visit_current_states</span>(<span class="methodparam"></span>);</code></div><div class="refsect3" title="visit_current_states"><a name="d0e5300"></a><h4>visit_current_states</h4><p>Visits all active states and their substates. A state is visited using
|
||||
the <code class="code">accept</code> method with arguments. The base class of all
|
||||
states must provide an <code class="code">accept_sig</code> type defining the
|
||||
signature and thus the number and type of the parameters.</p><code class="methodsynopsis"><span class="methodname">void visit_current_states</span>(<span class="methodparam">any-type param1, any-type param2,...</span>);</code></div><div class="refsect3" title="defer_event"><a name="d0e5293"></a><h4>defer_event</h4><p> Defers the provided event. This method can be called only if at least
|
||||
signature and thus the number and type of the parameters.</p><code class="methodsynopsis"><span class="methodname">void visit_current_states</span>(<span class="methodparam">any-type param1, any-type param2,...</span>);</code></div><div class="refsect3" title="defer_event"><a name="d0e5317"></a><h4>defer_event</h4><p> 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 class="code">activate_deferred_events</code>(see <a class="link" href="examples/Orthogonal-deferred2.cpp" target="_top">example</a>) type
|
||||
either directly or using the deferred_events configuration of eUML
|
||||
(<code class="code">configure_ << deferred_events</code>)</p><code class="methodsynopsis"><span class="methodname">template <class Event> void defer_event</span>(<span class="methodparam">Event const&</span>);</code></div></div><div class="refsect2" title="Types"><a name="d0e5313"></a><h3>Types</h3><div class="refsect3" title="nr_regions"><a name="d0e5316"></a><h4>nr_regions </h4><p>The number of orthogonal regions contained in the state machine</p></div><div class="refsect3" title="entry_pt"><a name="d0e5321"></a><h4>entry_pt</h4><p>This nested type provides the necessary typedef for entry point
|
||||
(<code class="code">configure_ << deferred_events</code>)</p><code class="methodsynopsis"><span class="methodname">template <class Event> void defer_event</span>(<span class="methodparam">Event const&</span>);</code></div></div><div class="refsect2" title="Types"><a name="d0e5337"></a><h3>Types</h3><div class="refsect3" title="nr_regions"><a name="d0e5340"></a><h4>nr_regions </h4><p>The number of orthogonal regions contained in the state machine</p></div><div class="refsect3" title="entry_pt"><a name="d0e5345"></a><h4>entry_pt</h4><p>This nested type provides the necessary typedef for entry point
|
||||
pseudostates.
|
||||
<code class="code">state_machine<...>::entry_pt<state_name></code> is a
|
||||
transition's valid target inside the containing state machine's
|
||||
transition table.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">entry_pt</span></span> {<br>}</pre></div><div class="refsect3" title="exit_pt"><a name="d0e5333"></a><h4>exit_pt</h4><p>This nested type provides the necessary typedef for exit point
|
||||
transition table.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">entry_pt</span></span> {<br>}</pre></div><div class="refsect3" title="exit_pt"><a name="d0e5357"></a><h4>exit_pt</h4><p>This nested type provides the necessary typedef for exit point
|
||||
pseudostates. <code class="code">state_machine<...>::exit_pt<state_name></code>
|
||||
is a transition's valid source inside the containing state machine's
|
||||
transition table.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">exit_pt</span></span> {<br>}</pre></div><div class="refsect3" title="direct"><a name="d0e5345"></a><h4>direct</h4><p>This nested type provides the necessary typedef for an explicit entry
|
||||
transition table.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">exit_pt</span></span> {<br>}</pre></div><div class="refsect3" title="direct"><a name="d0e5369"></a><h4>direct</h4><p>This nested type provides the necessary typedef for an explicit entry
|
||||
inside a submachine.
|
||||
<code class="code">state_machine<...>::direct<state_name></code> is a
|
||||
transition's valid target inside the containing state machine's
|
||||
transition table.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">direct</span></span> {<br>}</pre></div><div class="refsect3" title="stt"><a name="d0e5357"></a><h4>stt</h4><p>Calling state_machine<frontend>::stt returns a mpl::vector
|
||||
transition table.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">direct</span></span> {<br>}</pre></div><div class="refsect3" title="stt"><a name="d0e5381"></a><h4>stt</h4><p>Calling state_machine<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.</p></div></div></div><div class="refsect1" title="args.hpp"><a name="d0e5362"></a><h2>args.hpp</h2><p>This header provides one type, args. which provides the necessary types for a
|
||||
visitor implementation.</p></div><div class="refsect1" title="msm/back/history_policies.hpp"><a name="d0e5367"></a><h2><span class="command"><strong><a name="history-interface"></a></strong></span>msm/back/history_policies.hpp</h2><p>This header provides the out-of-the-box history policies supported by MSM.
|
||||
There are 3 such policies.</p><div class="refsect2" title="Every history policy must implement the following methods:"><a name="d0e5373"></a><h3>Every history policy must implement the following methods: </h3><div class="refsect3" title="set_initial_states"><a name="d0e5376"></a><h4> set_initial_states </h4><p> This method is called by msm::back::state_machine when constructed.
|
||||
be used with generate_state_set or generate_event_set.</p></div></div></div><div class="refsect1" title="args.hpp"><a name="d0e5386"></a><h2>args.hpp</h2><p>This header provides one type, args. which provides the necessary types for a
|
||||
visitor implementation.</p></div><div class="refsect1" title="msm/back/history_policies.hpp"><a name="d0e5391"></a><h2><span class="command"><strong><a name="history-interface"></a></strong></span>msm/back/history_policies.hpp</h2><p>This header provides the out-of-the-box history policies supported by MSM.
|
||||
There are 3 such policies.</p><div class="refsect2" title="Every history policy must implement the following methods:"><a name="d0e5397"></a><h3>Every history policy must implement the following methods: </h3><div class="refsect3" title="set_initial_states"><a name="d0e5400"></a><h4> set_initial_states </h4><p> 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).</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">void set_initial_states(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>
|
||||
<code>(</code>int* const<code>)</code>
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect3" title="history_exit"><a name="d0e5390"></a><h4> history_exit </h4><p>This method is called by msm::back::state_machine when the submachine
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect3" title="history_exit"><a name="d0e5414"></a><h4> history_exit </h4><p>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).</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">void history_exit(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>
|
||||
<code>(</code>int* const<code>)</code>
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect3" title="history_entry"><a name="d0e5404"></a><h4> history_entry </h4><p>This method is called by msm::back::state_machine when the submachine
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect3" title="history_entry"><a name="d0e5428"></a><h4> history_entry </h4><p>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.</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class Event> int* const history_exit(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>
|
||||
<code>(</code>Event const&<code>)</code>
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div></div><div class="refsect2" title="Out-of-the-box policies:"><a name="d0e5418"></a><h3>Out-of-the-box policies: </h3><div class="refsect3" title="NoHistory"><a name="d0e5421"></a><h4>NoHistory</h4><p>This policy is the default used by state_machine. No active state of a
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div></div><div class="refsect2" title="Out-of-the-box policies:"><a name="d0e5442"></a><h3>Out-of-the-box policies: </h3><div class="refsect3" title="NoHistory"><a name="d0e5445"></a><h4>NoHistory</h4><p>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. </p></div><div class="refsect3" title="AlwaysHistory"><a name="d0e5426"></a><h4>AlwaysHistory</h4><p>This policy is a non-UML-standard extension. The active state(s) of a
|
||||
the initial state(s) are activated. </p></div><div class="refsect3" title="AlwaysHistory"><a name="d0e5450"></a><h4>AlwaysHistory</h4><p>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. </p></div><div class="refsect3" title="ShallowHistory"><a name="d0e5431"></a><h4>ShallowHistory</h4><p>This policy activates the active state(s) of a submachine if the event
|
||||
is found in the policy's event list. </p></div></div></div><div class="refsect1" title="msm/back/default_compile_policy.hpp"><a name="d0e5436"></a><h2>msm/back/default_compile_policy.hpp</h2><p>This header contains the definition of favor_runtime_speed. This policy has
|
||||
submachine. </p></div><div class="refsect3" title="ShallowHistory"><a name="d0e5455"></a><h4>ShallowHistory</h4><p>This policy activates the active state(s) of a submachine if the event
|
||||
is found in the policy's event list. </p></div></div></div><div class="refsect1" title="msm/back/default_compile_policy.hpp"><a name="d0e5460"></a><h2>msm/back/default_compile_policy.hpp</h2><p>This header contains the definition of favor_runtime_speed. This policy has
|
||||
two settings:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Submachines dispatch faster because their transitions are added
|
||||
into their containing machine's transition table instead of simply
|
||||
forwarding events.</p></li><li class="listitem"><p>It solves transition conflicts at compile-time</p></li></ul></div></div><div class="refsect1" title="msm/back/favor_compile_time.hpp"><a name="d0e5448"></a><h2>msm/back/favor_compile_time.hpp</h2><p>This header contains the definition of favor_compile_time. This policy has two settings:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Submachines dispatch is slower because all events, even those with
|
||||
forwarding events.</p></li><li class="listitem"><p>It solves transition conflicts at compile-time</p></li></ul></div></div><div class="refsect1" title="msm/back/favor_compile_time.hpp"><a name="d0e5472"></a><h2>msm/back/favor_compile_time.hpp</h2><p>This header contains the definition of favor_compile_time. This policy has two settings:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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.</p></li><li class="listitem"><p>It solves transition conflicts at run-time.</p></li></ul></div></div><div class="refsect1" title="msm/back/metafunctions.hpp"><a name="d0e5460"></a><h2>msm/back/metafunctions.hpp </h2><p>This header contains metafunctions for use by the library. Three metafunctions
|
||||
reduces compile-time.</p></li><li class="listitem"><p>It solves transition conflicts at run-time.</p></li></ul></div></div><div class="refsect1" title="msm/back/metafunctions.hpp"><a name="d0e5484"></a><h2>msm/back/metafunctions.hpp </h2><p>This header contains metafunctions for use by the library. Three metafunctions
|
||||
can be useful for the user:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">generate_state_set< stt ></code>: generates the list of
|
||||
all states referenced by the transition table stt. If stt is a
|
||||
recursive table (generated by
|
||||
@@ -86,10 +86,10 @@
|
||||
finds recursively all events of the submachines. A non-recursive
|
||||
table can be obtained with some_backend_fsm::stt.</p></li><li class="listitem"><p><code class="code">recursive_get_transition_table<fsm></code>: recursively
|
||||
extends the transition table of the state machine fsm with tables
|
||||
from the submachines.</p></li></ul></div></div><div class="refsect1" title="msm/back/tools.hpp"><a name="d0e5487"></a><h2>msm/back/tools.hpp </h2><p> This header contains a few metaprogramming tools to get some information out
|
||||
of a state machine.</p><div class="refsect2" title="fill_state_names"><a name="d0e5492"></a><h3>fill_state_names </h3><div class="refsect3" title="attributes"><a name="d0e5495"></a><h4>attributes </h4><p> fill_state_names has for attribute:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">char const** m_names</code>: an already allocated
|
||||
from the submachines.</p></li></ul></div></div><div class="refsect1" title="msm/back/tools.hpp"><a name="d0e5511"></a><h2>msm/back/tools.hpp </h2><p> This header contains a few metaprogramming tools to get some information out
|
||||
of a state machine.</p><div class="refsect2" title="fill_state_names"><a name="d0e5516"></a><h3>fill_state_names </h3><div class="refsect3" title="attributes"><a name="d0e5519"></a><h4>attributes </h4><p> fill_state_names has for attribute:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="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.</p></li></ul></div></div><div class="refsect3" title="constructor"><a name="d0e5506"></a><h4>constructor </h4><code class="constructorsynopsis"><span class="methodparam">char const** names_to_fill</span>(<span class="methodparam">char const** names_to_fill</span>);</code></div><div class="refsect3" title="usage"><a name="d0e5513"></a><h4>usage</h4><p> fill_state_names is made for use in a mpl::for_each iterating on a
|
||||
state machine states will be witten.</p></li></ul></div></div><div class="refsect3" title="constructor"><a name="d0e5530"></a><h4>constructor </h4><code class="constructorsynopsis"><span class="methodparam">char const** names_to_fill</span>(<span class="methodparam">char const** names_to_fill</span>);</code></div><div class="refsect3" title="usage"><a name="d0e5537"></a><h4>usage</h4><p> 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:</p><pre class="programlisting">typedef some_fsm::stt Stt;
|
||||
typedef msm::back::generate_state_set<Stt>::type all_states; //states
|
||||
@@ -104,10 +104,17 @@ for (unsigned int i=0;i<some_fsm::nr_regions::value;++i)
|
||||
std::cout << " -> "
|
||||
<< state_names[my_fsm_instance.current_state()[i]]
|
||||
<< std::endl;
|
||||
}</pre></div></div><div class="refsect2" title="get_state_name"><a name="d0e5520"></a><h3>get_state_name </h3><div class="refsect3" title="attributes"><a name="d0e5523"></a><h4> attributes </h4><p>get_state_name has for attributes:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>std::string& m_name: the return value of the
|
||||
iteration</p></li><li class="listitem"><p>int m_state_id: the searched state's id</p></li></ul></div></div><div class="refsect3" title="constructor"><a name="d0e5535"></a><h4>constructor</h4><p>The constructor takes as argument a reference to the string to fill
|
||||
with the state name and the id which must be searched.</p><code class="constructorsynopsis"><span class="methodparam">string& name_to_fill,int state_id</span>(<span class="methodparam">string& name_to_fill,int state_id</span>);</code></div><div class="refsect3" title="usage"><a name="d0e5544"></a><h4> usage</h4><p>This type is made for the same search as in the previous example,
|
||||
}</pre></div></div><div class="refsect2" title="get_state_name"><a name="d0e5544"></a><h3>get_state_name </h3><div class="refsect3" title="attributes"><a name="d0e5547"></a><h4> attributes </h4><p>get_state_name has for attributes:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>std::string& m_name: the return value of the
|
||||
iteration</p></li><li class="listitem"><p>int m_state_id: the searched state's id</p></li></ul></div></div><div class="refsect3" title="constructor"><a name="d0e5559"></a><h4>constructor</h4><p>The constructor takes as argument a reference to the string to fill
|
||||
with the state name and the id which must be searched.</p><code class="constructorsynopsis"><span class="methodparam">string& name_to_fill,int state_id</span>(<span class="methodparam">string& name_to_fill,int state_id</span>);</code></div><div class="refsect3" title="usage"><a name="d0e5568"></a><h4> usage</h4><p>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.</p></div></div><div class="refsect2" title="display_type"><a name="d0e5549"></a><h3>display_type </h3><div class="refsect3" title="attributes"><a name="d0e5552"></a><h4> attributes </h4><p>none</p></div><div class="refsect3" title="usage"><a name="d0e5557"></a><h4> usage</h4><p>Reusing the state list from the previous example, we can output all
|
||||
state name reference has been set.</p><pre class="programlisting">// we need a fsm's table
|
||||
typedef player::stt Stt;
|
||||
typedef msm::back::generate_state_set<Stt>::type all_states; //all states
|
||||
std::string name_of_open; // id of Open is 1
|
||||
// fill name_of_open for state of id 1
|
||||
boost::mpl::for_each<all_states,boost::msm::wrap<mpl::placeholders::_1> >
|
||||
(msm::back::get_state_name<Stt>(name_of_open,1));
|
||||
std::cout << "typeid-generated name Open is: " << name_of_open << std::endl;</pre></div></div><div class="refsect2" title="display_type"><a name="d0e5575"></a><h3>display_type </h3><div class="refsect3" title="attributes"><a name="d0e5578"></a><h4> attributes </h4><p>none</p></div><div class="refsect3" title="usage"><a name="d0e5583"></a><h4> usage</h4><p>Reusing the state list from the previous example, we can output all
|
||||
state names:</p><p><code class="code">mpl::for_each<all_states,boost::msm::wrap<mpl::placeholders::_1>
|
||||
>(msm::back::display_type ());</code></p></div></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="re01.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="pt02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="re03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Common headers </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Front-end</td></tr></table></div></body></html>
|
||||
@@ -1,11 +1,11 @@
|
||||
<html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Front-end</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="re02.html" title="Back-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Front-end</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="re02.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> </td></tr></table><hr></div><div class="refentry" title="Front-end"><a name="d0e5565"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>Front-end — The front-end headers</p></div><div class="refsect1" title="msm/front/common_states.hpp"><a name="d0e5571"></a><h2>msm/front/common_states.hpp</h2><p>This header contains the predefined types to serve as base for states or state machines:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>default_base_state: non-polymorphic empty type.</p></li><li class="listitem"><p>polymorphic_state: type with a virtual destructor, which makes all
|
||||
states polymorphic.</p></li></ul></div></div><div class="refsect1" title="msm/front/completion_event.hpp"><a name="d0e5583"></a><h2>msm/front/completion_event.hpp</h2><p>This header contains one type, <code class="code">none</code>. This type has several
|
||||
<title>Front-end</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM)"><link rel="up" href="pt02.html" title="Part II. Reference"><link rel="prev" href="re02.html" title="Back-end"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Front-end</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="re02.html">Prev</a> </td><th width="60%" align="center">Part II. Reference</th><td width="20%" align="right"> </td></tr></table><hr></div><div class="refentry" title="Front-end"><a name="d0e5591"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>Front-end — The front-end headers</p></div><div class="refsect1" title="msm/front/common_states.hpp"><a name="d0e5597"></a><h2>msm/front/common_states.hpp</h2><p>This header contains the predefined types to serve as base for states or state machines:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>default_base_state: non-polymorphic empty type.</p></li><li class="listitem"><p>polymorphic_state: type with a virtual destructor, which makes all
|
||||
states polymorphic.</p></li></ul></div></div><div class="refsect1" title="msm/front/completion_event.hpp"><a name="d0e5609"></a><h2>msm/front/completion_event.hpp</h2><p>This header contains one type, <code class="code">none</code>. This type has several
|
||||
meanings inside a transition table:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>as action or guard: that there is no action or guard</p></li><li class="listitem"><p>as target state: that the transition is an internal
|
||||
transition</p></li><li class="listitem"><p>as event: the transition is an anonymous (completion)
|
||||
transition</p></li></ul></div></div><div class="refsect1" title="msm/front/functor_row.hpp"><a name="d0e5601"></a><h2>msm/front/functor_row.hpp</h2><p>This header implements the functor front-end's transitions and helpers.</p><div class="refsect2" title="Row"><a name="d0e5606"></a><h3>Row</h3><div class="refsect3" title="definition"><a name="d0e5609"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class Source,class Event,class Target,class
|
||||
Action,class Guard> Row</span></span> {<br>}</pre></div><div class="refsect3" title="tags"><a name="d0e5616"></a><h4>tags</h4><p>row_type_tag is defined differently for every specialization:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>all 5 template parameters means a normal transition with
|
||||
transition</p></li></ul></div></div><div class="refsect1" title="msm/front/functor_row.hpp"><a name="d0e5627"></a><h2>msm/front/functor_row.hpp</h2><p>This header implements the functor front-end's transitions and helpers.</p><div class="refsect2" title="Row"><a name="d0e5632"></a><h3>Row</h3><div class="refsect3" title="definition"><a name="d0e5635"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class Source,class Event,class Target,class
|
||||
Action,class Guard> Row</span></span> {<br>}</pre></div><div class="refsect3" title="tags"><a name="d0e5642"></a><h4>tags</h4><p>row_type_tag is defined differently for every specialization:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>all 5 template parameters means a normal transition with
|
||||
action and guard: <code class="code">typedef row_tag
|
||||
row_type_tag;</code></p></li><li class="listitem"><p>Row<Source,Event,Target,none,none> a normal transition
|
||||
without action or guard: <code class="code">typedef _row_tag
|
||||
@@ -21,7 +21,7 @@
|
||||
transition with action and guard: <code class="code">typedef irow_tag
|
||||
row_type_tag;</code></p></li><li class="listitem"><p>Row<Source,Event,none,none,none> an internal transition
|
||||
without action or guard: <code class="code">typedef _irow_tag
|
||||
row_type_tag;</code></p></li></ul></div></div><div class="refsect3" title="methods"><a name="d0e5662"></a><h4>methods</h4><p>Like any other front-end, Row implements the two necessary static
|
||||
row_type_tag;</code></p></li></ul></div></div><div class="refsect3" title="methods"><a name="d0e5688"></a><h4>methods</h4><p>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
|
||||
@@ -33,8 +33,8 @@
|
||||
class AllStates> static bool guard_call(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>
|
||||
<code>(</code>Fsm& fsm,Event const&
|
||||
evt,SourceState&,TargetState,AllStates&<code>)</code>
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div></div><div class="refsect2" title="Internal"><a name="d0e5685"></a><h3>Internal</h3><div class="refsect3" title="definition"><a name="d0e5688"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class Event,class Action,class Guard>
|
||||
Internal</span></span> {<br>}</pre></div><div class="refsect3" title="tags"><a name="d0e5695"></a><h4>tags</h4><p>row_type_tag is defined differently for every specialization:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>all 3 template parameters means an internal transition
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div></div><div class="refsect2" title="Internal"><a name="d0e5711"></a><h3>Internal</h3><div class="refsect3" title="definition"><a name="d0e5714"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class Event,class Action,class Guard>
|
||||
Internal</span></span> {<br>}</pre></div><div class="refsect3" title="tags"><a name="d0e5721"></a><h4>tags</h4><p>row_type_tag is defined differently for every specialization:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>all 3 template parameters means an internal transition
|
||||
with action and guard: <code class="code">typedef sm_i_row_tag
|
||||
row_type_tag;</code></p></li><li class="listitem"><p>Internal<Event,none,none> an internal transition
|
||||
without action or guard: <code class="code">typedef sm__i_row_tag
|
||||
@@ -42,7 +42,7 @@
|
||||
without guard: <code class="code">typedef sm_a_i_row_tag
|
||||
row_type_tag;</code></p></li><li class="listitem"><p>Internal<Event,none,Guard> an internal transition
|
||||
without action: <code class="code">typedef sm_g_i_row_tag
|
||||
row_type_tag;</code></p></li></ul></div></div><div class="refsect3" title="methods"><a name="d0e5721"></a><h4>methods</h4><p>Like any other front-end, Internal implements the two necessary static
|
||||
row_type_tag;</code></p></li></ul></div></div><div class="refsect3" title="methods"><a name="d0e5747"></a><h4>methods</h4><p>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
|
||||
@@ -54,9 +54,9 @@
|
||||
class AllStates> static bool guard_call(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>
|
||||
<code>(</code>Fsm& fsm,Event const&
|
||||
evt,SourceState&,TargetState,AllStates&<code>)</code>
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div></div><div class="refsect2" title="ActionSequence_"><a name="d0e5744"></a><h3>ActionSequence_</h3><p>This functor calls every element of the template Sequence (which are also
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div></div><div class="refsect2" title="ActionSequence_"><a name="d0e5770"></a><h3>ActionSequence_</h3><p>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,...).</p><div class="refsect3" title="definition"><a name="d0e5749"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class Sequence> ActionSequence_</span></span> {<br>}</pre></div><div class="refsect3" title="methods"><a name="d0e5756"></a><h4>methods</h4><p>This helper functor is made for use in a transition table and in a
|
||||
eUML sequence grammar (action1,action2,...).</p><div class="refsect3" title="definition"><a name="d0e5775"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class Sequence> ActionSequence_</span></span> {<br>}</pre></div><div class="refsect3" title="methods"><a name="d0e5782"></a><h4>methods</h4><p>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:</p><p>
|
||||
</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class Evt,class Fsm,class
|
||||
@@ -65,13 +65,13 @@
|
||||
</p><p>
|
||||
</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class Evt,class Fsm,class State>
|
||||
operator()(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Evt const&, Fsm&, State&</code>;</div><div class="funcprototype-spacer"> </div></div><p>
|
||||
</p></div></div><div class="refsect2" title="Defer"><a name="d0e5779"></a><h3>Defer</h3><div class="refsect3" title="definition"><a name="d0e5782"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">Defer</span></span> {<br>}</pre></div><div class="refsect3" title="methods"><a name="d0e5789"></a><h4>methods</h4><p>This helper functor is made for use in a transition table and
|
||||
</p></div></div><div class="refsect2" title="Defer"><a name="d0e5805"></a><h3>Defer</h3><div class="refsect3" title="definition"><a name="d0e5808"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">Defer</span></span> {<br>}</pre></div><div class="refsect3" title="methods"><a name="d0e5815"></a><h4>methods</h4><p>This helper functor is made for use in a transition table and
|
||||
therefore implements an operator() with 4 arguments:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class Evt,class Fsm,class SourceState,class
|
||||
TargetState> operator()(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Evt const&, Fsm& , SourceState&,
|
||||
TargetState&</code>;</div><div class="funcprototype-spacer"> </div></div></div></div></div><div class="refsect1" title="msm/front/internal_row.hpp"><a name="d0e5800"></a><h2>msm/front/internal_row.hpp</h2><p>This header implements the internal transition rows for use inside an
|
||||
TargetState&</code>;</div><div class="funcprototype-spacer"> </div></div></div></div></div><div class="refsect1" title="msm/front/internal_row.hpp"><a name="d0e5826"></a><h2>msm/front/internal_row.hpp</h2><p>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.</p><div class="refsect2" title="methods"><a name="d0e5805"></a><h3>methods</h3><p>Like any other front-end, the following transition row types implements
|
||||
internal_transition_table.</p><div class="refsect2" title="methods"><a name="d0e5831"></a><h3>methods</h3><p>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
|
||||
@@ -83,30 +83,30 @@
|
||||
class AllStates> static bool guard_call(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>
|
||||
<code>(</code>Fsm& fsm,Event const&
|
||||
evt,SourceState&,TargetState,AllStates&<code>)</code>
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect2" title="a_internal"><a name="d0e5828"></a><h3>a_internal</h3><div class="refsect3" title="definition"><a name="d0e5831"></a><h4>definition</h4><p>This is an internal transition with an action called during the
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect2" title="a_internal"><a name="d0e5854"></a><h3>a_internal</h3><div class="refsect3" title="definition"><a name="d0e5857"></a><h4>definition</h4><p>This is an internal transition with an action called during the
|
||||
transition.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Event, class CalledForAction, void
|
||||
(CalledForAction::*action)(Event const&)>
|
||||
a_internal</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e5840"></a><h4>template parameters</h4><p>
|
||||
a_internal</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e5866"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the internal
|
||||
transition.</p></li><li class="listitem"><p>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.</p></li><li class="listitem"><p>action: a pointer to the method which CalledForAction
|
||||
provides.</p></li></ul></div><p>
|
||||
</p></div></div><div class="refsect2" title="g_internal"><a name="d0e5856"></a><h3>g_internal</h3><p>This is an internal transition with a guard called before the transition
|
||||
and allowing the transition if returning true.</p><div class="refsect3" title="definition"><a name="d0e5861"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Event, class CalledForGuard, bool
|
||||
</p></div></div><div class="refsect2" title="g_internal"><a name="d0e5882"></a><h3>g_internal</h3><p>This is an internal transition with a guard called before the transition
|
||||
and allowing the transition if returning true.</p><div class="refsect3" title="definition"><a name="d0e5887"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Event, class CalledForGuard, bool
|
||||
(CalledForGuard::*guard)(Event const&)>
|
||||
g_internal</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e5868"></a><h4>template parameters</h4><p>
|
||||
g_internal</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e5894"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the internal
|
||||
transition.</p></li><li class="listitem"><p>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.</p></li><li class="listitem"><p>guard: a pointer to the method which CalledForGuard
|
||||
provides.</p></li></ul></div><p>
|
||||
</p></div></div><div class="refsect2" title="internal"><a name="d0e5884"></a><h3>internal</h3><p>This is an internal transition with a guard called before the transition
|
||||
</p></div></div><div class="refsect2" title="internal"><a name="d0e5910"></a><h3>internal</h3><p>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.</p><div class="refsect3" title="definition"><a name="d0e5889"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Event, class CalledForAction, void
|
||||
called during the transition.</p><div class="refsect3" title="definition"><a name="d0e5915"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Event, class CalledForAction, void
|
||||
(CalledForAction::*action)(Event const&), class
|
||||
CalledForGuard, bool (CalledForGuard::*guard)(Event const&)>
|
||||
internal</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e5896"></a><h4>template parameters</h4><p>
|
||||
internal</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e5922"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the internal transition</p></li><li class="listitem"><p>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.</p></li><li class="listitem"><p>action: a pointer to the method which CalledForAction
|
||||
@@ -114,15 +114,15 @@
|
||||
called. It can be either a state of the containing state
|
||||
machine or the state machine itself.</p></li><li class="listitem"><p>guard: a pointer to the method which CalledForGuard
|
||||
provides.</p></li></ul></div><p>
|
||||
</p></div></div><div class="refsect2" title="_internal"><a name="d0e5918"></a><h3>_internal</h3><p>This is an internal transition without action or guard. This is equivalent
|
||||
to an explicit "ignore event".</p><div class="refsect3" title="definition"><a name="d0e5923"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Event > _internal</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e5930"></a><h4>template parameters</h4><p>
|
||||
</p></div></div><div class="refsect2" title="_internal"><a name="d0e5944"></a><h3>_internal</h3><p>This is an internal transition without action or guard. This is equivalent
|
||||
to an explicit "ignore event".</p><div class="refsect3" title="definition"><a name="d0e5949"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Event > _internal</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e5956"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the internal
|
||||
transition.</p></li></ul></div><p>
|
||||
</p></div></div></div><div class="refsect1" title="msm/front/row2.hpp"><a name="d0e5940"></a><h2>msm/front/row2.hpp</h2><p>This header contains the variants of row2, which are an extension of the
|
||||
</p></div></div></div><div class="refsect1" title="msm/front/row2.hpp"><a name="d0e5966"></a><h2>msm/front/row2.hpp</h2><p>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.</p><div class="refsect2" title="methods"><a name="d0e5945"></a><h3>methods</h3><p>Like any other front-end, the following transition row types implements
|
||||
through their irow2 variants.</p><div class="refsect2" title="methods"><a name="d0e5971"></a><h3>methods</h3><p>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
|
||||
@@ -134,28 +134,28 @@
|
||||
class AllStates> static bool guard_call(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>
|
||||
<code>(</code>Fsm& fsm,Event const&
|
||||
evt,SourceState&,TargetState,AllStates&<code>)</code>
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect2" title="_row2"><a name="d0e5968"></a><h3>_row2</h3><p>This is a transition without action or guard. The state machine only
|
||||
changes active state.</p><div class="refsect3" title="definition"><a name="d0e5973"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, class Target >
|
||||
_row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e5980"></a><h4>template parameters</h4><p>
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect2" title="_row2"><a name="d0e5994"></a><h3>_row2</h3><p>This is a transition without action or guard. The state machine only
|
||||
changes active state.</p><div class="refsect3" title="definition"><a name="d0e5999"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, class Target >
|
||||
_row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6006"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>Target: the target state of the transition.</p></li></ul></div><p>
|
||||
</p></div></div><div class="refsect2" title="a_row2"><a name="d0e5996"></a><h3>a_row2</h3><p>This is a transition with action and without guard.</p><div class="refsect3" title="definition"><a name="d0e6001"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, class Target,
|
||||
</p></div></div><div class="refsect2" title="a_row2"><a name="d0e6022"></a><h3>a_row2</h3><p>This is a transition with action and without guard.</p><div class="refsect3" title="definition"><a name="d0e6027"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, class Target,
|
||||
</span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForAction, void
|
||||
(CalledForAction::*action)(Event const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6012"></a><h4>template parameters</h4><p>
|
||||
(CalledForAction::*action)(Event const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6038"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>Target: the target state of the transition.</p></li><li class="listitem"><p>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.</p></li><li class="listitem"><p>action: a pointer to the method which CalledForAction
|
||||
provides.</p></li></ul></div><p>
|
||||
</p></div></div><div class="refsect2" title="g_row2"><a name="d0e6034"></a><h3>g_row2</h3><p>This is a transition with guard and without action.</p><div class="refsect3" title="definition"><a name="d0e6039"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, class Target,
|
||||
</p></div></div><div class="refsect2" title="g_row2"><a name="d0e6060"></a><h3>g_row2</h3><p>This is a transition with guard and without action.</p><div class="refsect3" title="definition"><a name="d0e6065"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, class Target,
|
||||
</span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForGuard, bool (CalledForGuard::*guard)(Event
|
||||
const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6050"></a><h4>template parameters</h4><p>
|
||||
const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6076"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>Target: the target state of the transition.</p></li><li class="listitem"><p>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.</p></li><li class="listitem"><p>guard: a pointer to the method which CalledForGuard
|
||||
provides.</p></li></ul></div><p>
|
||||
</p></div></div><div class="refsect2" title="row2"><a name="d0e6072"></a><h3>row2</h3><p>This is a transition with guard and action.</p><div class="refsect3" title="definition"><a name="d0e6077"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, class Target,
|
||||
</p></div></div><div class="refsect2" title="row2"><a name="d0e6098"></a><h3>row2</h3><p>This is a transition with guard and action.</p><div class="refsect3" title="definition"><a name="d0e6103"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, class Target,
|
||||
</span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForAction, void
|
||||
(CalledForAction::*action)(Event const&), </span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForGuard, bool (CalledForGuard::*guard)(Event
|
||||
const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6092"></a><h4>template parameters</h4><p>
|
||||
const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6118"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>Target: the target state of the transition.</p></li><li class="listitem"><p>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.</p></li><li class="listitem"><p>action: a pointer to the method which CalledForAction
|
||||
@@ -163,24 +163,24 @@
|
||||
called. It can be either a state of the containing state
|
||||
machine or the state machine itself.</p></li><li class="listitem"><p>guard: a pointer to the method which CalledForGuard
|
||||
provides.</p></li></ul></div><p>
|
||||
</p></div></div><div class="refsect2" title="a_irow2"><a name="d0e6120"></a><h3>a_irow2</h3><p>This is an internal transition for use inside a transition table, with
|
||||
action and without guard.</p><div class="refsect3" title="definition"><a name="d0e6125"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, </span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForAction, void
|
||||
(CalledForAction::*action)(Event const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6136"></a><h4>template parameters</h4><p>
|
||||
</p></div></div><div class="refsect2" title="a_irow2"><a name="d0e6146"></a><h3>a_irow2</h3><p>This is an internal transition for use inside a transition table, with
|
||||
action and without guard.</p><div class="refsect3" title="definition"><a name="d0e6151"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, </span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForAction, void
|
||||
(CalledForAction::*action)(Event const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6162"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>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.</p></li><li class="listitem"><p>action: a pointer to the method which CalledForAction
|
||||
provides.</p></li></ul></div><p>
|
||||
</p></div></div><div class="refsect2" title="g_irow2"><a name="d0e6155"></a><h3>g_irow2</h3><p>This is an internal transition for use inside a transition table, with
|
||||
guard and without action.</p><div class="refsect3" title="definition"><a name="d0e6160"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, </span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForGuard, bool (CalledForGuard::*guard)(Event
|
||||
const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6171"></a><h4>template parameters</h4><p>
|
||||
</p></div></div><div class="refsect2" title="g_irow2"><a name="d0e6181"></a><h3>g_irow2</h3><p>This is an internal transition for use inside a transition table, with
|
||||
guard and without action.</p><div class="refsect3" title="definition"><a name="d0e6186"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, </span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForGuard, bool (CalledForGuard::*guard)(Event
|
||||
const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6197"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>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.</p></li><li class="listitem"><p>guard: a pointer to the method which CalledForGuard
|
||||
provides.</p></li></ul></div><p>
|
||||
</p></div></div><div class="refsect2" title="irow2"><a name="d0e6190"></a><h3>irow2</h3><p>This is an internal transition for use inside a transition table, with
|
||||
guard and action.</p><div class="refsect3" title="definition"><a name="d0e6195"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, </span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForAction, void
|
||||
</p></div></div><div class="refsect2" title="irow2"><a name="d0e6216"></a><h3>irow2</h3><p>This is an internal transition for use inside a transition table, with
|
||||
guard and action.</p><div class="refsect3" title="definition"><a name="d0e6221"></a><h4>definition</h4><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template< class Source, class Event, </span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForAction, void
|
||||
(CalledForAction::*action)(Event const&), </span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class CalledForGuard, bool (CalledForGuard::*guard)(Event
|
||||
const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6210"></a><h4>template parameters</h4><p>
|
||||
const&) > _row2</span></span> {<br>}</pre></div><div class="refsect3" title="template parameters"><a name="d0e6236"></a><h4>template parameters</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>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.</p></li><li class="listitem"><p>action: a pointer to the method which CalledForAction
|
||||
@@ -188,16 +188,16 @@
|
||||
called. It can be either a state of the containing state
|
||||
machine or the state machine itself.</p></li><li class="listitem"><p>guard: a pointer to the method which CalledForGuard
|
||||
provides.</p></li></ul></div><p>
|
||||
</p></div></div></div><div class="refsect1" title="msm/front/state_machine_def.hpp"><a name="d0e6235"></a><h2>msm/front/state_machine_def.hpp</h2><p>This header provides the implementation of the <span class="command"><strong><a class="command" href="ch03s02.html#basic-front-end">basic front-end</a></strong></span>. It contains one
|
||||
type, <code class="code">state_machine_def</code></p><div class="refsect2" title="state_machine_def definition"><a name="d0e6245"></a><h3>state_machine_def definition</h3><p>This type is the basic class for a basic (or possibly any other)
|
||||
</p></div></div></div><div class="refsect1" title="msm/front/state_machine_def.hpp"><a name="d0e6261"></a><h2>msm/front/state_machine_def.hpp</h2><p>This header provides the implementation of the <span class="command"><strong><a class="command" href="ch03s02.html#basic-front-end">basic front-end</a></strong></span>. It contains one
|
||||
type, <code class="code">state_machine_def</code></p><div class="refsect2" title="state_machine_def definition"><a name="d0e6271"></a><h3>state_machine_def definition</h3><p>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.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class Derived,class BaseState =
|
||||
default_base_state> state_machine_def</span></span> {<br>}</pre><div class="refsect3" title="typedefs"><a name="d0e6254"></a><h4>typedefs</h4><p>
|
||||
default_base_state> state_machine_def</span></span> {<br>}</pre><div class="refsect3" title="typedefs"><a name="d0e6280"></a><h4>typedefs</h4><p>
|
||||
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>flag_list: by default, no flag is set in the state
|
||||
machine</p></li><li class="listitem"><p>deferred_events: by default, no event is deferred.</p></li><li class="listitem"><p>configuration: by default, no configuration customization
|
||||
is done.</p></li></ul></div><p>
|
||||
</p></div><div class="refsect3" title="row methods"><a name="d0e6270"></a><h4>row methods</h4><p>Like any other front-end, the following transition row types
|
||||
</p></div><div class="refsect3" title="row methods"><a name="d0e6296"></a><h4>row methods</h4><p>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
|
||||
@@ -209,30 +209,30 @@
|
||||
class AllStates> static bool guard_call(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>
|
||||
<code>(</code>Fsm& fsm,Event const&
|
||||
evt,SourceState&,TargetState,AllStates&<code>)</code>
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect3" title="a_row"><a name="d0e6293"></a><h4>a_row</h4><p>This is a transition with action and without guard.</p><p><code class="classname">template< class Source, class Event, class Target,
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect3" title="a_row"><a name="d0e6319"></a><h4>a_row</h4><p>This is a transition with action and without guard.</p><p><code class="classname">template< class Source, class Event, class Target,
|
||||
void (Derived::*action)(Event const&) > a_row</code></p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>Target: the target state of the transition.</p></li><li class="listitem"><p>action: a pointer to the method provided by the concrete
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="g_row"><a name="d0e6318"></a><h4>g_row</h4><p>This is a transition with guard and without action.</p><p><code class="classname">template< class Source, class Event, class Target,
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="g_row"><a name="d0e6344"></a><h4>g_row</h4><p>This is a transition with guard and without action.</p><p><code class="classname">template< class Source, class Event, class Target,
|
||||
bool (Derived::*guard)(Event const&) > g_row</code></p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>Target: the target state of the transition.</p></li><li class="listitem"><p>guard: a pointer to the method provided by the concrete
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="row"><a name="d0e6343"></a><h4>row</h4><p>This is a transition with guard and action.</p><p><code class="classname">template< class Source, class Event, class Target,
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="row"><a name="d0e6369"></a><h4>row</h4><p>This is a transition with guard and action.</p><p><code class="classname">template< class Source, class Event, class Target,
|
||||
void (Derived::*action)(Event const&), bool
|
||||
(Derived::*guard)(Event const&) > row</code></p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>Target: the target state of the transition.</p></li><li class="listitem"><p>action: a pointer to the method provided by the concrete
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li><li class="listitem"><p>guard: a pointer to the method provided by the concrete
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="_row"><a name="d0e6374"></a><h4>_row</h4><p>This is a transition without action or guard. The state machine only
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="_row"><a name="d0e6400"></a><h4>_row</h4><p>This is a transition without action or guard. The state machine only
|
||||
changes active state.</p><p><code class="classname">template< class Source, class Event, class Target >
|
||||
_row</code></p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>Target: the target state of the transition.</p></li></ul></div></div><div class="refsect3" title="a_irow"><a name="d0e6393"></a><h4>a_irow</h4><p>This is an internal transition for use inside a transition table, with
|
||||
_row</code></p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>Target: the target state of the transition.</p></li></ul></div></div><div class="refsect3" title="a_irow"><a name="d0e6419"></a><h4>a_irow</h4><p>This is an internal transition for use inside a transition table, with
|
||||
action and without guard.</p><p><code class="classname">template< class Source, class Event, void
|
||||
(Derived::*action)(Event const&) > a_irow</code></p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>action: a pointer to the method provided by the concrete
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="g_irow"><a name="d0e6415"></a><h4>g_irow</h4><p>This is an internal transition for use inside a transition table, with
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="g_irow"><a name="d0e6441"></a><h4>g_irow</h4><p>This is an internal transition for use inside a transition table, with
|
||||
guard and without action.</p><p><code class="classname">template< class Source, class Event, bool
|
||||
(Derived::*guard)(Event const&) > g_irow</code></p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>guard: a pointer to the method provided by the concrete
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="irow"><a name="d0e6437"></a><h4>irow</h4><p>This is an internal transition for use inside a transition table, with
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="irow"><a name="d0e6463"></a><h4>irow</h4><p>This is an internal transition for use inside a transition table, with
|
||||
guard and action.</p><p><code class="classname">template< class Source, class Event, void
|
||||
(Derived::*action)(Event const&), bool
|
||||
(Derived::*guard)(Event const&) > irow</code></p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li><li class="listitem"><p>action: a pointer to the method provided by the concrete
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li><li class="listitem"><p>guard: a pointer to the method provided by the concrete
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="_irow"><a name="d0e6465"></a><h4>_irow</h4><p>This is an internal transition without action or guard. As it does
|
||||
front-end (represented by <code class="code">Derived</code>).</p></li></ul></div></div><div class="refsect3" title="_irow"><a name="d0e6491"></a><h4>_irow</h4><p>This is an internal transition without action or guard. As it does
|
||||
nothing, it means "ignore event".</p><p><code class="classname">template< class Source, class Event >
|
||||
_irow</code></p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li></ul></div></div><div class="refsect3" title="methods"><a name="d0e6481"></a><h4>methods</h4><p><code class="code">state_machine_def</code> provides a default implementation in
|
||||
_irow</code></p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Event: the event triggering the transition.</p></li><li class="listitem"><p>Source: the source state of the transition.</p></li></ul></div></div><div class="refsect3" title="methods"><a name="d0e6507"></a><h4>methods</h4><p><code class="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 class="code">BOOST_ASSERT</code> so that the error will only be noticed in
|
||||
@@ -256,30 +256,30 @@
|
||||
<code>(</code>Event const& ,Fsm&,
|
||||
std::exception&<code>)</code>
|
||||
</code>;</div><div class="funcprototype-spacer"> </div></div><p>
|
||||
</p></div></div></div><div class="refsect1" title="msm/front/states.hpp"><a name="d0e6525"></a><h2>msm/front/states.hpp </h2><p>This header provides the different states (except state machines) for the
|
||||
basic front-end (or mixed with other front-ends).</p><div class="refsect2" title="types"><a name="d0e6530"></a><h3>types</h3><p>This header provides the following types:</p><div class="refsect3" title="no_sm_ptr"><a name="d0e6535"></a><h4>no_sm_ptr</h4><p>deprecated: default policy for states. It means that states do not
|
||||
need to save a pointer to their containing state machine.</p></div><div class="refsect3" title="sm_ptr"><a name="d0e6540"></a><h4>sm_ptr</h4><p>deprecated: state policy. It means that states need to save a pointer
|
||||
</p></div></div></div><div class="refsect1" title="msm/front/states.hpp"><a name="d0e6551"></a><h2>msm/front/states.hpp </h2><p>This header provides the different states (except state machines) for the
|
||||
basic front-end (or mixed with other front-ends).</p><div class="refsect2" title="types"><a name="d0e6556"></a><h3>types</h3><p>This header provides the following types:</p><div class="refsect3" title="no_sm_ptr"><a name="d0e6561"></a><h4>no_sm_ptr</h4><p>deprecated: default policy for states. It means that states do not
|
||||
need to save a pointer to their containing state machine.</p></div><div class="refsect3" title="sm_ptr"><a name="d0e6566"></a><h4>sm_ptr</h4><p>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.</p></div><div class="refsect3" title="state"><a name="d0e6545"></a><h4>state</h4><p>Basic type for simple states. Inherit from this type to define a
|
||||
will call set_sm_ptr(fsm*) and give itself as argument.</p></div><div class="refsect3" title="state"><a name="d0e6571"></a><h4>state</h4><p>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.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template<class Base = default_base_state,class
|
||||
SMPtrPolicy = no_sm_ptr> state</span></span> {<br>}</pre></div><div class="refsect3" title="terminate_state"><a name="d0e6554"></a><h4>terminate_state</h4><p>Basic type for terminate states. Inherit from this type to define a
|
||||
SMPtrPolicy = no_sm_ptr> state</span></span> {<br>}</pre></div><div class="refsect3" title="terminate_state"><a name="d0e6580"></a><h4>terminate_state</h4><p>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.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template<class Base = default_base_state,class
|
||||
SMPtrPolicy = no_sm_ptr> terminate_state</span></span> {<br>}</pre></div><div class="refsect3" title="interrupt_state"><a name="d0e6563"></a><h4>interrupt_state</h4><p>Basic type for interrupt states. Interrupt states prevent any further
|
||||
SMPtrPolicy = no_sm_ptr> terminate_state</span></span> {<br>}</pre></div><div class="refsect3" title="interrupt_state"><a name="d0e6589"></a><h4>interrupt_state</h4><p>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.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template<class EndInterruptEvent,class Base =
|
||||
default_base_state,</span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class SMPtrPolicy = no_sm_ptr>
|
||||
interrupt_state</span></span> {<br>}</pre></div><div class="refsect3" title="explicit_entry"><a name="d0e6576"></a><h4>explicit_entry</h4><p>Inherit from this type <span class="underline">in
|
||||
interrupt_state</span></span> {<br>}</pre></div><div class="refsect3" title="explicit_entry"><a name="d0e6602"></a><h4>explicit_entry</h4><p>Inherit from this type <span class="underline">in
|
||||
addition</span> 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 class="code">initial_state</code> typedef).</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <int ZoneIndex=-1> explicit_entry</span></span> {<br>}</pre></div><div class="refsect3" title="entry_pseudo_state"><a name="d0e6591"></a><h4>entry_pseudo_state</h4><p>Basic type for entry pseudo states. Entry pseudo states are an
|
||||
<code class="code">initial_state</code> typedef).</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <int ZoneIndex=-1> explicit_entry</span></span> {<br>}</pre></div><div class="refsect3" title="entry_pseudo_state"><a name="d0e6617"></a><h4>entry_pseudo_state</h4><p>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 class="code">initial_state</code> typedef).
|
||||
@@ -287,7 +287,7 @@
|
||||
used in a concrete state machine) to inherit a basic type for logging or
|
||||
providing a common behavior.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template<int RegionIndex=-1,class Base =
|
||||
default_base_state,</span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class SMPtrPolicy = no_sm_ptr>
|
||||
entry_pseudo_state</span></span> {<br>}</pre></div><div class="refsect3" title="exit_pseudo_state"><a name="d0e6607"></a><h4>exit_pseudo_state</h4><p>Basic type for exit pseudo states. Exit pseudo states are an
|
||||
entry_pseudo_state</span></span> {<br>}</pre></div><div class="refsect3" title="exit_pseudo_state"><a name="d0e6633"></a><h4>exit_pseudo_state</h4><p>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
|
||||
@@ -296,32 +296,32 @@
|
||||
machine) to inherit a basic type for logging or providing a common
|
||||
behavior.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template<class Event,class Base =
|
||||
default_base_state,</span></span> {<br>}</pre><pre class="classsynopsis"> <span class="ooclass"><span class="classname">class SMPtrPolicy = no_sm_ptr>
|
||||
exit_pseudo_state</span></span> {<br>}</pre></div></div></div><div class="refsect1" title="msm/front/euml/euml.hpp"><a name="d0e6620"></a><h2>msm/front/euml/euml.hpp</h2><p>This header includes all of eUML except the STL functors.</p></div><div class="refsect1" title="msm/front/euml/stl.hpp"><a name="d0e6625"></a><h2>msm/front/euml/stl.hpp</h2><p>This header includes all the functors for STL support in eUML. These <span class="command"><strong><a class="command" href="ch11.html#eUML-STL-all">tables</a></strong></span> show a full description.</p></div><div class="refsect1" title="msm/front/euml/algorithm.hpp"><a name="d0e6633"></a><h2>msm/front/euml/algorithm.hpp</h2><p>This header includes all the functors for STL algorithms support in eUML.
|
||||
exit_pseudo_state</span></span> {<br>}</pre></div></div></div><div class="refsect1" title="msm/front/euml/euml.hpp"><a name="d0e6646"></a><h2>msm/front/euml/euml.hpp</h2><p>This header includes all of eUML except the STL functors.</p></div><div class="refsect1" title="msm/front/euml/stl.hpp"><a name="d0e6651"></a><h2>msm/front/euml/stl.hpp</h2><p>This header includes all the functors for STL support in eUML. These <span class="command"><strong><a class="command" href="ch11.html#eUML-STL-all">tables</a></strong></span> show a full description.</p></div><div class="refsect1" title="msm/front/euml/algorithm.hpp"><a name="d0e6659"></a><h2>msm/front/euml/algorithm.hpp</h2><p>This header includes all the functors for STL algorithms support in eUML.
|
||||
These <span class="command"><strong><a class="command" href="ch11.html#eUML-STL-all">tables</a></strong></span> show a full
|
||||
description.</p></div><div class="refsect1" title="msm/front/euml/iteration.hpp"><a name="d0e6641"></a><h2>msm/front/euml/iteration.hpp</h2><p>This header includes iteration functors for STL support in eUML. This <span class="command"><strong><a class="command" href="ch11.html#eUML-STL-iteration">tables</a></strong></span> shows a full
|
||||
description.</p></div><div class="refsect1" title="msm/front/euml/querying.hpp"><a name="d0e6649"></a><h2>msm/front/euml/querying.hpp</h2><p>This header includes querying functors for STL support in eUML. This <span class="command"><strong><a class="command" href="ch11.html#eUML-STL-querying">tables</a></strong></span> shows a full
|
||||
description.</p></div><div class="refsect1" title="msm/front/euml/transformation.hpp"><a name="d0e6657"></a><h2>msm/front/euml/transformation.hpp</h2><p>This header includes transformation functors for STL support in eUML. This
|
||||
description.</p></div><div class="refsect1" title="msm/front/euml/iteration.hpp"><a name="d0e6667"></a><h2>msm/front/euml/iteration.hpp</h2><p>This header includes iteration functors for STL support in eUML. This <span class="command"><strong><a class="command" href="ch11.html#eUML-STL-iteration">tables</a></strong></span> shows a full
|
||||
description.</p></div><div class="refsect1" title="msm/front/euml/querying.hpp"><a name="d0e6675"></a><h2>msm/front/euml/querying.hpp</h2><p>This header includes querying functors for STL support in eUML. This <span class="command"><strong><a class="command" href="ch11.html#eUML-STL-querying">tables</a></strong></span> shows a full
|
||||
description.</p></div><div class="refsect1" title="msm/front/euml/transformation.hpp"><a name="d0e6683"></a><h2>msm/front/euml/transformation.hpp</h2><p>This header includes transformation functors for STL support in eUML. This
|
||||
<span class="command"><strong><a class="command" href="ch11.html#eUML-STL-transformation">tables</a></strong></span> shows a full
|
||||
description.</p></div><div class="refsect1" title="msm/front/euml/container.hpp"><a name="d0e6665"></a><h2>msm/front/euml/container.hpp</h2><p>This header includes container functors for STL support in eUML (functors
|
||||
description.</p></div><div class="refsect1" title="msm/front/euml/container.hpp"><a name="d0e6691"></a><h2>msm/front/euml/container.hpp</h2><p>This header includes container functors for STL support in eUML (functors
|
||||
calling container methods). This <span class="command"><strong><a class="command" href="ch11.html#eUML-STL-container">tables</a></strong></span> shows a full description. It also provides npos for
|
||||
strings.</p><div class="refsect2" title="Npos_<container type>"><a name="d0e6673"></a><h3>Npos_<container type></h3><p>Functor returning npos for transition or state behaviors. Like all
|
||||
strings.</p><div class="refsect2" title="Npos_<container type>"><a name="d0e6699"></a><h3>Npos_<container type></h3><p>Functor returning npos for transition or state behaviors. Like all
|
||||
constants, only the functor form exists, so parenthesis are necessary.
|
||||
Example:</p><p><code class="code">string_find_(event_(m_song),Char_<'S'>(),Size_t_<0>()) !=
|
||||
Npos_<string>() // compare result of string::find with
|
||||
npos</code></p></div></div><div class="refsect1" title="msm/front/euml/stt_grammar.hpp"><a name="d0e6681"></a><h2>msm/front/euml/stt_grammar.hpp</h2><p>This header provides the transition table grammars. This includes internal
|
||||
transition tables.</p><div class="refsect2" title="functions"><a name="d0e6686"></a><h3>functions</h3><div class="refsect3" title="build_stt"><a name="d0e6689"></a><h4>build_stt</h4><p>The function build_stt evaluates the grammar-conform expression as
|
||||
npos</code></p></div></div><div class="refsect1" title="msm/front/euml/stt_grammar.hpp"><a name="d0e6707"></a><h2>msm/front/euml/stt_grammar.hpp</h2><p>This header provides the transition table grammars. This includes internal
|
||||
transition tables.</p><div class="refsect2" title="functions"><a name="d0e6712"></a><h3>functions</h3><div class="refsect3" title="build_stt"><a name="d0e6715"></a><h4>build_stt</h4><p>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 class="code">invalid_type</code>, which will lead to a
|
||||
compile-time static assertion when this transition table is passed to a
|
||||
state machine. </p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template<class Expr> [mpl::vector<...> /
|
||||
msm::front::euml::invalid_type] build_stt(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Expr const& expr</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect3" title="build_internal_stt"><a name="d0e6703"></a><h4>build_internal_stt</h4><p>The function build_internal_stt evaluates the grammar-conform
|
||||
msm::front::euml::invalid_type] build_stt(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Expr const& expr</code>;</div><div class="funcprototype-spacer"> </div></div></div><div class="refsect3" title="build_internal_stt"><a name="d0e6729"></a><h4>build_internal_stt</h4><p>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 class="code">invalid_type</code>, which
|
||||
will lead to a compile-time static assertion when this transition table
|
||||
is passed to a state machine. </p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template<class Expr> [mpl::vector<...> /
|
||||
msm::front::euml::invalid_type] build_internal_stt(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Expr const& expr</code>;</div><div class="funcprototype-spacer"> </div></div></div></div><div class="refsect2" title="grammars"><a name="d0e6717"></a><h3>grammars</h3><div class="refsect3" title="transition table"><a name="d0e6720"></a><h4><span class="command"><strong><a name="reference-stt-grammar"></a>transition
|
||||
msm::front::euml::invalid_type] build_internal_stt(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Expr const& expr</code>;</div><div class="funcprototype-spacer"> </div></div></div></div><div class="refsect2" title="grammars"><a name="d0e6743"></a><h3>grammars</h3><div class="refsect3" title="transition table"><a name="d0e6746"></a><h4><span class="command"><strong><a name="reference-stt-grammar"></a>transition
|
||||
table</strong></span></h4><p>The transition table accepts the following grammar:</p><pre class="programlisting">Stt := Row | (Stt ',' Stt)
|
||||
Row := (Target '==' (SourcePlusEvent)) /* first syntax*/
|
||||
| ( (SourcePlusEvent) '==' Target ) /* second syntax*/
|
||||
@@ -346,15 +346,15 @@ target == source + event / action,
|
||||
source + event /action == target,
|
||||
source / action == target, /*anonymous transition*/
|
||||
target == source / action, /*anonymous transition*/
|
||||
source + event /action, /* internal transition*/</pre></div><div class="refsect3" title="internal transition table"><a name="d0e6732"></a><h4>internal transition table</h4><p>The internal transition table accepts the following grammar:</p><pre class="programlisting">IStt := BuildEvent | (IStt ',' IStt)</pre><p>BuildEvent being defined for both internal and standard transition
|
||||
tables.</p></div></div></div><div class="refsect1" title="msm/front/euml/guard_grammar.hpp"><a name="d0e6741"></a><h2>msm/front/euml/guard_grammar.hpp</h2><p>This header contains the <code class="code">Guard</code> grammar used in the previous
|
||||
source + event /action, /* internal transition*/</pre></div><div class="refsect3" title="internal transition table"><a name="d0e6758"></a><h4>internal transition table</h4><p>The internal transition table accepts the following grammar:</p><pre class="programlisting">IStt := BuildEvent | (IStt ',' IStt)</pre><p>BuildEvent being defined for both internal and standard transition
|
||||
tables.</p></div></div></div><div class="refsect1" title="msm/front/euml/guard_grammar.hpp"><a name="d0e6767"></a><h2>msm/front/euml/guard_grammar.hpp</h2><p>This header contains the <code class="code">Guard</code> grammar used in the previous
|
||||
section. This grammar is long but pretty simple:</p><pre class="programlisting">Guard := action_tag | (Guard '&&' Guard)
|
||||
| (Guard '||' Guard) | ... /* operators*/
|
||||
| (if_then_else_(Guard,Guard,Guard)) | (function (Action,...Action))</pre><p>Most C++ operators are supported (address-of is not). With
|
||||
<code class="code">function</code> is meant any eUML predefined function or any self-made
|
||||
(using <code class="code">MSM_EUML_METHOD</code> or <code class="code">MSM_EUML_FUNCTION</code>). Action
|
||||
is a grammar defined in state_grammar.hpp.</p></div><div class="refsect1" title="msm/front/euml/state_grammar.hpp"><a name="d0e6762"></a><h2>msm/front/euml/state_grammar.hpp</h2><p>This header provides the grammar for actions and the different grammars and
|
||||
functions to build states using eUML.</p><div class="refsect2" title="action grammar"><a name="d0e6767"></a><h3>action grammar</h3><p>Like the guard grammar, this grammar supports relevant C++ operators and
|
||||
is a grammar defined in state_grammar.hpp.</p></div><div class="refsect1" title="msm/front/euml/state_grammar.hpp"><a name="d0e6788"></a><h2>msm/front/euml/state_grammar.hpp</h2><p>This header provides the grammar for actions and the different grammars and
|
||||
functions to build states using eUML.</p><div class="refsect2" title="action grammar"><a name="d0e6793"></a><h3>action grammar</h3><p>Like the guard grammar, this grammar supports relevant C++ operators and
|
||||
eUML functions:</p><pre class="programlisting">Action := action_tag | (Action '+' Action)
|
||||
| ('--' Action) | ... /* operators*/
|
||||
| if_then_else_(Guard,Action,Action) | if_then_(Action)
|
||||
@@ -363,10 +363,10 @@ source + event /action, /* internal transition*/</pre></div><div class="refsect3
|
||||
| (function(Action,...Action))
|
||||
ActionSequence := Action | (Action ',' Action)</pre><p>Relevant operators are: ++ (post/pre), -- (post/pre), dereferencing, +
|
||||
(unary/binary), - (unary/binary), *, /, %, &(bitwise), | (bitwise),
|
||||
^(bitwise), +=, -=, *=, /=, %=, <<=, >>=, <<, >>, =, [].</p></div><div class="refsect2" title="attributes"><a name="d0e6776"></a><h3>attributes</h3><p>This grammar is used to add attributes to states (or state machines) or
|
||||
^(bitwise), +=, -=, *=, /=, %=, <<=, >>=, <<, >>, =, [].</p></div><div class="refsect2" title="attributes"><a name="d0e6802"></a><h3>attributes</h3><p>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:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">attributes_ << no_attributes_</code></p></li><li class="listitem"><p><code class="code">attributes_ << attribute_1 << ... <<
|
||||
attribute_n</code></p></li></ul></div><p>Attributes can be of any default-constructible type (fusion
|
||||
requirement).</p></div><div class="refsect2" title="configure"><a name="d0e6792"></a><h3>configure</h3><p>This grammar also has two forms:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">configure_ << no_configure_</code></p></li><li class="listitem"><p><code class="code">configure_ << type_1 << ... <<
|
||||
requirement).</p></div><div class="refsect2" title="configure"><a name="d0e6818"></a><h3>configure</h3><p>This grammar also has two forms:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">configure_ << no_configure_</code></p></li><li class="listitem"><p><code class="code">configure_ << type_1 << ... <<
|
||||
type_n</code></p></li></ul></div><p>This grammar is used to create inside one syntax:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>flags: <code class="code">configure_ << some_flag</code> where
|
||||
some_flag inherits from <code class="code">euml_flag<some_flag></code> or
|
||||
is defined using BOOST_MSM_EUML_FLAG.</p></li><li class="listitem"><p>deferred events: <code class="code">configure_ << some_event</code>
|
||||
@@ -378,12 +378,12 @@ ActionSequence := Action | (Action ',' Action)</pre><p>Relevant operators are: +
|
||||
some_config inherits from
|
||||
<code class="code">euml_config<some_config></code>. At the moment,
|
||||
three predefined objects exist (in msm//front/euml/common.hpp):</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>no_exception: disable catching exceptions</p></li><li class="listitem"><p>no_msg_queue: disable message queue</p></li><li class="listitem"><p>deferred_events: manually enable handling of
|
||||
deferred events</p></li></ul></div></li></ul></div></div><div class="refsect2" title="initial states"><a name="d0e6846"></a><h3>initial states</h3><p>The grammar to define initial states for a state machine is: <code class="code">init_
|
||||
deferred events</p></li></ul></div></li></ul></div></div><div class="refsect2" title="initial states"><a name="d0e6872"></a><h3>initial states</h3><p>The grammar to define initial states for a state machine is: <code class="code">init_
|
||||
<< state_1 << ... << 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.</p></div><div class="refsect2" title="functions"><a name="d0e6854"></a><h3>functions</h3><div class="refsect3" title="build_sm"><a name="d0e6857"></a><h4>build_sm</h4><p>This function has several overloads. The return type is not relevant
|
||||
BOOST_MSM_EUML_ENTRY_STATE or BOOST_MSM_EUML_EXIT_STATE.</p></div><div class="refsect2" title="functions"><a name="d0e6880"></a><h3>functions</h3><div class="refsect3" title="build_sm"><a name="d0e6883"></a><h4>build_sm</h4><p>This function has several overloads. The return type is not relevant
|
||||
to you as only decltype (return type) is what one needs.</p><p>Defines a state machine without entry or exit:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,class Stt,class Init>
|
||||
func_state_machine<...> build_sm(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Stt ,Init</code>;</div><div class="funcprototype-spacer"> </div></div><p>Defines a state machine with entry behavior:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,class Stt,class Init,class
|
||||
Expr1> func_state_machine<...> build_sm(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Stt ,Init,Expr1 const&</code>;</div><div class="funcprototype-spacer"> </div></div><p>Defines a state machine with entry and exit behaviors:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,class Stt,class Init,class
|
||||
@@ -402,7 +402,7 @@ ActionSequence := Action | (Action ',' Action)</pre><p>Relevant operators are: +
|
||||
Base> func_state_machine<...> build_sm(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Stt ,Init,Expr1 const&, Expr2 const&, Attributes
|
||||
const&, Configure const&, Base</code>;</div><div class="funcprototype-spacer"> </div></div><p>Notice that this function requires the extra parameter class
|
||||
StateNameTag to disambiguate state machines having the same parameters
|
||||
but still being different.</p></div><div class="refsect3" title="build_state"><a name="d0e6912"></a><h4>build_state</h4><p>This function has several overloads. The return type is not relevant
|
||||
but still being different.</p></div><div class="refsect3" title="build_state"><a name="d0e6938"></a><h4>build_state</h4><p>This function has several overloads. The return type is not relevant
|
||||
to you as only decltype (return type) is what one needs.</p><p>Defines a simple state without entry or exit:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">func_state<class StateNameTag,...> build_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code></code>;</div><div class="funcprototype-spacer"> </div></div><p>Defines a simple state with entry behavior:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,class Expr1>
|
||||
func_state<...> build_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Expr1 const&</code>;</div><div class="funcprototype-spacer"> </div></div><p>Defines a simple state with entry and exit behaviors:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,class Expr1, class Expr2>
|
||||
func_state<...> build_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Expr1 const&,Expr2 const&</code>;</div><div class="funcprototype-spacer"> </div></div><p>Defines a simple state with entry, exit behaviors and
|
||||
@@ -418,7 +418,7 @@ ActionSequence := Action | (Action ',' Action)</pre><p>Relevant operators are: +
|
||||
func_state<...> build_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Expr1 const&, Expr2 const&, Attributes const&,
|
||||
Configure const&, Base</code>;</div><div class="funcprototype-spacer"> </div></div><p>Notice that this function requires the extra parameter class
|
||||
StateNameTag to disambiguate states having the same parameters but still
|
||||
being different.</p></div><div class="refsect3" title="build_terminate_state"><a name="d0e6966"></a><h4>build_terminate_state</h4><p>This function has the same overloads as build_state.</p></div><div class="refsect3" title="build_interrupt_state"><a name="d0e6971"></a><h4>build_interrupt_state</h4><p>This function has several overloads. The return type is not relevant
|
||||
being different.</p></div><div class="refsect3" title="build_terminate_state"><a name="d0e6992"></a><h4>build_terminate_state</h4><p>This function has the same overloads as build_state.</p></div><div class="refsect3" title="build_interrupt_state"><a name="d0e6997"></a><h4>build_interrupt_state</h4><p>This function has several overloads. The return type is not relevant
|
||||
to you as only decltype (return type) is what one needs.</p><p>Defines an interrupt state without entry or exit:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,class EndInterruptEvent>
|
||||
func_state<...> build_interrupt_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>EndInterruptEvent const&</code>;</div><div class="funcprototype-spacer"> </div></div><p>Defines an interrupt state with entry behavior:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,class
|
||||
EndInterruptEvent,class Expr1> func_state<...>
|
||||
@@ -443,7 +443,7 @@ ActionSequence := Action | (Action ',' Action)</pre><p>Relevant operators are: +
|
||||
const&, Attributes const&, Configure const&,
|
||||
Base</code>;</div><div class="funcprototype-spacer"> </div></div><p>Notice that this function requires the extra parameter class
|
||||
StateNameTag to disambiguate states having the same parameters but still
|
||||
being different.</p></div><div class="refsect3" title="build_entry_state"><a name="d0e7026"></a><h4>build_entry_state</h4><p>This function has several overloads. The return type is not relevant
|
||||
being different.</p></div><div class="refsect3" title="build_entry_state"><a name="d0e7052"></a><h4>build_entry_state</h4><p>This function has several overloads. The return type is not relevant
|
||||
to you as only decltype (return type) is what one needs.</p><p>Defines an entry pseudo state without entry or exit:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,int RegionIndex>
|
||||
entry_func_state<...> build_entry_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code></code>;</div><div class="funcprototype-spacer"> </div></div><p>Defines an entry pseudo state with entry behavior:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,int RegionIndex,class
|
||||
Expr1> entry_func_state<...> build_entry_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Expr1 const&</code>;</div><div class="funcprototype-spacer"> </div></div><p>Defines an entry pseudo state with entry and exit behaviors:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,int RegionIndex,class
|
||||
@@ -462,7 +462,7 @@ ActionSequence := Action | (Action ',' Action)</pre><p>Relevant operators are: +
|
||||
Base> entry_func_state<...> build_entry_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Expr1 const&, Expr2 const&, Attributes const&,
|
||||
Configure const&, Base</code>;</div><div class="funcprototype-spacer"> </div></div><p>Notice that this function requires the extra parameter class
|
||||
StateNameTag to disambiguate states having the same parameters but still
|
||||
being different.</p></div><div class="refsect3" title="build_exit_state"><a name="d0e7080"></a><h4>build_exit_state</h4><p>This function has several overloads. The return type is not relevant
|
||||
being different.</p></div><div class="refsect3" title="build_exit_state"><a name="d0e7106"></a><h4>build_exit_state</h4><p>This function has several overloads. The return type is not relevant
|
||||
to you as only decltype (return type) is what one needs.</p><p>Defines an exit pseudo state without entry or exit:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,class Event>
|
||||
exit_func_state<...> build_exit_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Event const&</code>;</div><div class="funcprototype-spacer"> </div></div><p>Defines an exit pseudo state with entry behavior:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,class Event,class Expr1>
|
||||
exit_func_state<...> build_exit_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Event const&,Expr1 const&</code>;</div><div class="funcprototype-spacer"> </div></div><p>Defines an exit pseudo state with entry and exit behaviors:</p><div class="funcsynopsis"><table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table"><tr><td><code class="funcdef">template <class StateNameTag,class Event,class Expr1,
|
||||
@@ -481,8 +481,8 @@ ActionSequence := Action | (Action ',' Action)</pre><p>Relevant operators are: +
|
||||
exit_func_state<...> build_exit_state(</code></td><td><code>)</code>;</td><td> </td></tr></table><div class="paramdef-list"><code>Event const&,Expr1 const&, Expr2 const&,
|
||||
Attributes const&, Configure const&, Base</code>;</div><div class="funcprototype-spacer"> </div></div><p>Notice that this function requires the extra parameter class
|
||||
StateNameTag to disambiguate states having the same parameters but still
|
||||
being different.</p></div><div class="refsect3" title="build_explicit_entry_state"><a name="d0e7135"></a><h4>build_explicit_entry_state</h4><p>This function has the same overloads as build_entry_state and
|
||||
explicit_entry_func_state as return type.</p></div></div></div><div class="refsect1" title="msm/front/euml/common.hpp"><a name="d0e7140"></a><h2>msm/front/euml/common.hpp</h2><div class="refsect2" title="types"><a name="d0e7143"></a><h3>types</h3><div class="refsect3" title="euml_event"><a name="d0e7146"></a><h4>euml_event</h4><p>The basic type for events with eUML.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class EventName> euml_event;</span></span> {<br>}</pre><pre class="programlisting">struct play : euml_event<play>{};</pre></div><div class="refsect3" title="euml_state"><a name="d0e7157"></a><h4>euml_state</h4><p>The basic type for states with eUML. You will usually not use this
|
||||
being different.</p></div><div class="refsect3" title="build_explicit_entry_state"><a name="d0e7161"></a><h4>build_explicit_entry_state</h4><p>This function has the same overloads as build_entry_state and
|
||||
explicit_entry_func_state as return type.</p></div></div></div><div class="refsect1" title="msm/front/euml/common.hpp"><a name="d0e7166"></a><h2>msm/front/euml/common.hpp</h2><div class="refsect2" title="types"><a name="d0e7169"></a><h3>types</h3><div class="refsect3" title="euml_event"><a name="d0e7172"></a><h4>euml_event</h4><p>The basic type for events with eUML.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class EventName> euml_event;</span></span> {<br>}</pre><pre class="programlisting">struct play : euml_event<play>{};</pre></div><div class="refsect3" title="euml_state"><a name="d0e7183"></a><h4>euml_state</h4><p>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
|
||||
@@ -493,7 +493,7 @@ ActionSequence := Action | (Action ',' Action)</pre><p>Relevant operators are: +
|
||||
void foo() {...}
|
||||
template <class Event,class Fsm>
|
||||
void on_entry(Event const& evt,Fsm& fsm){...}
|
||||
};</pre></div><div class="refsect3" title="euml_flag"><a name="d0e7170"></a><h4>euml_flag</h4><p>The basic type for flags with eUML.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class FlagName> euml_flag;</span></span> {<br>}</pre><pre class="programlisting">struct PlayingPaused: euml_flag<PlayingPaused>{};</pre></div><div class="refsect3" title="euml_action"><a name="d0e7181"></a><h4>euml_action</h4><p>The basic type for state or transition behaviors and guards with
|
||||
};</pre></div><div class="refsect3" title="euml_flag"><a name="d0e7196"></a><h4>euml_flag</h4><p>The basic type for flags with eUML.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class FlagName> euml_flag;</span></span> {<br>}</pre><pre class="programlisting">struct PlayingPaused: euml_flag<PlayingPaused>{};</pre></div><div class="refsect3" title="euml_action"><a name="d0e7207"></a><h4>euml_action</h4><p>The basic type for state or transition behaviors and guards with
|
||||
eUML.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class AcionName> euml_action;</span></span> {<br>}</pre><pre class="programlisting">struct close_drawer : euml_action<close_drawer>
|
||||
{
|
||||
template <class Fsm,class Evt,class SourceState,class TargetState>
|
||||
@@ -502,41 +502,41 @@ ActionSequence := Action | (Action ',' Action)</pre><p>Relevant operators are: +
|
||||
{
|
||||
template <class Event,class Fsm,class State>
|
||||
void operator()(Event const&,Fsm& fsm,State& ){...}
|
||||
};</pre></div><div class="refsect3" title="euml_config"><a name="d0e7196"></a><h4>euml_config</h4><p>The basic type for configuration possibilities with eUML.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class ConfigName> euml_config;</span></span> {<br>}</pre><p>You normally do not use this type directly but instead the instances
|
||||
};</pre></div><div class="refsect3" title="euml_config"><a name="d0e7222"></a><h4>euml_config</h4><p>The basic type for configuration possibilities with eUML.</p><pre class="classsynopsis"> <span class="ooclass"><span class="classname">template <class ConfigName> euml_config;</span></span> {<br>}</pre><p>You normally do not use this type directly but instead the instances
|
||||
of predefined configuration:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>no_exception: disable catching exceptions</p></li><li class="listitem"><p>no_msg_queue: disable message queue. The message queue
|
||||
allows you to send an event for procesing while in an event
|
||||
processing.</p></li><li class="listitem"><p>deferred_events: manually enable handling of deferred
|
||||
events</p></li></ul></div></div><div class="refsect3" title="invalid_type"><a name="d0e7217"></a><h4>invalid_type</h4><p>Type returned by grammar parsers if the grammar is invalid. Seeing
|
||||
this type will result in a static assertion.</p></div><div class="refsect3" title="no_action"><a name="d0e7222"></a><h4>no_action</h4><p>Placeholder type for use in entry/exit or transition behaviors, which
|
||||
does absolutely nothing.</p></div><div class="refsect3" title="source_"><a name="d0e7227"></a><h4>source_</h4><p>Generic object or function for the source state of a given transition:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>as object: returns by reference the source state of a
|
||||
events</p></li></ul></div></div><div class="refsect3" title="invalid_type"><a name="d0e7243"></a><h4>invalid_type</h4><p>Type returned by grammar parsers if the grammar is invalid. Seeing
|
||||
this type will result in a static assertion.</p></div><div class="refsect3" title="no_action"><a name="d0e7248"></a><h4>no_action</h4><p>Placeholder type for use in entry/exit or transition behaviors, which
|
||||
does absolutely nothing.</p></div><div class="refsect3" title="source_"><a name="d0e7253"></a><h4>source_</h4><p>Generic object or function for the source state of a given transition:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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).</p><p>Example:
|
||||
</p><pre class="programlisting">some_user_function_(source_)</pre></li><li class="listitem"><p>as function: returns by reference the attribute passed as
|
||||
parameter.</p><p>Example:
|
||||
</p><pre class="programlisting">source_(m_counter)++</pre></li></ul></div></div><div class="refsect3" title="target_"><a name="d0e7247"></a><h4>target_</h4><p>Generic object or function for the target state of a given transition:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>as object: returns by reference the target state of a
|
||||
</p><pre class="programlisting">source_(m_counter)++</pre></li></ul></div></div><div class="refsect3" title="target_"><a name="d0e7273"></a><h4>target_</h4><p>Generic object or function for the target state of a given transition:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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).</p><p>Example:
|
||||
</p><pre class="programlisting">some_user_function_(target_)</pre></li><li class="listitem"><p>as function: returns by reference the attribute passed as
|
||||
parameter.</p><p>Example:
|
||||
</p><pre class="programlisting">target_(m_counter)++</pre></li></ul></div></div><div class="refsect3" title="state_"><a name="d0e7267"></a><h4>state_</h4><p>Generic object or function for the state of a given entry / exit
|
||||
</p><pre class="programlisting">target_(m_counter)++</pre></li></ul></div></div><div class="refsect3" title="state_"><a name="d0e7293"></a><h4>state_</h4><p>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:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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).</p><p>Example:
|
||||
</p><pre class="programlisting">some_user_function_(state_) // calls some_user_function on the current state</pre></li><li class="listitem"><p>as function: returns by reference the attribute passed as
|
||||
parameter.</p><p>Example:
|
||||
</p><pre class="programlisting">state_(m_counter)++</pre></li></ul></div></div><div class="refsect3" title="event_"><a name="d0e7287"></a><h4>event_</h4><p>Generic object or function for the event triggering a given transition
|
||||
</p><pre class="programlisting">state_(m_counter)++</pre></li></ul></div></div><div class="refsect3" title="event_"><a name="d0e7313"></a><h4>event_</h4><p>Generic object or function for the event triggering a given transition
|
||||
(valid in a transition behavior, as well as in state entry/exit behaviors):</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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).</p><p>Example:
|
||||
</p><pre class="programlisting">some_user_function_(event_)</pre></li><li class="listitem"><p>as function: returns by reference the attribute passed as
|
||||
parameter.</p><p>Example:
|
||||
</p><pre class="programlisting">event_(m_counter)++</pre></li></ul></div></div><div class="refsect3" title="fsm_"><a name="d0e7307"></a><h4>fsm_</h4><p>Generic object or function for the state machine containing a given transition:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>as object: returns by reference the event of a transition,
|
||||
</p><pre class="programlisting">event_(m_counter)++</pre></li></ul></div></div><div class="refsect3" title="fsm_"><a name="d0e7333"></a><h4>fsm_</h4><p>Generic object or function for the state machine containing a given transition:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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).</p><p>Example:
|
||||
</p><pre class="programlisting">some_user_function_(fsm_)</pre></li><li class="listitem"><p>as function: returns by reference the attribute passed as
|
||||
parameter.</p><p>Example:
|
||||
</p><pre class="programlisting">fsm_(m_counter)++</pre></li></ul></div></div><div class="refsect3" title="substate_"><a name="d0e7327"></a><h4>substate_</h4><p>Generic object or function returning a state of a given state machine:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>with 1 parameter: returns by reference the state passed as
|
||||
</p><pre class="programlisting">fsm_(m_counter)++</pre></li></ul></div></div><div class="refsect3" title="substate_"><a name="d0e7353"></a><h4>substate_</h4><p>Generic object or function returning a state of a given state machine:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>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).</p><p>Example:
|
||||
</p><pre class="programlisting">some_user_function_(substate_(my_state))</pre></li><li class="listitem"><p>with 2 parameters: returns by reference the state passed
|
||||
@@ -544,46 +544,46 @@ ActionSequence := Action | (Action ',' Action)</pre><p>Relevant operators are: +
|
||||
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_.</p><p>Example (equivalent to the previous example):
|
||||
</p><pre class="programlisting">some_user_function_(substate_(my_state,fsm_))</pre></li></ul></div></div><div class="refsect3" title="attribute_"><a name="d0e7347"></a><h4>attribute_</h4><p>Generic object or function returning the attribute passed (by name) as
|
||||
</p><pre class="programlisting">some_user_function_(substate_(my_state,fsm_))</pre></li></ul></div></div><div class="refsect3" title="attribute_"><a name="d0e7373"></a><h4>attribute_</h4><p>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: </p><p>
|
||||
</p><pre class="programlisting">attribute_(substate_(my_state),cd_name_attribute)++</pre><p>
|
||||
</p></div><div class="refsect3" title="True_"><a name="d0e7357"></a><h4>True_</h4><p>Functor returning true for transition or state behaviors. Like all
|
||||
</p></div><div class="refsect3" title="True_"><a name="d0e7383"></a><h4>True_</h4><p>Functor returning true for transition or state behaviors. Like all
|
||||
constants, only the functor form exists, so parenthesis are necessary.
|
||||
Example:</p><p>
|
||||
</p><pre class="programlisting">if_then_(True_(),/* some action always called*/)</pre><p>
|
||||
</p></div><div class="refsect3" title="False_"><a name="d0e7367"></a><h4>False_</h4><p>Functor returning false for transition or state behaviors. Like all
|
||||
</p></div><div class="refsect3" title="False_"><a name="d0e7393"></a><h4>False_</h4><p>Functor returning false for transition or state behaviors. Like all
|
||||
constants, only the functor form exists, so parenthesis are necessary.
|
||||
Example:</p><p>
|
||||
</p><pre class="programlisting">if_then_(False_(),/* some action never called */)</pre><p>
|
||||
</p></div><div class="refsect3" title="Int_<int value>"><a name="d0e7377"></a><h4>Int_<int value></h4><p>Functor returning an integer value for transition or state behaviors.
|
||||
</p></div><div class="refsect3" title="Int_<int value>"><a name="d0e7403"></a><h4>Int_<int value></h4><p>Functor returning an integer value for transition or state behaviors.
|
||||
Like all constants, only the functor form exists, so parenthesis are
|
||||
necessary. Example:</p><p>
|
||||
</p><pre class="programlisting">target_(m_ringing_cpt) = Int_<RINGING_TIME>() // RINGING_TIME is a constant</pre><p>
|
||||
</p></div><div class="refsect3" title="Char_<char value>"><a name="d0e7387"></a><h4>Char_<char value></h4><p>Functor returning a char value for transition or state behaviors. Like
|
||||
</p></div><div class="refsect3" title="Char_<char value>"><a name="d0e7413"></a><h4>Char_<char value></h4><p>Functor returning a char value for transition or state behaviors. Like
|
||||
all constants, only the functor form exists, so parenthesis are
|
||||
necessary. Example:</p><p>
|
||||
</p><pre class="programlisting">// look for 'S' in event.m_song
|
||||
[string_find_(event_(m_song),Char_<'S'>(),Size_t_<0>()) != Npos_<string>()]</pre><p>
|
||||
</p></div><div class="refsect3" title="Size_t_<size_t value>"><a name="d0e7397"></a><h4>Size_t_<size_t value></h4><p>Functor returning a size_t value for transition or state behaviors.
|
||||
</p></div><div class="refsect3" title="Size_t_<size_t value>"><a name="d0e7423"></a><h4>Size_t_<size_t value></h4><p>Functor returning a size_t value for transition or state behaviors.
|
||||
Like all constants, only the functor form exists, so parenthesis are
|
||||
necessary. Example:</p><p>
|
||||
</p><pre class="programlisting">substr_(event_(m_song),Size_t_<1>()) // returns a substring of event.m_song</pre><p>
|
||||
</p></div><div class="refsect3" title="String_ < mpl::string >"><a name="d0e7407"></a><h4>String_ < mpl::string ></h4><p>Functor returning a string for transition or state behaviors. Like all
|
||||
</p></div><div class="refsect3" title="String_ < mpl::string >"><a name="d0e7433"></a><h4>String_ < mpl::string ></h4><p>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.</p><p>Example:</p><p>
|
||||
</p><pre class="programlisting">// adds "Let it be" to fsm.m_src_container
|
||||
push_back_(fsm_(m_src_container), String_<mpl::string<'Let','it ','be'> >())</pre><p>
|
||||
</p></div><div class="refsect3" title="Predicate_ < some_stl_compatible_functor >"><a name="d0e7419"></a><h4>Predicate_ < some_stl_compatible_functor ></h4><p>This functor eUML-enables a STL functor (for use in an algorithm).
|
||||
</p></div><div class="refsect3" title="Predicate_ < some_stl_compatible_functor >"><a name="d0e7445"></a><h4>Predicate_ < some_stl_compatible_functor ></h4><p>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.</p><p>Example:</p><pre class="programlisting">//equivalent to:
|
||||
//std::accumulate(fsm.m_vec.begin(),fsm.m_vec.end(),1,std::plus<int>())== 1
|
||||
accumulate_(begin_(fsm_(m_vec)),end_(fsm_(m_vec)),Int_<1>(),
|
||||
Predicate_<std::plus<int> >()) == Int_<1>())</pre></div><div class="refsect3" title="process_"><a name="d0e7428"></a><h4>process_</h4><p>This function sends an event to up to 4 state machines by calling
|
||||
Predicate_<std::plus<int> >()) == Int_<1>())</pre></div><div class="refsect3" title="process_"><a name="d0e7454"></a><h4>process_</h4><p>This function sends an event to up to 4 state machines by calling
|
||||
<code class="code">process_event</code> on them:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">process_(some_event)</code> : processes an event in
|
||||
the current (containing) state machine.</p></li><li class="listitem"><p><code class="code">process_(some_event [,fsm1...fsm4] )</code> :
|
||||
processes the same event in the 1-4 state machines passed as
|
||||
argument.</p></li></ul></div></div><div class="refsect3" title="process2_"><a name="d0e7447"></a><h4>process2_</h4><p>This function sends an event to up to 3 state machines by calling
|
||||
argument.</p></li></ul></div></div><div class="refsect3" title="process2_"><a name="d0e7473"></a><h4>process2_</h4><p>This function sends an event to up to 3 state machines by calling
|
||||
<code class="code">process_event</code> on them and copy-constructing the event
|
||||
from the data passed as second parameter:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">process2_(some_event, some_data)</code> : processes
|
||||
an event in the current (containing) state machine.</p></li><li class="listitem"><p><code class="code">process2_(some_event, some_data [,fsm1...fsm3]
|
||||
@@ -593,24 +593,24 @@ accumulate_(begin_(fsm_(m_vec)),end_(fsm_(m_vec)),Int_<1>(),
|
||||
// copy-constructed with event.m_song
|
||||
process2_(NotFound,event_(m_song))</pre><p>
|
||||
</p><p>With the following definitions:</p><pre class="programlisting">BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::string,m_song)//declaration of m_song
|
||||
NotFound (const string& data) // copy-constructor of NotFound</pre></div><div class="refsect3" title="is_flag_"><a name="d0e7477"></a><h4>is_flag_</h4><p>This function tells if a flag is active by calling
|
||||
NotFound (const string& data) // copy-constructor of NotFound</pre></div><div class="refsect3" title="is_flag_"><a name="d0e7503"></a><h4>is_flag_</h4><p>This function tells if a flag is active by calling
|
||||
<code class="code">is_flag_active</code> on the current state machine or one
|
||||
passed as parameter:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">is_flag_(some_flag)</code> : calls
|
||||
<code class="code">is_flag_active</code> on the current (containing)
|
||||
state machine.</p></li><li class="listitem"><p><code class="code">is_flag_(some_flag, some_fsm)</code> :calls
|
||||
<code class="code">is_flag_active</code> on the state machine.passed
|
||||
as argument.</p></li></ul></div></div><div class="refsect3" title="defer_"><a name="d0e7502"></a><h4>defer_</h4><p>This object defers the current event by calling
|
||||
as argument.</p></li></ul></div></div><div class="refsect3" title="defer_"><a name="d0e7528"></a><h4>defer_</h4><p>This object defers the current event by calling
|
||||
<code class="code">defer_event</code> on the current state machine.
|
||||
Example:</p><pre class="programlisting">Empty() + play() / defer_</pre></div><div class="refsect3" title="explicit_(submachine-name,state-name)"><a name="d0e7512"></a><h4>explicit_(submachine-name,state-name)</h4><p>Used as transition's target, causes an explicit entry into the given
|
||||
Example:</p><pre class="programlisting">Empty() + play() / defer_</pre></div><div class="refsect3" title="explicit_(submachine-name,state-name)"><a name="d0e7538"></a><h4>explicit_(submachine-name,state-name)</h4><p>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.</p></div><div class="refsect3" title="entry_pt_(submachine-name,state-name)"><a name="d0e7517"></a><h4>entry_pt_(submachine-name,state-name)</h4><p>Used as transition's target from a containing state machine, causes
|
||||
BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE.</p></div><div class="refsect3" title="entry_pt_(submachine-name,state-name)"><a name="d0e7543"></a><h4>entry_pt_(submachine-name,state-name)</h4><p>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.</p></div><div class="refsect3" title="exit_pt_(submachine-name,state-name)"><a name="d0e7522"></a><h4>exit_pt_(submachine-name,state-name)</h4><p>Used as transition's source from a containing state machine, causes
|
||||
BOOST_MSM_EUML_ENTRY_STATE.</p></div><div class="refsect3" title="exit_pt_(submachine-name,state-name)"><a name="d0e7548"></a><h4>exit_pt_(submachine-name,state-name)</h4><p>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.</p></div><div class="refsect3" title="MSM_EUML_FUNCTION"><a name="d0e7527"></a><h4>MSM_EUML_FUNCTION</h4><p>This macro creates a eUML function and a functor for use with the
|
||||
BOOST_MSM_EUML_EXIT_STATE.</p></div><div class="refsect3" title="MSM_EUML_FUNCTION"><a name="d0e7553"></a><h4>MSM_EUML_FUNCTION</h4><p>This macro creates a eUML function and a functor for use with the
|
||||
functor front-end, based on a free function:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>first parameter: the name of the functor</p></li><li class="listitem"><p>second parameter: the underlying function</p></li><li class="listitem"><p>third parameter: the eUML function name</p></li><li class="listitem"><p>fourth parameter: the return type if used in a transition
|
||||
behavior</p></li><li class="listitem"><p>fifth parameter: the return type if used in a state
|
||||
behavior (entry/exit)</p></li></ul></div><p> Note that the function itself can take up to 5
|
||||
@@ -618,7 +618,7 @@ NotFound (const string& data) // copy-constructor of NotFound</pre></div><di
|
||||
</p><pre class="programlisting">MSM_EUML_FUNCTION(BinarySearch_,std::binary_search,binary_search_,bool,bool)</pre><p>
|
||||
</p><p>Can be used like:</p><p>
|
||||
</p><pre class="programlisting">binary_search_(begin_(fsm_(m_var)),end_(fsm_(m_var)),Int_<9>())</pre><p>
|
||||
</p></div><div class="refsect3" title="MSM_EUML_METHOD"><a name="d0e7563"></a><h4>MSM_EUML_METHOD</h4><p>This macro creates a eUML function and a functor for use with the
|
||||
</p></div><div class="refsect3" title="MSM_EUML_METHOD"><a name="d0e7589"></a><h4>MSM_EUML_METHOD</h4><p>This macro creates a eUML function and a functor for use with the
|
||||
functor front-end, based on a method:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>first parameter: the name of the functor</p></li><li class="listitem"><p>second parameter: the underlying function</p></li><li class="listitem"><p>third parameter: the eUML function name</p></li><li class="listitem"><p>fourth parameter: the return type if used in a transition
|
||||
behavior</p></li><li class="listitem"><p>fifth parameter: the return type if used in a state
|
||||
behavior (entry/exit)</p></li></ul></div><p> Note that the method itself can take up to 4 arguments
|
||||
@@ -630,40 +630,40 @@ NotFound (const string& data) // copy-constructor of NotFound</pre></div><di
|
||||
};
|
||||
MSM_EUML_METHOD(ActivateEmpty_,activate_empty,activate_empty_,void,void)</pre><p>Can be used like:</p><p>
|
||||
</p><pre class="programlisting">Empty == Open + open_close / (close_drawer , activate_empty_(target_))</pre><p>
|
||||
</p></div><div class="refsect3" title="BOOST_MSM_EUML_ACTION(action-instance-name)"><a name="d0e7596"></a><h4>BOOST_MSM_EUML_ACTION(action-instance-name)</h4><p>This macro declares a behavior type and a const instance for use in
|
||||
</p></div><div class="refsect3" title="BOOST_MSM_EUML_ACTION(action-instance-name)"><a name="d0e7622"></a><h4>BOOST_MSM_EUML_ACTION(action-instance-name)</h4><p>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:</p><pre class="programlisting">BOOST_MSM_EUML_ACTION(good_disk_format)
|
||||
{
|
||||
template <class Fsm,class Evt,class SourceState,class TargetState>
|
||||
void/bool operator()(Evt const& evt,Fsm&,SourceState& ,TargetState& ){...}
|
||||
};</pre></div><div class="refsect3" title="BOOST_MSM_EUML_FLAG(flag-instance-name)"><a name="d0e7603"></a><h4>BOOST_MSM_EUML_FLAG(flag-instance-name)</h4><p>This macro declares a flag type and a const instance for use in
|
||||
behaviors.</p></div><div class="refsect3" title="BOOST_MSM_EUML_FLAG_NAME(flag-instance-name)"><a name="d0e7608"></a><h4>BOOST_MSM_EUML_FLAG_NAME(flag-instance-name)</h4><p>This macro returns the name of the flag type generated by
|
||||
};</pre></div><div class="refsect3" title="BOOST_MSM_EUML_FLAG(flag-instance-name)"><a name="d0e7629"></a><h4>BOOST_MSM_EUML_FLAG(flag-instance-name)</h4><p>This macro declares a flag type and a const instance for use in
|
||||
behaviors.</p></div><div class="refsect3" title="BOOST_MSM_EUML_FLAG_NAME(flag-instance-name)"><a name="d0e7634"></a><h4>BOOST_MSM_EUML_FLAG_NAME(flag-instance-name)</h4><p>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:</p><pre class="programlisting">fsm.is_flag_active<BOOST_MSM_EUML_FLAG_NAME(CDLoaded)>()</pre></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_ATTRIBUTE(event-type,event-name)"><a name="d0e7615"></a><h4>BOOST_MSM_EUML_DECLARE_ATTRIBUTE(event-type,event-name)</h4><p>This macro declares an attribute called event-name of type event-type.
|
||||
with the back-end method is_flag_active). For example:</p><pre class="programlisting">fsm.is_flag_active<BOOST_MSM_EUML_FLAG_NAME(CDLoaded)>()</pre></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_ATTRIBUTE(event-type,event-name)"><a name="d0e7641"></a><h4>BOOST_MSM_EUML_DECLARE_ATTRIBUTE(event-type,event-name)</h4><p>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.</p></div><div class="refsect3" title="BOOST_MSM_EUML_ATTRIBUTES(attributes-expression,attributes-name)"><a name="d0e7620"></a><h4>BOOST_MSM_EUML_ATTRIBUTES(attributes-expression,attributes-name)</h4><p>This macro declares an attribute list called attributes-name based on
|
||||
BOOST_MSM_EUML_ATTRIBUTES.</p></div><div class="refsect3" title="BOOST_MSM_EUML_ATTRIBUTES(attributes-expression,attributes-name)"><a name="d0e7646"></a><h4>BOOST_MSM_EUML_ATTRIBUTES(attributes-expression,attributes-name)</h4><p>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.</p><p>Attributes are added using left-shift, for example:</p><pre class="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_ << m_song ), FoundDef)</pre></div><div class="refsect3" title="BOOST_MSM_EUML_EVENT(event-instance name)"><a name="d0e7629"></a><h4>BOOST_MSM_EUML_EVENT(event-instance name)</h4><p>This macro defines an event type (event-instance-name_helper) and
|
||||
BOOST_MSM_EUML_ATTRIBUTES((attributes_ << m_song ), FoundDef)</pre></div><div class="refsect3" title="BOOST_MSM_EUML_EVENT(event-instance name)"><a name="d0e7655"></a><h4>BOOST_MSM_EUML_EVENT(event-instance name)</h4><p>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.</p></div><div class="refsect3" title="BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(event-instance-name,attributes)"><a name="d0e7634"></a><h4>BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(event-instance-name,attributes)</h4><p>This macro defines an event type (event-instance-name_helper) and
|
||||
for use in a transition table or state behaviors.</p></div><div class="refsect3" title="BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(event-instance-name,attributes)"><a name="d0e7660"></a><h4>BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(event-instance-name,attributes)</h4><p>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:</p><p><code class="code">BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(Found,FoundDef)</code>
|
||||
</p><p>The created event instance supports operator()(attributes) so that
|
||||
</p><pre class="programlisting">my_back_end.process_event(Found(some_string))</pre><p>
|
||||
is possible.</p></div><div class="refsect3" title="BOOST_MSM_EUML_EVENT_NAME(event-instance-name)"><a name="d0e7648"></a><h4>BOOST_MSM_EUML_EVENT_NAME(event-instance-name)</h4><p>This macro returns the name of the event type generated by
|
||||
is possible.</p></div><div class="refsect3" title="BOOST_MSM_EUML_EVENT_NAME(event-instance-name)"><a name="d0e7674"></a><h4>BOOST_MSM_EUML_EVENT_NAME(event-instance-name)</h4><p>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:</p><p>
|
||||
</p><pre class="programlisting">typedef msm::back::state_machine<Playing_,
|
||||
msm::back::ShallowHistory<mpl::vector<BOOST_MSM_EUML_EVENT_NAME(end_pause)
|
||||
> > > Playing_type;</pre><p>
|
||||
</p></div><div class="refsect3" title="BOOST_MSM_EUML_STATE(build-expression,state-instance-name)"><a name="d0e7658"></a><h4>BOOST_MSM_EUML_STATE(build-expression,state-instance-name)</h4><p>This macro defines a state type (state-instance-name_helper) and
|
||||
</p></div><div class="refsect3" title="BOOST_MSM_EUML_STATE(build-expression,state-instance-name)"><a name="d0e7684"></a><h4>BOOST_MSM_EUML_STATE(build-expression,state-instance-name)</h4><p>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.</p><p>There are several possibilitites for the expression syntax:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>(): state without entry or exit action.</p></li><li class="listitem"><p>(Expr1): state with entry but no exit action.</p></li><li class="listitem"><p>(Expr1,Expr2): state with entry and exit action.</p></li><li class="listitem"><p>(Expr1,Expr2,Attributes): state with entry and exit
|
||||
action, defining some attributes.</p></li><li class="listitem"><p>(Expr1,Expr2,Attributes,Configure): state with entry and
|
||||
@@ -672,7 +672,7 @@ msm::back::ShallowHistory<mpl::vector<BOOST_MSM_EUML_EVENT_NAME(end_pause)
|
||||
events).</p></li><li class="listitem"><p>(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).</p></li></ul></div></div><div class="refsect3" title="BOOST_MSM_EUML_INTERRUPT_STATE(build-expression,state-instance-name)"><a name="d0e7684"></a><h4>BOOST_MSM_EUML_INTERRUPT_STATE(build-expression,state-instance-name)</h4><p>This macro defines an interrupt state type
|
||||
non-default base state (as defined in standard MSM).</p></li></ul></div></div><div class="refsect3" title="BOOST_MSM_EUML_INTERRUPT_STATE(build-expression,state-instance-name)"><a name="d0e7710"></a><h4>BOOST_MSM_EUML_INTERRUPT_STATE(build-expression,state-instance-name)</h4><p>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.</p><p>There are several possibilitites for the expression syntax. In all of
|
||||
@@ -689,7 +689,7 @@ msm::back::ShallowHistory<mpl::vector<BOOST_MSM_EUML_EVENT_NAME(end_pause)
|
||||
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).</p></li></ul></div></div><div class="refsect3" title="BOOST_MSM_EUML_TERMINATE_STATE(build-expression,state-instance-name)"><a name="d0e7710"></a><h4>BOOST_MSM_EUML_TERMINATE_STATE(build-expression,state-instance-name)</h4><p>This macro defines a terminate pseudo-state type
|
||||
MSM).</p></li></ul></div></div><div class="refsect3" title="BOOST_MSM_EUML_TERMINATE_STATE(build-expression,state-instance-name)"><a name="d0e7736"></a><h4>BOOST_MSM_EUML_TERMINATE_STATE(build-expression,state-instance-name)</h4><p>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.</p><p>There are several possibilitites for the expression syntax:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>(): terminate pseudo-state without entry or exit
|
||||
@@ -703,7 +703,7 @@ msm::back::ShallowHistory<mpl::vector<BOOST_MSM_EUML_EVENT_NAME(end_pause)
|
||||
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).</p></li></ul></div></div><div class="refsect3" title="BOOST_MSM_EUML_EXIT_STATE(build-expression,state-instance-name)"><a name="d0e7736"></a><h4>BOOST_MSM_EUML_EXIT_STATE(build-expression,state-instance-name)</h4><p>This macro defines an exit pseudo-state type
|
||||
MSM).</p></li></ul></div></div><div class="refsect3" title="BOOST_MSM_EUML_EXIT_STATE(build-expression,state-instance-name)"><a name="d0e7762"></a><h4>BOOST_MSM_EUML_EXIT_STATE(build-expression,state-instance-name)</h4><p>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.</p><p>There are several possibilitites for the expression syntax:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>(forwarded_event):exit pseudo-state without entry or exit
|
||||
@@ -719,7 +719,7 @@ msm::back::ShallowHistory<mpl::vector<BOOST_MSM_EUML_EVENT_NAME(end_pause)
|
||||
attributes, flags and deferred events (plain msm deferred
|
||||
events) and a non-default base state (as defined in standard
|
||||
MSM).</p></li></ul></div><p>Note that the forwarded_event must be constructible from the event
|
||||
sent by the submachine containing the exit point.</p></div><div class="refsect3" title="BOOST_MSM_EUML_ENTRY_STATE(int region-index,build-expression,state-instance-name)"><a name="d0e7764"></a><h4>BOOST_MSM_EUML_ENTRY_STATE(int
|
||||
sent by the submachine containing the exit point.</p></div><div class="refsect3" title="BOOST_MSM_EUML_ENTRY_STATE(int region-index,build-expression,state-instance-name)"><a name="d0e7790"></a><h4>BOOST_MSM_EUML_ENTRY_STATE(int
|
||||
region-index,build-expression,state-instance-name)</h4><p>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
|
||||
@@ -734,7 +734,7 @@ msm::back::ShallowHistory<mpl::vector<BOOST_MSM_EUML_EVENT_NAME(end_pause)
|
||||
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).</p></li></ul></div></div><div class="refsect3" title="BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE(int region-index,build-expression,state-instance-name)"><a name="d0e7790"></a><h4>BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE(int
|
||||
MSM).</p></li></ul></div></div><div class="refsect3" title="BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE(int region-index,build-expression,state-instance-name)"><a name="d0e7816"></a><h4>BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE(int
|
||||
region-index,build-expression,state-instance-name)</h4><p>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
|
||||
@@ -745,28 +745,28 @@ msm::back::ShallowHistory<mpl::vector<BOOST_MSM_EUML_EVENT_NAME(end_pause)
|
||||
events).</p></li><li class="listitem"><p>(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).</p></li></ul></div></div><div class="refsect3" title="BOOST_MSM_EUML_STATE_NAME(state-instance-name)"><a name="d0e7816"></a><h4>BOOST_MSM_EUML_STATE_NAME(state-instance-name)</h4><p>This macro returns the name of the state type generated by
|
||||
non-default base state (as defined in standard MSM).</p></li></ul></div></div><div class="refsect3" title="BOOST_MSM_EUML_STATE_NAME(state-instance-name)"><a name="d0e7842"></a><h4>BOOST_MSM_EUML_STATE_NAME(state-instance-name)</h4><p>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:</p><p>
|
||||
</p><pre class="programlisting">fsm.get_state<BOOST_MSM_EUML_STATE_NAME(StringFind)&>().some_state_function();</pre><p>
|
||||
</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_STATE(build-expression,state-instance-name)"><a name="d0e7826"></a><h4>BOOST_MSM_EUML_DECLARE_STATE(build-expression,state-instance-name)</h4><p>Like BOOST_MSM_EUML_STATE but does not provide an instance, simply a
|
||||
type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_INTERRUPT_STATE(build-expression,state-instance-name)"><a name="d0e7831"></a><h4>BOOST_MSM_EUML_DECLARE_INTERRUPT_STATE(build-expression,state-instance-name)</h4><p>Like BOOST_MSM_EUML_INTERRUPT_STATE but does not provide an instance,
|
||||
simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_TERMINATE_STATE(build-expression,state-instance-name)"><a name="d0e7836"></a><h4>BOOST_MSM_EUML_DECLARE_TERMINATE_STATE(build-expression,state-instance-name)</h4><p>Like BOOST_MSM_EUML_TERMINATE_STATE but does not provide an instance,
|
||||
simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_EXIT_STATE(build-expression,state-instance-name)"><a name="d0e7841"></a><h4>BOOST_MSM_EUML_DECLARE_EXIT_STATE(build-expression,state-instance-name)</h4><p>Like BOOST_MSM_EUML_EXIT_STATE but does not provide an instance,
|
||||
simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_ENTRY_STATE(int region-index,build-expression,state-instance-name)"><a name="d0e7846"></a><h4>BOOST_MSM_EUML_DECLARE_ENTRY_STATE(int
|
||||
</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_STATE(build-expression,state-instance-name)"><a name="d0e7852"></a><h4>BOOST_MSM_EUML_DECLARE_STATE(build-expression,state-instance-name)</h4><p>Like BOOST_MSM_EUML_STATE but does not provide an instance, simply a
|
||||
type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_INTERRUPT_STATE(build-expression,state-instance-name)"><a name="d0e7857"></a><h4>BOOST_MSM_EUML_DECLARE_INTERRUPT_STATE(build-expression,state-instance-name)</h4><p>Like BOOST_MSM_EUML_INTERRUPT_STATE but does not provide an instance,
|
||||
simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_TERMINATE_STATE(build-expression,state-instance-name)"><a name="d0e7862"></a><h4>BOOST_MSM_EUML_DECLARE_TERMINATE_STATE(build-expression,state-instance-name)</h4><p>Like BOOST_MSM_EUML_TERMINATE_STATE but does not provide an instance,
|
||||
simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_EXIT_STATE(build-expression,state-instance-name)"><a name="d0e7867"></a><h4>BOOST_MSM_EUML_DECLARE_EXIT_STATE(build-expression,state-instance-name)</h4><p>Like BOOST_MSM_EUML_EXIT_STATE but does not provide an instance,
|
||||
simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_ENTRY_STATE(int region-index,build-expression,state-instance-name)"><a name="d0e7872"></a><h4>BOOST_MSM_EUML_DECLARE_ENTRY_STATE(int
|
||||
region-index,build-expression,state-instance-name)</h4><p>Like BOOST_MSM_EUML_ENTRY_STATE but does not provide an instance,
|
||||
simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_EXPLICIT_ENTRY_STATE(int region-index,build-expression,state-instance-name)"><a name="d0e7851"></a><h4>BOOST_MSM_EUML_DECLARE_EXPLICIT_ENTRY_STATE(int
|
||||
simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_EXPLICIT_ENTRY_STATE(int region-index,build-expression,state-instance-name)"><a name="d0e7877"></a><h4>BOOST_MSM_EUML_DECLARE_EXPLICIT_ENTRY_STATE(int
|
||||
region-index,build-expression,state-instance-name)</h4><p>Like BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE but does not provide an
|
||||
instance, simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_TRANSITION_TABLE(expression, table-instance-name)"><a name="d0e7856"></a><h4>BOOST_MSM_EUML_TRANSITION_TABLE(expression,
|
||||
instance, simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_TRANSITION_TABLE(expression, table-instance-name)"><a name="d0e7882"></a><h4>BOOST_MSM_EUML_TRANSITION_TABLE(expression,
|
||||
table-instance-name)</h4><p>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 <span class="command"><strong><a class="command" href="re03.html#reference-stt-grammar">transition
|
||||
table grammar</a></strong></span>.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(iexpression,table-instance-name)"><a name="d0e7864"></a><h4>BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(iexpression,table-instance-name)</h4><p>Like BOOST_MSM_EUML_TRANSITION_TABLE but does not provide an instance,
|
||||
simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expression, table-instance-name)"><a name="d0e7869"></a><h4>BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expression,
|
||||
table grammar</a></strong></span>.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(iexpression,table-instance-name)"><a name="d0e7890"></a><h4>BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(iexpression,table-instance-name)</h4><p>Like BOOST_MSM_EUML_TRANSITION_TABLE but does not provide an instance,
|
||||
simply a type declaration.</p></div><div class="refsect3" title="BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expression, table-instance-name)"><a name="d0e7895"></a><h4>BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expression,
|
||||
table-instance-name)</h4><p>This macro declares a transition table type and also declares a const
|
||||
instance of the table.The expression must follow the <span class="command"><strong><a class="command" href="re03.html#reference-stt-grammar">transition table
|
||||
grammar</a></strong></span>. For the moment, this macro is not used.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(iexpression,table-instance-name)"><a name="d0e7877"></a><h4>BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(iexpression,table-instance-name)</h4><p>Like BOOST_MSM_EUML_TRANSITION_TABLE but does not provide an instance,
|
||||
grammar</a></strong></span>. For the moment, this macro is not used.</p></div><div class="refsect3" title="BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(iexpression,table-instance-name)"><a name="d0e7903"></a><h4>BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(iexpression,table-instance-name)</h4><p>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:</p><pre class="programlisting">BOOST_MSM_EUML_DECLARE_STATE((Open_Entry,Open_Exit),Open_def)
|
||||
struct Open_impl : public Open_def
|
||||
|
||||
169
doc/PDF/examples/SimpleTutorialWithEumlTableKleene.cpp
Normal file
169
doc/PDF/examples/SimpleTutorialWithEumlTableKleene.cpp
Normal file
@@ -0,0 +1,169 @@
|
||||
#include <iostream>
|
||||
// back-end
|
||||
#include <boost/msm/back/state_machine.hpp>
|
||||
//front-end
|
||||
#include <boost/msm/front/state_machine_def.hpp>
|
||||
#include <boost/msm/front/euml/euml.hpp>
|
||||
|
||||
namespace msm = boost::msm;
|
||||
namespace mpl = boost::mpl;
|
||||
using namespace std;
|
||||
using namespace msm::front::euml;
|
||||
|
||||
// entry/exit/action/guard logging functors
|
||||
#include "logging_functors.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
// events
|
||||
struct play_impl : msm::front::euml::euml_event<play_impl> {};
|
||||
struct end_pause_impl : msm::front::euml::euml_event<end_pause_impl>{};
|
||||
struct stop_impl : msm::front::euml::euml_event<stop_impl>{};
|
||||
struct pause_impl : msm::front::euml::euml_event<pause_impl>{};
|
||||
struct open_close_impl : msm::front::euml::euml_event<open_close_impl>{};
|
||||
struct cd_detected_impl : msm::front::euml::euml_event<cd_detected_impl>{};
|
||||
|
||||
// define some dummy instances for use in the transition table
|
||||
// it is also possible to default-construct them instead:
|
||||
// struct play {};
|
||||
// inside the table: play()
|
||||
play_impl play;
|
||||
end_pause_impl end_pause;
|
||||
stop_impl stop;
|
||||
pause_impl pause;
|
||||
open_close_impl open_close;
|
||||
cd_detected_impl cd_detected;
|
||||
|
||||
// The list of FSM states
|
||||
// they have to be declared outside of the front-end only to make VC happy :(
|
||||
// note: gcc would have no problem
|
||||
struct Empty_impl : public msm::front::state<> , public msm::front::euml::euml_state<Empty_impl>
|
||||
{
|
||||
// every (optional) entry/exit methods get the event passed.
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const&,FSM& ) {std::cout << "entering: Empty" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Empty" << std::endl;}
|
||||
};
|
||||
struct Open_impl : public msm::front::state<> , public msm::front::euml::euml_state<Open_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const& ,FSM&) {std::cout << "entering: Open" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Open" << std::endl;}
|
||||
};
|
||||
|
||||
struct Stopped_impl : public msm::front::state<> , public msm::front::euml::euml_state<Stopped_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const& ,FSM&) {std::cout << "entering: Stopped" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Stopped" << std::endl;}
|
||||
};
|
||||
|
||||
struct Playing_impl : public msm::front::state<> , public msm::front::euml::euml_state<Playing_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const&,FSM& ) {std::cout << "entering: Playing" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Playing" << std::endl;}
|
||||
};
|
||||
|
||||
// state not defining any entry or exit
|
||||
struct Paused_impl : public msm::front::state<> , public msm::front::euml::euml_state<Paused_impl>
|
||||
{
|
||||
};
|
||||
//to make the transition table more readable
|
||||
Empty_impl const Empty;
|
||||
Open_impl const Open;
|
||||
Stopped_impl const Stopped;
|
||||
Playing_impl const Playing;
|
||||
Paused_impl const Paused;
|
||||
|
||||
BOOST_MSM_EUML_ACTION(pause_playback2)
|
||||
{
|
||||
template <class FSM,class EVT,class SourceState,class TargetState>
|
||||
void operator()(EVT const& evt,FSM&,SourceState& ,TargetState& )
|
||||
{
|
||||
cout << "player::pause_playback2" << endl;
|
||||
std::cout << "event type: " << typeid(EVT).name() << std::endl;
|
||||
std::cout << "pause_playback2 with any event: " << evt.type().name() << std::endl;
|
||||
}
|
||||
};
|
||||
// front-end: define the FSM structure
|
||||
struct player_ : public msm::front::state_machine_def<player_>
|
||||
{
|
||||
|
||||
// the initial state of the player SM. Must be defined
|
||||
typedef Empty_impl initial_state;
|
||||
|
||||
// Transition table for player
|
||||
// replaces the old transition table
|
||||
BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE((
|
||||
Stopped + play / 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 /(store_cd_info,
|
||||
msm::front::euml::process_(play)) == Stopped ,
|
||||
// +------------------------------------------------------------------------------+
|
||||
Playing + stop / stop_playback == Stopped ,
|
||||
Playing + kleene / pause_playback2 == Paused ,
|
||||
Playing + open_close / stop_and_open == Open ,
|
||||
// +------------------------------------------------------------------------------+
|
||||
Paused + end_pause / resume_playback == Playing ,
|
||||
Paused + stop / stop_playback == Stopped ,
|
||||
Paused + open_close / stop_and_open == Open
|
||||
// +------------------------------------------------------------------------------+
|
||||
),transition_table)
|
||||
|
||||
// Replaces the default no-transition response.
|
||||
template <class FSM,class Event>
|
||||
void no_transition(Event const& e, FSM&,int state)
|
||||
{
|
||||
std::cout << "no transition from state " << state
|
||||
<< " on event " << typeid(e).name() << std::endl;
|
||||
}
|
||||
};
|
||||
// Pick a back-end
|
||||
typedef msm::back::state_machine<player_> player;
|
||||
|
||||
//
|
||||
// Testing utilities.
|
||||
//
|
||||
static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused" };
|
||||
void pstate(player const& p)
|
||||
{
|
||||
std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
|
||||
}
|
||||
|
||||
void test()
|
||||
{
|
||||
player p;
|
||||
// needed to start the highest-level SM. This will call on_entry and mark the start of the SM
|
||||
p.start();
|
||||
// go to Open, call on_exit on Empty, then action, then on_entry on Open
|
||||
p.process_event(open_close); pstate(p);
|
||||
p.process_event(open_close); pstate(p);
|
||||
p.process_event(cd_detected); pstate(p);
|
||||
|
||||
// at this point, Play is active
|
||||
p.process_event(pause); pstate(p);
|
||||
// go back to Playing
|
||||
p.process_event(end_pause); pstate(p);
|
||||
p.process_event(pause); pstate(p);
|
||||
p.process_event(stop); pstate(p);
|
||||
// event leading to the same state
|
||||
// no action method called as it is not present in the transition table
|
||||
p.process_event(stop); pstate(p);
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test();
|
||||
return 0;
|
||||
}
|
||||
205
doc/PDF/examples/SimpleTutorialWithEumlTableTypeErasure.cpp
Normal file
205
doc/PDF/examples/SimpleTutorialWithEumlTableTypeErasure.cpp
Normal file
@@ -0,0 +1,205 @@
|
||||
#include <iostream>
|
||||
// back-end
|
||||
#include <boost/msm/back/state_machine.hpp>
|
||||
//front-end
|
||||
#include <boost/msm/front/state_machine_def.hpp>
|
||||
#include <boost/msm/front/euml/euml.hpp>
|
||||
#include <boost/msm/event_traits.hpp>
|
||||
|
||||
#include <boost/type_erasure/any.hpp>
|
||||
#include <boost/type_erasure/member.hpp>
|
||||
#include <boost/type_erasure/builtin.hpp>
|
||||
#include <boost/type_erasure/constructible.hpp>
|
||||
#include <boost/type_erasure/relaxed_match.hpp>
|
||||
#include <boost/type_erasure/any_cast.hpp>
|
||||
|
||||
namespace msm = boost::msm;
|
||||
namespace mpl = boost::mpl;
|
||||
using namespace std;
|
||||
using namespace msm::front::euml;
|
||||
|
||||
// entry/exit/action/guard logging functors
|
||||
#include "logging_functors.h"
|
||||
|
||||
BOOST_TYPE_ERASURE_MEMBER((has_getNumber), getNumber, 0);
|
||||
//type erasure event
|
||||
typedef ::boost::mpl::vector<
|
||||
has_getNumber<int(), const boost::type_erasure::_self>,
|
||||
boost::type_erasure::relaxed_match,
|
||||
boost::type_erasure::copy_constructible<>,
|
||||
boost::type_erasure::typeid_<>
|
||||
> any_number_event_concept;
|
||||
struct any_number_event : boost::type_erasure::any<any_number_event_concept>,
|
||||
msm::front::euml::euml_event<any_number_event>
|
||||
{
|
||||
template <class U>
|
||||
any_number_event(U const& u): boost::type_erasure::any<any_number_event_concept> (u){}
|
||||
any_number_event(): boost::type_erasure::any<any_number_event_concept> (){}
|
||||
};
|
||||
|
||||
|
||||
namespace boost { namespace msm{
|
||||
template<>
|
||||
struct is_kleene_event< any_number_event >
|
||||
{
|
||||
typedef boost::mpl::true_ type;
|
||||
};
|
||||
}}
|
||||
|
||||
namespace
|
||||
{
|
||||
// events
|
||||
struct play_impl : msm::front::euml::euml_event<play_impl> {int getNumber()const {return 0;}};
|
||||
struct end_pause_impl : msm::front::euml::euml_event<end_pause_impl>{int getNumber()const {return 1;}};
|
||||
struct stop_impl : msm::front::euml::euml_event<stop_impl>{int getNumber()const {return 2;}};
|
||||
struct pause_impl : msm::front::euml::euml_event<pause_impl>{int getNumber()const {return 3;}};
|
||||
struct open_close_impl : msm::front::euml::euml_event<open_close_impl>{int getNumber()const {return 4;}};
|
||||
struct cd_detected_impl : msm::front::euml::euml_event<cd_detected_impl>{int getNumber()const {return 5;}};
|
||||
|
||||
// define some dummy instances for use in the transition table
|
||||
// it is also possible to default-construct them instead:
|
||||
// struct play {};
|
||||
// inside the table: play()
|
||||
play_impl play;
|
||||
end_pause_impl end_pause;
|
||||
stop_impl stop;
|
||||
pause_impl pause;
|
||||
open_close_impl open_close;
|
||||
cd_detected_impl cd_detected;
|
||||
any_number_event number_event;
|
||||
|
||||
// The list of FSM states
|
||||
// they have to be declared outside of the front-end only to make VC happy :(
|
||||
// note: gcc would have no problem
|
||||
struct Empty_impl : public msm::front::state<> , public msm::front::euml::euml_state<Empty_impl>
|
||||
{
|
||||
// every (optional) entry/exit methods get the event passed.
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const&,FSM& ) {std::cout << "entering: Empty" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Empty" << std::endl;}
|
||||
};
|
||||
struct Open_impl : public msm::front::state<> , public msm::front::euml::euml_state<Open_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const& ,FSM&) {std::cout << "entering: Open" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Open" << std::endl;}
|
||||
};
|
||||
|
||||
struct Stopped_impl : public msm::front::state<> , public msm::front::euml::euml_state<Stopped_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const& ,FSM&) {std::cout << "entering: Stopped" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Stopped" << std::endl;}
|
||||
};
|
||||
|
||||
struct Playing_impl : public msm::front::state<> , public msm::front::euml::euml_state<Playing_impl>
|
||||
{
|
||||
template <class Event,class FSM>
|
||||
void on_entry(Event const&,FSM& ) {std::cout << "entering: Playing" << std::endl;}
|
||||
template <class Event,class FSM>
|
||||
void on_exit(Event const&,FSM& ) {std::cout << "leaving: Playing" << std::endl;}
|
||||
};
|
||||
|
||||
// state not defining any entry or exit
|
||||
struct Paused_impl : public msm::front::state<> , public msm::front::euml::euml_state<Paused_impl>
|
||||
{
|
||||
};
|
||||
//to make the transition table more readable
|
||||
Empty_impl const Empty;
|
||||
Open_impl const Open;
|
||||
Stopped_impl const Stopped;
|
||||
Playing_impl const Playing;
|
||||
Paused_impl const Paused;
|
||||
|
||||
BOOST_MSM_EUML_ACTION(pause_playback2)
|
||||
{
|
||||
template <class FSM,class EVT,class SourceState,class TargetState>
|
||||
void operator()(EVT const& evt,FSM&,SourceState& ,TargetState& )
|
||||
{
|
||||
cout << "player::pause_playback2" << endl;
|
||||
std::cout << "event type: " << typeid(EVT).name() << std::endl;
|
||||
std::cout << "event's number: " << evt.getNumber() << std::endl;
|
||||
}
|
||||
};
|
||||
// front-end: define the FSM structure
|
||||
struct player_ : public msm::front::state_machine_def<player_>
|
||||
{
|
||||
|
||||
// the initial state of the player SM. Must be defined
|
||||
typedef Empty_impl initial_state;
|
||||
|
||||
// Transition table for player
|
||||
// replaces the old transition table
|
||||
BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE((
|
||||
Stopped + play / 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 /(store_cd_info,
|
||||
msm::front::euml::process_(play)) == Stopped ,
|
||||
// +------------------------------------------------------------------------------+
|
||||
Playing + stop / stop_playback == Stopped ,
|
||||
Playing + number_event / pause_playback == Paused ,
|
||||
Playing + open_close / stop_and_open == Open ,
|
||||
// +------------------------------------------------------------------------------+
|
||||
Paused + end_pause / resume_playback == Playing ,
|
||||
Paused + stop / stop_playback == Stopped ,
|
||||
Paused + open_close / stop_and_open == Open
|
||||
// +------------------------------------------------------------------------------+
|
||||
),transition_table)
|
||||
|
||||
// Replaces the default no-transition response.
|
||||
template <class FSM,class Event>
|
||||
void no_transition(Event const& e, FSM&,int state)
|
||||
{
|
||||
std::cout << "no transition from state " << state
|
||||
<< " on event " << typeid(e).name() << std::endl;
|
||||
}
|
||||
};
|
||||
// Pick a back-end
|
||||
typedef msm::back::state_machine<player_> player;
|
||||
|
||||
//
|
||||
// Testing utilities.
|
||||
//
|
||||
static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused" };
|
||||
void pstate(player const& p)
|
||||
{
|
||||
std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
|
||||
}
|
||||
|
||||
void test()
|
||||
{
|
||||
player p;
|
||||
// needed to start the highest-level SM. This will call on_entry and mark the start of the SM
|
||||
p.start();
|
||||
// go to Open, call on_exit on Empty, then action, then on_entry on Open
|
||||
p.process_event(open_close); pstate(p);
|
||||
p.process_event(open_close); pstate(p);
|
||||
p.process_event(cd_detected); pstate(p);
|
||||
|
||||
// at this point, Play is active
|
||||
p.process_event(pause); pstate(p);
|
||||
// go back to Playing
|
||||
p.process_event(end_pause); pstate(p);
|
||||
p.process_event(pause); pstate(p);
|
||||
p.process_event(stop); pstate(p);
|
||||
// event leading to the same state
|
||||
// no action method called as it is not present in the transition table
|
||||
p.process_event(stop); pstate(p);
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
BIN
doc/PDF/msm.pdf
BIN
doc/PDF/msm.pdf
Binary file not shown.
@@ -1502,6 +1502,10 @@ struct event2
|
||||
<para>
|
||||
<programlisting>if (p.is_flag_active<CDLoaded,player::Flag_AND>()) ...</programlisting>
|
||||
</para>
|
||||
<para> Note. Due to arcane C++ rules, when called inside an action, the correct
|
||||
call is:
|
||||
<programlisting>if (p.<emphasis role="bold">template</emphasis> is_flag_active<CDLoaded>()) ...</programlisting>
|
||||
</para>
|
||||
<para>The following diagram displays the flag situation in the tutorial.</para>
|
||||
<para><inlinemediaobject>
|
||||
<imageobject>
|
||||
@@ -1698,7 +1702,7 @@ Row < Paused , open_close , Open , stop_and_open , none
|
||||
void operator()(Evt const&, Fsm& fsm, SourceState&,TargetState& )
|
||||
{
|
||||
cout << "player::store_cd_info" << endl;
|
||||
fsm.process_event(play());
|
||||
fsm.process_event(play());
|
||||
}
|
||||
}; </programlisting>
|
||||
<para>The advantage of functors compared to functions are that functors are
|
||||
@@ -3221,7 +3225,7 @@ BOOST_MSM_BACK_GENERATE_PROCESS_EVENT(mysubmachine)</programlisting>
|
||||
<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
|
||||
a 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>
|
||||
@@ -4027,6 +4031,23 @@ typename ::boost::enable_if<
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Version history</title>
|
||||
<sect1>
|
||||
<title>From V2.24 to V2.25 (Boost 1.54)</title>
|
||||
<para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Bugfix: Exit points broken for the favor_compile_time
|
||||
policy.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Bugfix: copy breaks exit points of subsubmachines.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Bugfix: Trac 8046.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>From V2.23 to V2.24 (Boost 1.51)</title>
|
||||
<para>
|
||||
@@ -6003,6 +6024,14 @@ for (unsigned int i=0;i<some_fsm::nr_regions::value;++i)
|
||||
<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>
|
||||
<programlisting>// we need a fsm's table
|
||||
typedef player::stt Stt;
|
||||
typedef msm::back::generate_state_set<Stt>::type all_states; //all states
|
||||
std::string name_of_open; // id of Open is 1
|
||||
// fill name_of_open for state of id 1
|
||||
boost::mpl::for_each<all_states,boost::msm::wrap<mpl::placeholders::_1> >
|
||||
(msm::back::get_state_name<Stt>(name_of_open,1));
|
||||
std::cout << "typeid-generated name Open is: " << name_of_open << std::endl;</programlisting>
|
||||
</refsect3>
|
||||
</refsect2>
|
||||
<refsect2>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||
<head>
|
||||
<title>Boost.MSM Documentation</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta http-equiv="refresh" content="0; URL=doc/HTML/index.html" />
|
||||
</head>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user