The Wayback Machine - https://web.archive.org/web/20060215071832/http://boost-sandbox.sourceforge.net:80/libs/statechart/doc/index.html

C++ Boost

The Boost Statechart Library

(formerly known as boost::fsm)

Overview

Version: 2005/12/17


Contents

Overview
Supported platforms
Incompatible compilers
Getting started
Audience
 
Tutorial [pdf: English, Japanese]
UML to Boost.Statechart mapping summary
Frequently Asked Questions (FAQs)
Configuration
Definitions
Reference [pdf: English]
Rationale [pdf: English]
Performance
Acknowledgments
 
To-do list
Change history

Overview

Welcome to Boost.Statechart, a C++ library for finite state machines. Features include:

Supported platforms

The library was tested on the following platforms (using boost distribution 1.33.0):

In addition, previous versions of the library have also been tested on the following platforms (I expect the current version to work, but it hasn't been tested yet):

Incompatible compilers

The following compilers are known to have problems with Boost.Statechart:

Getting started

Boost.Statechart builds on other parts of the boost library. In order to use this library, the statechart directories need to be copied to their respective locations in the tree of the boost distribution 1.33.0. Specifically:

  1. Follow the steps 1-3 described at http://www.boost.org/more/getting_started.html. After doing so, somewhere on your harddrive you should have a directory containing the boost distribution (e.g. under D:\Data\boost_1_33_0) and the bjam executable installed in your PATH
  2. Download http://boost-sandbox.sf.net/Statechart.zip and unpack it somewhere on your harddrive, e.g. under D:\Data\Statechart
  3. Copy the directory D:\Data\Statechart\boost\statechart and all its contents to D:\Data\boost_1_33_0\boost\statechart
  4. Copy the directory D:\Data\Statechart\libs\statechart and all its contents to D:\Data\boost_1_33_0\libs\statechart
  5. Open a command prompt and change the current directory to D:\Data\boost_1_33_0\libs\statechart\examples
  6. To compile the examples, invoke bjam with your toolset. For example, for MSVC7.1, type bjam "-sTOOLS=vc-7_1". This may take a few minutes. After the build has finished you will find all executables in D:\Data\boost_1_33_0\libs\statechart\examples\run. In addition to the examples discussed in the tutorial, this script also builds the Performance executable in different variants, which show the effects of various choices on runtime performance, executable size, etc. Moreover, the Handcrafted executable is also built, which serves to compare performance of a simple Boost.Statechart machine with its handcrafted equivalent. Finally, the BitMachine example shows that limitations of some compilers lead to a surprisingly low upper bound of the number of states a state machine implemented in a single translation unit can have
  7. Optional: To run the tests, invoke bjam in the directory D:\Data\boost_1_33_0\libs\statechart\test

Audience

Throughout all Boost.Statechart documentation it is assumed that the reader is familiar with the state machine concept, UML statecharts and most of the UML state machine terminology. The following links might be interesting if this is not the case:

Some of the used terminology cannot be found in the UML specifications, please see Definitions for more information.


To-do list

The library is mostly complete. However, there is some work left (red = added as a result of the formal review):

  1. Implement simple_state::triggering_event(), which returns a pointer to the event that triggered the action currently being executed. This is useful for the rare cases when an entry or exit action needs to access the event that triggered the execution of the action. triggering_event() returns a const event_base * due to the fact that entry and exit actions can be triggered by events of any type or no event at all (state_machine<>::initiate() & state_machine::terminate()). The caller thus needs to make a type check or cast the return value. The use of triggering_event() therefore often indicates a problem in the state machine design and should be avoided whenever possible
  2. Optimize state-entry and state-exit
  3. Reimplement fifo_scheduler<>::processor_handle so that fifo_scheduler<>::create_processor<>() and fifo_scheduler<>::destroy_processor() no longer make (indirect) calls to global operator new() and operator delete()
  4. Ensure that everything is compileable with C++ RTTI support turned off (this requires currently lacking support in Boost.Config and probably a patch for shared_ptr)
  5. Issue an error if BOOST_STATECHART_USE_NATIVE_RTTI is defined when C++ RTTI is turned off
  6. The current requirement to pass an mpl::list<> to specify inner initial states and reactions is too strict. Check the requirements on the sequences and document them accordingly (David Abrahams)
  7. Make compilation performance measurements with mpl::vector and mpl::deque instead of mpl::list to find out which is fastest. Document a recommendation for the fastest container and change all examples accordingly (David Abrahams)
  8. Investigate how a state machine could be serialized. A first glance at the serialization library revealed that there currently (1.33) is no support for types that overload operator new (suitable code is already present in the serialization library but it is currently commented out due to incompatibilities with certain compilers). Such support would be essential for Boost.Statechart serialization
  9. Implement a switch-like reaction (Simon Gittins, Darryl Green)
  10. Link incomplete code-snippets in the tutorial to complete example code where available
  11. Where appropriate, link the reference documentation to examples
  12. Add a description of the implementation and better explain performance trade-offs (Jonathan Turkanis)
  13. Add links to descriptions of alternate implementations and discuss performance trade-offs (Jonathan Turkanis)
  14. Add a list of applications that use Boost.Statechart (Paul A. Bristow)
  15. Refactor the state_machine class template to reduce code size in applications with many different state machines
  16. Add a diagram that helps to understand what an unstable state machine is
  17. Comment MPL-heavy code
  18. Add examples of often made mistakes
  19. Implement priority_scheduler<>
  20. Eliminate code-duplication in fifo_scheduler with PP code submitted by Pavel Vozenilek
  21. Add number and label to all diagrams in docs
  22. Add #pragma once to all headers (speeds up compilation with MS-compatible compilers)
  23. Investigate whether and how fifo_worker<> should accept a policy parameter defining how to lock and wait

Change history

(red = points raised during formal review)

17 December, 2005

14 August, 2005

19 June, 2005

12 May, 2005

03 May, 2005

21 February, 2005

20 February, 2005

09 February, 2005

07 February, 2005

25 November, 2004

19 October, 2004

22 May, 2004

12 May, 2004

22 April, 2004

10 April, 2004

26 March, 2004

25 March, 2004

21 March, 2004

16 March, 2004

13 March, 2004

03 March, 2004

09 February, 2004

11 January, 2004

12 December, 2003

12 October, 2003

16 August, 2003

08 June, 2003


Revised 17 December, 2005

� Copyright Andreas Huber D�nni 2003-2005. The link refers to a spam honeypot. Please remove the words spam and trap to obtain my real address.

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)