From dfd6439cd590b4e0c12fea89c80f39ec059b90c4 Mon Sep 17 00:00:00 2001 From: Christophe Henry Date: Wed, 18 May 2011 21:46:56 +0000 Subject: [PATCH] added missing example + doc item (phoenix) [SVN r72035] --- doc/HTML/ch01.html | 2 +- doc/HTML/ch02.html | 2 +- doc/HTML/ch02s02.html | 2 +- doc/HTML/ch02s03.html | 2 +- doc/HTML/ch03.html | 14 +- doc/HTML/ch03s02.html | 2 +- doc/HTML/ch03s03.html | 2 +- doc/HTML/ch03s04.html | 23 +-- doc/HTML/ch03s05.html | 32 ++-- doc/HTML/ch04.html | 4 +- doc/HTML/ch04s02.html | 2 +- doc/HTML/ch04s03.html | 2 +- doc/HTML/ch04s04.html | 2 +- doc/HTML/ch04s05.html | 2 +- doc/HTML/ch05.html | 2 +- doc/HTML/ch06.html | 4 +- doc/HTML/ch06s02.html | 4 +- doc/HTML/ch06s03.html | 2 +- doc/HTML/ch06s04.html | 2 +- doc/HTML/ch07.html | 2 +- doc/HTML/ch07s02.html | 2 +- doc/HTML/ch08.html | 2 +- doc/HTML/ch08s02.html | 2 +- doc/HTML/ch08s03.html | 2 +- doc/HTML/ch08s04.html | 2 +- doc/HTML/ch09.html | 4 +- doc/HTML/ch10.html | 20 +- doc/HTML/examples/SimplePhoenix.cpp | 258 +++++++++++++++++++++++++ doc/HTML/index.html | 18 +- doc/HTML/pr01.html | 4 +- doc/HTML/pt01.html | 16 +- doc/HTML/pt02.html | 2 +- doc/HTML/re01.html | 4 +- doc/HTML/re02.html | 76 ++++---- doc/HTML/re03.html | 282 ++++++++++++++-------------- doc/PDF/examples/SimplePhoenix.cpp | 258 +++++++++++++++++++++++++ doc/PDF/msm.pdf | Bin 1106081 -> 1106618 bytes doc/src/msm.xml | 159 +++++++++++++--- 38 files changed, 927 insertions(+), 293 deletions(-) create mode 100644 doc/HTML/examples/SimplePhoenix.cpp create mode 100644 doc/PDF/examples/SimplePhoenix.cpp diff --git a/doc/HTML/ch01.html b/doc/HTML/ch01.html index 332648f..87896ca 100644 --- a/doc/HTML/ch01.html +++ b/doc/HTML/ch01.html @@ -1,6 +1,6 @@ - Chapter 1. Founding idea

Chapter 1. Founding idea

Let's start with an example taken from the C++ Template Metaprogramming + Chapter 1. Founding idea

Chapter 1. Founding idea

Let's start with an example taken from the C++ Template Metaprogramming book:

class player : public state_machine<player>

{

// The list of FSM states enum states { Empty, Open, Stopped, Playing, Paused , initial_state = Empty };

// transition actions void start_playback(play const&) { std::cout diff --git a/doc/HTML/ch02.html b/doc/HTML/ch02.html index 7cf5bab..4591b03 100644 --- a/doc/HTML/ch02.html +++ b/doc/HTML/ch02.html @@ -1,6 +1,6 @@ - Chapter 2. UML Short Guide

Chapter 2. UML Short Guide

Table of Contents

What are state machines?
Concepts
State machine, state, transition, event
Submachines, orthogonal regions, pseudostates
+ Chapter 2. UML Short Guide

Chapter 2. UML Short Guide

What are state machines?

State machines are the description of a thing's lifeline. They describe the diff --git a/doc/HTML/ch02s02.html b/doc/HTML/ch02s02.html index 25352cc..3b3cb66 100644 --- a/doc/HTML/ch02s02.html +++ b/doc/HTML/ch02s02.html @@ -1,6 +1,6 @@ - Concepts

Concepts

Thinking in terms of state machines is a bit surprising at first, so let us + Concepts

Concepts

Thinking in terms of state machines is a bit surprising at first, so let us have a quick glance at the concepts.

State machine, state, transition, event

A state machine is a concrete model describing the behavior of a system. It is composed of a finite number of states and transitions.

A simple state has no sub states. It can have data, entry and exit diff --git a/doc/HTML/ch02s03.html b/doc/HTML/ch02s03.html index b9719f3..1f45c9f 100644 --- a/doc/HTML/ch02s03.html +++ b/doc/HTML/ch02s03.html @@ -1,6 +1,6 @@ - State machine glossary

State machine glossary

+ State machine glossary

State machine glossary

Other state types

We saw the build_state function, which creates a simple state. Likewise, eUML provides other state-building macros for other types of states:

  • BOOST_MSM_EUML_TERMINATE_STATE takes the same arguments as BOOST_MSM_EUML_STATE and defines, well, a terminate @@ -395,7 +396,7 @@ struct Open_impl : public Open_def

    entry_pt_(SubFsm2,PseudoEntry1) == State1 + event4

    For exit points, it is again the same syntax except that exit points are used as source of the transition:

    State2 == exit_pt_(SubFsm2,PseudoExit1) + event6 

    The entry tutorial - is also available with eUML.

Helper functions

We saw a few helpers but there are more, so let us have a more complete description:

  • event_ : used inside any action, the event triggering the + is also available with eUML.

Helper functions

We saw a few helpers but there are more, so let us have a more complete description:

  • event_ : used inside any action, the event triggering the transition

  • state_: used inside entry and exit actions, the entered / exited state

  • source_: used inside a transition action, the source state

  • target_: used inside a transition action, the target @@ -432,7 +433,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, except, for the - moment, with the while_, if_then_, if_then_else_ functions.

Phoenix-like STL support

eUML supports most C++ operators (except address-of). For example it is + moment, with the while_, if_then_, if_then_else_ functions.

Phoenix-like STL support

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 diff --git a/doc/HTML/ch03s05.html b/doc/HTML/ch03s05.html index d17720e..1c09909 100644 --- a/doc/HTML/ch03s05.html +++ b/doc/HTML/ch03s05.html @@ -1,6 +1,6 @@ - Back-end

Back-end

There is, at the moment, one back-end. This back-end contains the library + Back-end

Back-end

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.

Creation

MSM being divided between front and back-end, one needs to first define a + run-to-completion algorithm.

Creation

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:

typedef msm::back::state_machine<my_front_end> my_fsm;

We now have a fully functional state machine type. The next sections will - describe what can be done with it.

Starting and stopping a state + describe what can be done with it.

Starting and stopping a state machine

The start() 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 iPodSearch example uses this possibility.

The stop() method works the same way. It will cause the exit actions of the currently active states(s) to be called.

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.

Event dispatching

The main reason to exist for a state machine is to dispatch events. For + called.

Event dispatching

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:

my_fsm fsm; fsm.process_event(some_event());
 some_event e1; fsm.process_event(e1)

Creating an event on the fly will be optimized by the compiler so the - performance will not degrade.

Active state(s)

The backend also offers a way to know which state is active, though you + performance will not degrade.

Active state(s)

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, internal transitions or visitors 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 internals section to - know how state ids are generated.

Serialization

A common need is the ability to save a state machine and restore it at a + know how state ids are generated.

Serialization

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 serialize @@ -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).

This example shows a state machine which we serialize after processing an - event. The Empty state also has some data to serialize.

Base state type

Sometimes, one needs to customize states to avoid repetition and provide a + event. The Empty state also has some data to serialize.

Base state type

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");

struct player_ : public msm::front::state_machine<player_,my_base_state>             

You can also ask for a state with a given id (which you might have gotten from current_state()) using const base_state* get_state_by_id(int id) const where base_state is the one you just defined. You can now - do something polymorphically.

Visitor

In some cases, having a pointer-to-base of the currently active states is + do something polymorphically.

Visitor

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!

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:

SomeVisitor vis; sm.visit_current_states(boost::ref(vis));

This example uses a - visiting function with 2 arguments.

Flags

Flags is a MSM-only concept, supported by all front-ends, which base + visiting function with 2 arguments.

Flags

Flags is a MSM-only concept, supported by all front-ends, which base themselves on the functions:

template <class Flag> bool is_flag_active()
 template <class Flag,class BinaryOp> bool is_flag_active()

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:

my_fsm.is_flag_active<MyFlag>()
-my_fsm.is_flag_active<MyFlag,my_fsm_type::Flag_OR>()

Please refer to the front-ends sections for usage examples.

Getting a state

It is sometimes necessary to have the client code get access to the +my_fsm.is_flag_active<MyFlag,my_fsm_type::Flag_OR>()

Please refer to the front-ends sections for usage examples.

Getting a state

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:

player::Stopped* tempstate = p.get_state<player::Stopped*>();

or

player::Stopped& tempstate2 = p.get_state<player::Stopped&>();

depending on your personal taste.

State machine constructor with arguments

You might want to define a state machine with a non-default constructor. + name, for example:

player::Stopped* tempstate = p.get_state<player::Stopped*>();

or

player::Stopped& tempstate2 = p.get_state<player::Stopped&>();

depending on your personal taste.

State machine constructor with arguments

You might want to define a state machine with a non-default constructor. For example, you might want to write:

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:

player p( back::states_ << Playing(back::states_ << Song1(some_Song1_data)) , 
           boost::ref(data),3);

It is also possible to replace a given state by a new instance at any time using set_states() and the same syntax, for example: -

p.set_states( back::states_ << state_1 << ... << state_n );

An example making intensive use of this capability is provided.

Trading run-time speed for +

p.set_states( back::states_ << state_1 << ... << state_n );

An example making intensive use of this capability is provided.

Trading run-time speed for better compile-time / multi-TU compilation

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 @@ -240,7 +240,7 @@ BOOST_MSM_BACK_GENERATE_PROCESS_EVENT(mysubmachine)

-

Compile-time state machine analysis

A MSM state machine being a metaprogram, it is only logical that cheking +

Compile-time state machine analysis

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 mpl_graph (delivered at the moment with MSM) from Gordon Woodhull, MSM provides several compile-time checks:

  • Check that orthogonal regions ar truly orthogonal.

  • Check that all states are either reachable from the initial @@ -254,12 +254,12 @@ BOOST_MSM_BACK_GENERATE_PROCESS_EVENT(mysubmachine)

  • explicit entry / pseudo entry state declaration.

    The author's advice is to enable the checks after any state machine structure change and disable it again after sucessful analysis.

    The following example provokes an assertion if one of the first two lines - of the transition table is used.

Enqueueing events for later + of the transition table is used.

Enqueueing events for later processing

Calling process_event(Event const&) will immediately process the event with run-to-completion semantics. You can also enqueue the events and delay their processing by calling enqueue_event(Event const&) instead. Calling execute_queued_events() will then - process all enqueued events (in FIFO order).

You can query the queue size by calling get_message_queue_size().

Customizing the message queues

MSM uses by default a std::deque for its queues (one message queue for + process all enqueued events (in FIFO order).

You can query the queue size by calling get_message_queue_size().

Customizing the message queues

MSM uses by default a std::deque for its queues (one message queue for events generated during run-to-completion or with enqueue_event, one for deferred events). Unfortunately, on some STL implementations, it is a very expensive container in size and copying @@ -270,7 +270,7 @@ BOOST_MSM_BACK_GENERATE_PROCESS_EVENT(mysubmachine)

  • fsm.get_message_queue().set_capacity(1);
  • Policy definition with Boost.Parameter

    MSM uses Boost.Parameter to allow easier definition of + common):

     fsm.get_message_queue().set_capacity(1);           

    Policy definition with Boost.Parameter

    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 diff --git a/doc/HTML/ch04.html b/doc/HTML/ch04.html index 133de57..c9706ee 100644 --- a/doc/HTML/ch04.html +++ b/doc/HTML/ch04.html @@ -1,6 +1,6 @@ - Chapter 4.  Performance / Compilers

    Chapter 4.  Performance / Compilers

    Tests were made on different PCs running Windows XP and Vista and compiled with + Chapter 4.  Performance / Compilers

    Chapter 4.  Performance / Compilers

    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 state machine with only simple states and as a state machine with a composite @@ -9,5 +9,5 @@ the simple one also with functors and with eUML. 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.

    Speed

    VC9:

    • The simple test completes 90 times faster with MSM than with + 64.

      Speed

      VC9:

      • The simple test completes 90 times faster with MSM than with Boost.Statechart

      • The composite test completes 25 times faster with MSM

      gcc 4.2.3 (Ubuntu 8.04 in VMWare, same PC):

      • The simple test completes 46 times faster with MSM

      • The composite test completes 19 times faster with Msm

    \ No newline at end of file diff --git a/doc/HTML/ch04s02.html b/doc/HTML/ch04s02.html index 8cd344f..3b73cfc 100644 --- a/doc/HTML/ch04s02.html +++ b/doc/HTML/ch04s02.html @@ -1,6 +1,6 @@ - Executable size

    Executable size

    There are some worries that MSM generates huge code. Is it true? The 2 + Executable size

    Executable size

    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. diff --git a/doc/HTML/ch04s03.html b/doc/HTML/ch04s03.html index 75044fc..29952bd 100644 --- a/doc/HTML/ch04s03.html +++ b/doc/HTML/ch04s03.html @@ -1,6 +1,6 @@ - Supported compilers

    Supported compilers

    For a current status, have a look at the regression tests.

    MSM was successfully tested with:

    • VC8 (partly), VC9, VC10

    • g++ 4.0.1 and higher

    • Intel 10.1 and higher

    • Clang 2.9

    • Green Hills Software MULTI for ARM v5.0.5 patch 4416 (Simple and + Supported compilers

      Supported compilers

      For a current status, have a look at the regression tests.

      MSM was successfully tested with:

      • VC8 (partly), VC9, VC10

      • g++ 4.0.1 and higher

      • Intel 10.1 and higher

      • Clang 2.9

      • Green Hills Software MULTI for ARM v5.0.5 patch 4416 (Simple and Composite tutorials)

      • Partial support for IBM compiler

      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 diff --git a/doc/HTML/ch04s04.html b/doc/HTML/ch04s04.html index 2080ece..96e4107 100644 --- a/doc/HTML/ch04s04.html +++ b/doc/HTML/ch04s04.html @@ -1,6 +1,6 @@ - Limitations

      Limitations

      + Limitations

      Limitations

      • 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 diff --git a/doc/HTML/ch04s05.html b/doc/HTML/ch04s05.html index b096306..f2c18f8 100644 --- a/doc/HTML/ch04s05.html +++ b/doc/HTML/ch04s05.html @@ -1,6 +1,6 @@ - Compilers corner

        Compilers corner

        Compilers are sometimes full of surprises and such strange errors happened in + Compilers corner

        Compilers corner

        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.

        VC8:

        template <class StateType>
         typename ::boost::enable_if<
        diff --git a/doc/HTML/ch05.html b/doc/HTML/ch05.html
        index 761f70f..c96feaf 100644
        --- a/doc/HTML/ch05.html
        +++ b/doc/HTML/ch05.html
        @@ -1,6 +1,6 @@
         
               
        -   Chapter 5. Questions & Answers

        Chapter 5. Questions & Answers

        Question: on_entry gets as argument, the + Chapter 5. Questions & Answers

        Chapter 5. Questions & Answers

        Question: on_entry gets as argument, the sent event. What event do I get when the state becomes default-activated (because it is an initial state)?

        Answer: To allow you to know that the state diff --git a/doc/HTML/ch06.html b/doc/HTML/ch06.html index c435ecf..cb44a97 100644 --- a/doc/HTML/ch06.html +++ b/doc/HTML/ch06.html @@ -1,9 +1,9 @@ - Chapter 6. Internals

        Chapter 6. Internals

        Table of Contents

        Backend: Run To Completion
        Frontend / Backend + Chapter 6. Internals

        Chapter 6. Internals

        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.

        Backend: Run To Completion

        The back-end implements the following run-to completion algorithm:

        • Check if one region of the concrete state machine is in a + interface between front- and back- end is also described in detail.

          Backend: Run To Completion

          The back-end implements the following run-to completion algorithm:

          • 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).

          • If the message queue feature is enabled and if the state machine diff --git a/doc/HTML/ch06s02.html b/doc/HTML/ch06s02.html index 0e2e2b7..a277487 100644 --- a/doc/HTML/ch06s02.html +++ b/doc/HTML/ch06s02.html @@ -1,7 +1,7 @@ - Frontend / Backend interface

            Frontend / Backend + Frontend / Backend interface

            Frontend / Backend interface

            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 diff --git a/doc/HTML/ch06s03.html b/doc/HTML/ch06s03.html index 500be57..2f4479b 100644 --- a/doc/HTML/ch06s03.html +++ b/doc/HTML/ch06s03.html @@ -1,6 +1,6 @@ - Generated state ids

            Generated state ids

            Normally, one does not need to know the ids are generated for all the states + Generated state ids

            Generated state ids

            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 diff --git a/doc/HTML/ch06s04.html b/doc/HTML/ch06s04.html index aa6fdf5..26a7d36 100644 --- a/doc/HTML/ch06s04.html +++ b/doc/HTML/ch06s04.html @@ -1,6 +1,6 @@ - Metaprogramming tools

            Metaprogramming tools

            We can find for the transition table more uses than what we have seen so far. + Metaprogramming tools

            Metaprogramming tools

            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.

            What is needed for a coverage tool? You need to know how many states are diff --git a/doc/HTML/ch07.html b/doc/HTML/ch07.html index c4ccb48..ac3e243 100644 --- a/doc/HTML/ch07.html +++ b/doc/HTML/ch07.html @@ -1,6 +1,6 @@ - Chapter 7. Acknowledgements

            Chapter 7. Acknowledgements

            Table of Contents

            MSM v2
            MSM v1

            I am in debt to the following people who helped MSM along the way.

            MSM v2

            + Chapter 7. Acknowledgements

            Chapter 7. Acknowledgements

            Table of Contents

            MSM v2
            MSM v1

            I am in debt to the following people who helped MSM along the way.

            MSM v2

            • Thanks to Dave Abrahams for managing the review

            • Thanks to Eric Niebler for his patience correcting my grammar errors

            • Special thanks to Joel de Guzman who gave me very good ideas at the BoostCon09. These ideas were the starting point of the redesign. diff --git a/doc/HTML/ch07s02.html b/doc/HTML/ch07s02.html index b6a2652..953837b 100644 --- a/doc/HTML/ch07s02.html +++ b/doc/HTML/ch07s02.html @@ -1,6 +1,6 @@ - MSM v1

              MSM v1

              + MSM v1

              MSM v1

              • 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++ diff --git a/doc/HTML/ch08.html b/doc/HTML/ch08.html index 2e2df50..dd1ded8 100644 --- a/doc/HTML/ch08.html +++ b/doc/HTML/ch08.html @@ -1,6 +1,6 @@ - Chapter 8. Version history

                Chapter 8. Version history

                From V2.20 to V2.21 (Boost 1.47)

                + Chapter 8. Version history

                Chapter 8. Version history

                From V2.20 to V2.21 (Boost 1.47)

                • added a stop() method in the back-end.

                • Added partial support for Boost.Phoenix functors in eUML

                • Bugfixes

                  • Trac 5117, 5253, 5533

                  • gcc warnings about unused variables

                  • better implemenation of favor_compile_time back-end policy

                  • bug with eUML and state construction

                  • incorrect eUML event and state macros

                  • incorrect event type passed to a direct entry state's on_entry action

                diff --git a/doc/HTML/ch08s02.html b/doc/HTML/ch08s02.html index 6927990..f787a4e 100644 --- a/doc/HTML/ch08s02.html +++ b/doc/HTML/ch08s02.html @@ -1,6 +1,6 @@ - From V2.12 to V2.20 (Boost 1.46)

                From V2.12 to V2.20 (Boost 1.46)

                + From V2.12 to V2.20 (Boost 1.46)

                From V2.12 to V2.20 (Boost 1.46)

                • Compile-time state machine analysis using mpl_graph:

                • Boost.Parameter interface definition for msm::back::state_machine<> template arguments.

                • Possibility to provide a diff --git a/doc/HTML/ch08s03.html b/doc/HTML/ch08s03.html index 95a3e2a..5ce6220 100644 --- a/doc/HTML/ch08s03.html +++ b/doc/HTML/ch08s03.html @@ -1,6 +1,6 @@ - From V2.10 to V2.12 (Boost 1.45)

                  From V2.10 to V2.12 (Boost 1.45)

                  + From V2.10 to V2.12 (Boost 1.45)

                  From V2.10 to V2.12 (Boost 1.45)

                  • Support for serialization

                  • Possibility to use normal functors (from functor front-end) in eUML.

                  • New constructors where substates / submachines can be taken as diff --git a/doc/HTML/ch08s04.html b/doc/HTML/ch08s04.html index 209379d..424dce4 100644 --- a/doc/HTML/ch08s04.html +++ b/doc/HTML/ch08s04.html @@ -1,6 +1,6 @@ - From V2.0 to V2.12 (Boost 1.44)

                    From V2.0 to V2.12 (Boost 1.44)

                    + From V2.0 to V2.12 (Boost 1.44)

                    From V2.0 to V2.12 (Boost 1.44)

                    • New documentation

                    • Internal transitions. Either as part of the transition table or using a state's internal transition table

                    • increased dispatch and copy speed

                    • new row types for the basic front-end

                    • new eUML syntax, better attribute support, macros to ease diff --git a/doc/HTML/ch09.html b/doc/HTML/ch09.html index 58ce103..e9aca7a 100644 --- a/doc/HTML/ch09.html +++ b/doc/HTML/ch09.html @@ -1,7 +1,7 @@ - Chapter 9. eUML operators and basic helpers

                      Chapter 9. eUML operators and basic helpers

                      The following table lists the supported operators:

                      -

                      Table 9.1. Operators and state machine helpers

                      eUML function / operatorDescriptionFunctor
                      &&Calls lazily Action1&& Action2And_
                      ||Calls lazily Action1|| Action2Or_
                      !Calls lazily !Action1Not_
                      !=Calls lazily Action1 != Action2NotEqualTo_
                      ==Calls lazily Action1 == Action2EqualTo_
                      >Calls lazily Action1 > Action2Greater_
                      >=Calls lazily Action1 >= Action2Greater_Equal_
                      <Calls lazily Action1 < Action2Less_
                      <=Calls lazily Action1 <= Action2Less_Equal_
                      &Calls lazily Action1 & Action2Bitwise_And_
                      |Calls lazily Action1 | Action2Bitwise_Or_
                      ^Calls lazily Action1 ^ Action2Bitwise_Xor_
                      --Calls lazily --Action1 / Action1--Pre_Dec_ / Post_Dec_
                      ++Calls lazily ++Action1 / Action1++Pre_Inc_ / Post_Inc_
                      /Calls lazily Action1 / Action2Divides_
                      /=Calls lazily Action1 /= Action2Divides_Assign_
                      *Calls lazily Action1 * Action2Multiplies_
                      *=Calls lazily Action1 *= Action2Multiplies_Assign_
                      + (binary)Calls lazily Action1 + Action2Plus_
                      + (unary)Calls lazily +Action1Unary_Plus_
                      +=Calls lazily Action1 += Action2Plus_Assign_
                      - (binary)Calls lazily Action1 - Action2Minus_
                      - (unary)Calls lazily -Action1Unary_Minus_
                      -=Calls lazily Action1 -= Action2Minus_Assign_
                      %Calls lazily Action1 % Action2Modulus_
                      %=Calls lazily Action1 %= Action2Modulus_Assign_
                      >>Calls lazily Action1 >> Action2ShiftRight_
                      >>=Calls lazily Action1 >>= Action2ShiftRight_Assign_
                      <<Calls lazily Action1 << Action2ShiftLeft_
                      <<=Calls lazily Action1 <<= Action2ShiftLeft_Assign_
                      [] (works on vector, map, arrays)Calls lazily Action1 [Action2]Subscript_
                      if_then_else_(Condition,Action1,Action2)Returns either the result of calling Action1 or the result of + Chapter 9. eUML operators and basic helpers

                      Chapter 9. eUML operators and basic helpers

                      The following table lists the supported operators:

                      +

                      Table 9.1. Operators and state machine helpers

                      eUML function / operatorDescriptionFunctor
                      &&Calls lazily Action1&& Action2And_
                      ||Calls lazily Action1|| Action2Or_
                      !Calls lazily !Action1Not_
                      !=Calls lazily Action1 != Action2NotEqualTo_
                      ==Calls lazily Action1 == Action2EqualTo_
                      >Calls lazily Action1 > Action2Greater_
                      >=Calls lazily Action1 >= Action2Greater_Equal_
                      <Calls lazily Action1 < Action2Less_
                      <=Calls lazily Action1 <= Action2Less_Equal_
                      &Calls lazily Action1 & Action2Bitwise_And_
                      |Calls lazily Action1 | Action2Bitwise_Or_
                      ^Calls lazily Action1 ^ Action2Bitwise_Xor_
                      --Calls lazily --Action1 / Action1--Pre_Dec_ / Post_Dec_
                      ++Calls lazily ++Action1 / Action1++Pre_Inc_ / Post_Inc_
                      /Calls lazily Action1 / Action2Divides_
                      /=Calls lazily Action1 /= Action2Divides_Assign_
                      *Calls lazily Action1 * Action2Multiplies_
                      *=Calls lazily Action1 *= Action2Multiplies_Assign_
                      + (binary)Calls lazily Action1 + Action2Plus_
                      + (unary)Calls lazily +Action1Unary_Plus_
                      +=Calls lazily Action1 += Action2Plus_Assign_
                      - (binary)Calls lazily Action1 - Action2Minus_
                      - (unary)Calls lazily -Action1Unary_Minus_
                      -=Calls lazily Action1 -= Action2Minus_Assign_
                      %Calls lazily Action1 % Action2Modulus_
                      %=Calls lazily Action1 %= Action2Modulus_Assign_
                      >>Calls lazily Action1 >> Action2ShiftRight_
                      >>=Calls lazily Action1 >>= Action2ShiftRight_Assign_
                      <<Calls lazily Action1 << Action2ShiftLeft_
                      <<=Calls lazily Action1 <<= Action2ShiftLeft_Assign_
                      [] (works on vector, map, arrays)Calls lazily Action1 [Action2]Subscript_
                      if_then_else_(Condition,Action1,Action2)Returns either the result of calling Action1 or the result of calling Action2If_Else_
                      if_then_(Condition,Action)Returns the result of calling Action if ConditionIf_Then_
                      while_(Condition, Body)While Condition(), calls Body(). Returns nothingWhile_Do_
                      do_while_(Condition, Body)Calls Body() while Condition(). Returns nothingDo_While_
                      for_(Begin,Stop,EndLoop,Body)Calls for(Begin;Stop;EndLoop){Body;}For_Loop_
                      process_(Event [,fsm1] [,fsm2] [,fsm3] [,fsm4])Processes Event on the current state machine (if no fsm specified) or on up to 4 state machines returned by an appropriate functor.Process_
                      process2_(Event, Data [,fsm1] [,fsm2] [,fsm3])Processes Event on the current state machine (if no fsm diff --git a/doc/HTML/ch10.html b/doc/HTML/ch10.html index 1ea4a09..57147a6 100644 --- a/doc/HTML/ch10.html +++ b/doc/HTML/ch10.html @@ -1,33 +1,33 @@ - Chapter 10.  Functional programming

                      Chapter 10.  + Chapter 10.  Functional programming

                      Chapter 10.  Functional programming

                      To use these functions, you need to include:

                      #include <msm/front/euml/stl.hpp>

                      or the specified header in the following tables.

                      The following tables list the supported STL algorithms:

                      -

                      Table 10.1. STL algorithms

                      STL algorithms in querying.hppFunctor
                      find_(first, last, value)Find_
                      find_if_(first, last, value)FindIf_
                      lower_bound_(first, last, value [,opᵃ])LowerBound_
                      upper_bound_(first, last, value [,opᵃ])UpperBound_
                      equal_range_(first, last, value [,opᵃ])EqualRange_
                      binary_search_(first, last, value [,opᵃ])BinarySearch_
                      min_element_(first, last[,opᵃ])MinElement_
                      max_element_(first, last[,opᵃ])MaxElement_
                      adjacent_find_(first, last[,opᵃ])AdjacentFind_
                      find_end_( first1, last1, first2, last2 [,op ᵃ])FindEnd_
                      find_first_of_( first1, last1, first2, last2 [,op ᵃ])FindFirstOf_
                      equal_( first1, last1, first2 [,op ᵃ])Equal_
                      search_( first1, last1, first2, last2 [,op ᵃ])Search_
                      includes_( first1, last1, first2, last2 [,op ᵃ])Includes_
                      lexicographical_compare_ ( first1, last1, first2, last2 [,op +

                      Table 10.1. STL algorithms

                      STL algorithms in querying.hppFunctor
                      find_(first, last, value)Find_
                      find_if_(first, last, value)FindIf_
                      lower_bound_(first, last, value [,opᵃ])LowerBound_
                      upper_bound_(first, last, value [,opᵃ])UpperBound_
                      equal_range_(first, last, value [,opᵃ])EqualRange_
                      binary_search_(first, last, value [,opᵃ])BinarySearch_
                      min_element_(first, last[,opᵃ])MinElement_
                      max_element_(first, last[,opᵃ])MaxElement_
                      adjacent_find_(first, last[,opᵃ])AdjacentFind_
                      find_end_( first1, last1, first2, last2 [,op ᵃ])FindEnd_
                      find_first_of_( first1, last1, first2, last2 [,op ᵃ])FindFirstOf_
                      equal_( first1, last1, first2 [,op ᵃ])Equal_
                      search_( first1, last1, first2, last2 [,op ᵃ])Search_
                      includes_( first1, last1, first2, last2 [,op ᵃ])Includes_
                      lexicographical_compare_ ( first1, last1, first2, last2 [,op ᵃ]) LexicographicalCompare_
                      count_(first, last, value [,size])Count_
                      count_if_(first, last, op ᵃ [,size])CountIf_
                      distance_(first, last)Distance_
                      mismatch _( first1, last1, first2 [,op ᵃ])Mismatch_


                      -

                      Table 10.2. STL algorithms

                      STL algorithms in iteration.hppFunctor
                      for_each_(first,last, unary opᵃ)ForEach_
                      accumulate_first, last, init [,opᵃ])Accumulate_


                      +

                      Table 10.2. STL algorithms

                      STL algorithms in iteration.hppFunctor
                      for_each_(first,last, unary opᵃ)ForEach_
                      accumulate_first, last, init [,opᵃ])Accumulate_


                      -

                      Table 10.3. STL algorithms

                      STL algorithms in transformation.hppFunctor
                      copy_(first, last, result)Copy_
                      copy_backward_(first, last, result)CopyBackward_
                      reverse_(first, last)Reverse_
                      reverse_copy_(first, last , result)ReverseCopy_
                      remove_(first, last, value)Remove_
                      remove_if_(first, last , opᵃ)RemoveIf_
                      remove_copy_(first, last , output, value)RemoveCopy_
                      remove_copy_if_(first, last, output, opᵃ)RemoveCopyIf_
                      fill_(first, last, value)Fill_
                      fill_n_(first, size, value)ᵇFillN_
                      generate_(first, last, generatorᵃ)Generate_
                      generate_(first, size, generatorᵃ)ᵇGenerateN_
                      unique_(first, last [,opᵃ])Unique_
                      unique_copy_(first, last, output [,opᵃ])UniqueCopy_
                      random_shuffle_(first, last [,opᵃ])RandomShuffle_
                      rotate_copy_(first, middle, last, output)RotateCopy_
                      partition_ (first, last [,opᵃ])Partition_
                      stable_partition_ (first, last [,opᵃ])StablePartition_
                      stable_sort_(first, last [,opᵃ])StableSort_
                      sort_(first, last [,opᵃ])Sort_
                      partial_sort_(first, middle, last [,opᵃ])PartialSort_
                      partial_sort_copy_ (first, last, res_first, res_last [,opᵃ]) PartialSortCopy_
                      nth_element_(first, nth, last [,opᵃ])NthElement_
                      merge_( first1, last1, first2, last2, output [,op ᵃ])Merge_
                      inplace_merge_(first, middle, last [,opᵃ])InplaceMerge_
                      set_union_(first1, last1, first2, last2, output [,op +

                      Table 10.3. STL algorithms

                      STL algorithms in transformation.hppFunctor
                      copy_(first, last, result)Copy_
                      copy_backward_(first, last, result)CopyBackward_
                      reverse_(first, last)Reverse_
                      reverse_copy_(first, last , result)ReverseCopy_
                      remove_(first, last, value)Remove_
                      remove_if_(first, last , opᵃ)RemoveIf_
                      remove_copy_(first, last , output, value)RemoveCopy_
                      remove_copy_if_(first, last, output, opᵃ)RemoveCopyIf_
                      fill_(first, last, value)Fill_
                      fill_n_(first, size, value)ᵇFillN_
                      generate_(first, last, generatorᵃ)Generate_
                      generate_(first, size, generatorᵃ)ᵇGenerateN_
                      unique_(first, last [,opᵃ])Unique_
                      unique_copy_(first, last, output [,opᵃ])UniqueCopy_
                      random_shuffle_(first, last [,opᵃ])RandomShuffle_
                      rotate_copy_(first, middle, last, output)RotateCopy_
                      partition_ (first, last [,opᵃ])Partition_
                      stable_partition_ (first, last [,opᵃ])StablePartition_
                      stable_sort_(first, last [,opᵃ])StableSort_
                      sort_(first, last [,opᵃ])Sort_
                      partial_sort_(first, middle, last [,opᵃ])PartialSort_
                      partial_sort_copy_ (first, last, res_first, res_last [,opᵃ]) PartialSortCopy_
                      nth_element_(first, nth, last [,opᵃ])NthElement_
                      merge_( first1, last1, first2, last2, output [,op ᵃ])Merge_
                      inplace_merge_(first, middle, last [,opᵃ])InplaceMerge_
                      set_union_(first1, last1, first2, last2, output [,op ᵃ])SetUnion_
                      push_heap_(first, last [,op ᵃ])PushHeap_
                      pop_heap_(first, last [,op ᵃ])PopHeap_
                      make_heap_(first, last [,op ᵃ])MakeHeap_
                      sort_heap_(first, last [,op ᵃ])SortHeap_
                      next_permutation_(first, last [,op ᵃ])NextPermutation_
                      prev_permutation_(first, last [,op ᵃ])PrevPermutation_
                      inner_product_(first1, last1, first2, init [,op1ᵃ] [,op2ᵃ]) InnerProduct_
                      partial_sum_(first, last, output [,opᵃ])PartialSum_
                      adjacent_difference_(first, last, output [,opᵃ])AdjacentDifference_
                      replace_(first, last, old_value, new_value)Replace_
                      replace_if_(first, last, opᵃ, new_value)ReplaceIf_
                      replace_copy_(first, last, result, old_value, new_value)ReplaceCopy_
                      replace_copy_if_(first, last, result, opᵃ, new_value)ReplaceCopyIf_
                      rotate_(first, middle, last)ᵇRotate_


                      -

                      Table 10.4. STL container methods

                      STL container methods(common) in container.hppFunctor
                      container::reference front_(container)Front_
                      container::reference back_(container)Back_
                      container::iterator begin_(container)Begin_
                      container::iterator end_(container)End_
                      container::reverse_iterator rbegin_(container)RBegin_
                      container::reverse_iterator rend_(container)REnd_
                      void push_back_(container, value)Push_Back_
                      void pop_back_(container, value)Pop_Back_
                      void push_front_(container, value)Push_Front_
                      void pop_front_(container, value)Pop_Front_
                      void clear_(container)Clear_
                      size_type capacity_(container)Capacity_
                      size_type size_(container)Size_
                      size_type max_size_(container)Max_Size_
                      void reserve_(container, value)Reserve _
                      void resize_(container, value)Resize _
                      iterator insert_(container, pos, value)Insert_
                      void insert_( container , pos, first, last)Insert_
                      void insert_( container , pos, number, value)Insert_
                      void swap_( container , other_container)Swap_
                      void erase_( container , pos)Erase_
                      void erase_( container , first, last) Erase_
                      bool empty_( container)Empty_


                      +

                      Table 10.4. STL container methods

                      STL container methods(common) in container.hppFunctor
                      container::reference front_(container)Front_
                      container::reference back_(container)Back_
                      container::iterator begin_(container)Begin_
                      container::iterator end_(container)End_
                      container::reverse_iterator rbegin_(container)RBegin_
                      container::reverse_iterator rend_(container)REnd_
                      void push_back_(container, value)Push_Back_
                      void pop_back_(container, value)Pop_Back_
                      void push_front_(container, value)Push_Front_
                      void pop_front_(container, value)Pop_Front_
                      void clear_(container)Clear_
                      size_type capacity_(container)Capacity_
                      size_type size_(container)Size_
                      size_type max_size_(container)Max_Size_
                      void reserve_(container, value)Reserve _
                      void resize_(container, value)Resize _
                      iterator insert_(container, pos, value)Insert_
                      void insert_( container , pos, first, last)Insert_
                      void insert_( container , pos, number, value)Insert_
                      void swap_( container , other_container)Swap_
                      void erase_( container , pos)Erase_
                      void erase_( container , first, last) Erase_
                      bool empty_( container)Empty_


                      -

                      Table 10.5. STL list methods

                      std::list methods in container.hppFunctor
                      void list_remove_(container, value)ListRemove_
                      void list_remove_if_(container, opᵃ)ListRemove_If_
                      void list_merge_(container, other_list)ListMerge_
                      void list_merge_(container, other_list, opᵃ)ListMerge_
                      void splice_(container, iterator, other_list)Splice_
                      void splice_(container, iterator, other_list, +

                      Table 10.5. STL list methods

                      std::list methods in container.hppFunctor
                      void list_remove_(container, value)ListRemove_
                      void list_remove_if_(container, opᵃ)ListRemove_If_
                      void list_merge_(container, other_list)ListMerge_
                      void list_merge_(container, other_list, opᵃ)ListMerge_
                      void splice_(container, iterator, other_list)Splice_
                      void splice_(container, iterator, other_list, iterator)Splice_
                      void splice_(container, iterator, other_list, first, last)Splice_
                      void list_reverse_(container)ListReverse_
                      void list_unique_(container)ListUnique_
                      void list_unique_(container, opᵃ)ListUnique_
                      void list_sort_(container)ListSort_
                      void list_sort_(container, opᵃ)ListSort_


                      -

                      Table 10.6. STL associative container methods

                      Associative container methods in container.hppFunctor
                      iterator insert_(container, pos, value)Insert_
                      void insert_( container , first, last)Insert_
                      pair<iterator, bool> insert_( container , value)Insert_
                      void associative_erase_( container , pos)Associative_Erase_
                      void associative_erase_( container , first, last)Associative_Erase_
                      size_type associative_erase_( container , key)Associative_Erase_
                      iterator associative_find_( container , key)Associative_Find_
                      size_type associative_count_( container , key)AssociativeCount_
                      iterator associative_lower_bound_( container , key)Associative_Lower_Bound_
                      iterator associative_upper_bound_( container , key)Associative_Upper_Bound_
                      pair<iterator, iterator> associative_equal_range_( +

                      Table 10.6. STL associative container methods

                      Associative container methods in container.hppFunctor
                      iterator insert_(container, pos, value)Insert_
                      void insert_( container , first, last)Insert_
                      pair<iterator, bool> insert_( container , value)Insert_
                      void associative_erase_( container , pos)Associative_Erase_
                      void associative_erase_( container , first, last)Associative_Erase_
                      size_type associative_erase_( container , key)Associative_Erase_
                      iterator associative_find_( container , key)Associative_Find_
                      size_type associative_count_( container , key)AssociativeCount_
                      iterator associative_lower_bound_( container , key)Associative_Lower_Bound_
                      iterator associative_upper_bound_( container , key)Associative_Upper_Bound_
                      pair<iterator, iterator> associative_equal_range_( container , key)Associative_Equal_Range_


                      -

                      Table 10.7. STL pair

                      std::pair in container.hppFunctor
                      first_type first_(pair<T1, T2>)First_
                      second_type second_(pair<T1, T2>)Second_


                      +

                      Table 10.7. STL pair

                      std::pair in container.hppFunctor
                      first_type first_(pair<T1, T2>)First_
                      second_type second_(pair<T1, T2>)Second_


                      -

                      Table 10.8. STL string

                      STL string methodstd::string method in container.hppFunctor
                      substr (size_type pos, size_type size)string substr_(container, pos, length)Substr_
                      int compare(string)int string_compare_(container, another_string)StringCompare_
                      int compare(char*)int string_compare_(container, another_string)StringCompare_
                      int compare(size_type pos, size_type size, string)int string_compare_(container, pos, size, +

                      Table 10.8. STL string

                      STL string methodstd::string method in container.hppFunctor
                      substr (size_type pos, size_type size)string substr_(container, pos, length)Substr_
                      int compare(string)int string_compare_(container, another_string)StringCompare_
                      int compare(char*)int string_compare_(container, another_string)StringCompare_
                      int compare(size_type pos, size_type size, string)int string_compare_(container, pos, size, another_string)StringCompare_
                      int compare (size_type pos, size_type size, string, size_type length)int string_compare_(container, pos, size, another_string, length)StringCompare_
                      string& append(const string&)string& append_(container, another_string)Append_
                      string& append (charT*)string& append_(container, another_string)Append_
                      string& append (string , size_type pos, size_type diff --git a/doc/HTML/examples/SimplePhoenix.cpp b/doc/HTML/examples/SimplePhoenix.cpp new file mode 100644 index 0000000..7df5009 --- /dev/null +++ b/doc/HTML/examples/SimplePhoenix.cpp @@ -0,0 +1,258 @@ +// Copyright 2010 Christophe Henry +// henry UNDERSCORE christophe AT hotmail DOT com +// This is an extended version of the state machine available in the boost::mpl library +// Distributed under the same license as the original. +// Copyright for the original version: +// Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed +// under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#include +#include + +#include + +// add phoenix support in eUML +#define BOOST_MSM_EUML_PHOENIX_SUPPORT +#include +#include + + +using namespace std; +using namespace boost::msm::front::euml; +namespace msm = boost::msm; +using namespace boost::phoenix; + +// entry/exit/action/guard logging functors +#include "logging_functors.h" + +namespace // Concrete FSM implementation +{ + // events + BOOST_MSM_EUML_EVENT(end_pause) + BOOST_MSM_EUML_EVENT(stop) + BOOST_MSM_EUML_EVENT(pause) + BOOST_MSM_EUML_EVENT(open_close) + struct play_event : boost::msm::front::euml::euml_event + { + }; + play_event play; + + enum DiskTypeEnum + { + DISK_CD=0, + DISK_DVD=1 + }; + // A "complicated" event type that carries some data. + struct cd_detected_event : boost::msm::front::euml::euml_event + { + cd_detected_event(){} + cd_detected_event(std::string const& name,DiskTypeEnum disk):cd_name(name),cd_type(disk){} + std::string cd_name; + DiskTypeEnum cd_type; + }; + // define an instance for a nicer transition table + cd_detected_event cd_detected; + + // Concrete FSM implementation + // The list of FSM states + // state not needing any entry or exit + BOOST_MSM_EUML_STATE((),Paused) + + // states with standard eUML actions + BOOST_MSM_EUML_STATE(( Stopped_Entry,Stopped_Exit ),Stopped) + BOOST_MSM_EUML_STATE(( Playing_Entry,Playing_Exit ),Playing) + + // a "standard" msm state + struct Empty_impl : public msm::front::state<> , public euml_state + { + // this allows us to add some functions + void foo() {std::cout << "Empty::foo " << std::endl;} + // standard entry behavior + template + void on_entry(Event const& evt,FSM& fsm) + { + std::cout << "entering: Empty" << std::endl; + } + template + void on_exit(Event const& evt,FSM& fsm) + { + std::cout << "leaving: Empty" << std::endl; + } + }; + //instance for use in the transition table + Empty_impl const Empty; + + // entry and exit actions as phoenix functions + struct open_entry_impl + { + typedef void result_type; + void operator()() + { + cout << "entering: Open" << endl; + } + }; + boost::phoenix::function open_entry; + struct open_exit_impl + { + typedef void result_type; + void operator()() + { + cout << "leaving: Open" << endl; + } + }; + boost::phoenix::function open_exit; + + // a state using phoenix for entry/exit actions + BOOST_MSM_EUML_STATE(( open_entry(),open_exit() ),Open) + + // actions and guards using boost::phoenix + struct start_playback_impl + { + typedef void result_type; + void operator()() + { + cout << "calling: start_playback" << endl; + } + }; + boost::phoenix::function start_playback; + + // a guard taking the event as argument + struct good_disk_format_impl + { + typedef bool result_type; + + template + bool operator()(Event const& evt) + { + // to test a guard condition, let's say we understand only CDs, not DVD + if (evt.cd_type!=DISK_CD) + { + std::cout << "wrong disk, sorry" << std::endl; + return false; + } + std::cout << "good disk" << std::endl; + return true; + } + }; + boost::phoenix::function good_disk_format; + + // a simple action + struct store_cd_info_impl + { + typedef void result_type; + void operator()() + { + cout << "calling: store_cd_info" << endl; + } + }; + boost::phoenix::function store_cd_info; + + // an action taking the fsm as argument and sending it a new event + struct process_play_impl + { + typedef void result_type; + + template + void operator()(Fsm& fsm) + { + cout << "queuing a play event" << endl; + fsm.process_event(play); + } + }; + // it is also possible to use BOOST_PHOENIX_ADAPT_CALLABLE to avoid defining a global variable + BOOST_PHOENIX_ADAPT_CALLABLE(process_play, process_play_impl, 1) + + + // transition table. Actions and guards are written as phoenix functions + BOOST_MSM_EUML_TRANSITION_TABLE(( + //an action without arguments + Playing == Stopped + play / start_playback() , + Playing == Paused + end_pause , + // +------------------------------------------------------------------------------+ + Empty == Open + open_close , + // +------------------------------------------------------------------------------+ + Open == Empty + open_close , + Open == Paused + open_close , + Open == Stopped + open_close , + Open == Playing + open_close , + // +------------------------------------------------------------------------------+ + Paused == Playing + pause , + // +------------------------------------------------------------------------------+ + Stopped == Playing + stop , + Stopped == Paused + stop , + // a guard taking the event as argument + // and an action made of a phoenix expression of 2 actions + // _event is a placeholder for the current event + // _fsm is a placeholder for the current state machine + Stopped == Empty + cd_detected [good_disk_format(_event)] + / (store_cd_info(),process_play(_fsm)), + Stopped == Stopped + stop + // +------------------------------------------------------------------------------+ + ),transition_table) + + // create a state machine "on the fly" + BOOST_MSM_EUML_DECLARE_STATE_MACHINE(( transition_table, //STT + init_ << Empty, // Init State + no_action, // Entry + no_action, // Exit + attributes_ << no_attributes_, // Attributes + configure_ << no_configure_, // configuration + Log_No_Transition // no_transition handler + ), + player_) //fsm name + + // or simply, if no no_transition handler needed: + //BOOST_MSM_EUML_DECLARE_STATE_MACHINE(( transition_table, //STT + // Empty // Init State + // ),player_) + + // choice of back-end + typedef msm::back::state_machine player; + + // + // Testing utilities. + // + static char const* const state_names[] = { "Stopped", "Paused", "Open", "Empty", "Playing" }; + 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); + // will be rejected, wrong disk type + p.process_event( + cd_detected_event("louie, louie",DISK_DVD)); pstate(p); + p.process_event( + cd_detected_event("louie, louie",DISK_CD)); pstate(p); + // no need to call play as the previous event does it in its action method + //p.process_event(play); + + // 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 none is defined in the transition table + p.process_event(stop); pstate(p); + // test call to no_transition + p.process_event(pause); pstate(p); + } +} + +int main() +{ + test(); + return 0; +} + diff --git a/doc/HTML/index.html b/doc/HTML/index.html index f6480ea..bb1eb2a 100644 --- a/doc/HTML/index.html +++ b/doc/HTML/index.html @@ -1,18 +1,18 @@ - Meta State Machine (MSM) V2.20

                      Meta State Machine (MSM) V2.20

                      Meta State Machine (MSM)


                      Table of Contents

                      Preface
                      I. User' guide
                      1. Founding idea
                      2. UML Short Guide
                      What are state machines?
                      Concepts
                      State machine, state, transition, event
                      Submachines, orthogonal regions, pseudostates
                      History
                      Completion transitions / anonymous transitions
                      Internal transitions
                      Conflicting transitions
                      State machine glossary
                      3. Tutorial
                      Design
                      Basic front-end
                      A simple example
                      Transition table
                      Defining states with entry/exit actions
                      What do you actually do inside actions / guards?
                      Defining a simple state machine
                      Defining a submachine
                      Orthogonal regions, terminate state, event deferring
                      History
                      Completion (anonymous) transitions
                      Internal transitions
                      more row types
                      Explicit entry / entry and exit pseudo-state / fork
                      Flags
                      Event Hierarchy
                      Customizing a state machine / Getting more speed
                      Choosing the initial event
                      Containing state machine (deprecated)
                      Functor front-end
                      Transition table
                      Defining states with entry/exit actions
                      What do you actually do inside actions / guards (Part 2)?
                      Defining a simple state machine
                      Anonymous transitions
                      Internal - transitions
                      eUML (experimental)
                      Transition table
                      A simple example: rewriting only our transition table
                      Defining events, actions and states with entry/exit actions
                      Defining a simple state machine
                      Defining a submachine
                      - Attributes / Function call
                      Orthogonal regions, flags, event deferring
                      + transitions
                      eUML (experimental)
                      Transition table
                      A simple example: rewriting only our transition table
                      Defining events, actions and states with entry/exit actions
                      Defining a simple state machine
                      Defining a submachine
                      + Attributes / Function call
                      Orthogonal regions, flags, event deferring
                      Customizing a state machine / Getting - more speed
                      Completion / Anonymous transitions
                      Internal transitions
                      Other state types
                      Helper functions
                      Phoenix-like STL support
                      Back-end
                      Creation
                      Starting and stopping a state - machine
                      Event dispatching
                      Active state(s)
                      Serialization
                      Base state type
                      Visitor
                      Flags
                      Getting a state
                      State machine constructor with arguments
                      Trading run-time speed for - better compile-time / multi-TU compilation
                      Compile-time state machine analysis
                      Enqueueing events for later - processing
                      Customizing the message queues
                      Policy definition with Boost.Parameter
                      4. Performance / Compilers
                      Speed
                      Executable size
                      Supported compilers
                      Limitations
                      Compilers corner
                      5. Questions & Answers
                      6. Internals
                      Backend: Run To Completion
                      Frontend / Backend - interface
                      Generated state ids
                      Metaprogramming tools
                      7. Acknowledgements
                      MSM v2
                      MSM v1
                      8. Version history
                      From V2.20 to V2.21 (Boost 1.47)
                      From V2.12 to V2.20 (Boost 1.46)
                      From V2.10 to V2.12 (Boost 1.45)
                      From V2.0 to V2.12 (Boost 1.44)
                      II. Reference
                      9. eUML operators and basic helpers
                      10. - Functional programming
                      Common headers — The common types used by front- and back-ends
                      Back-end — The back-end headers
                      Front-end — The front-end headers
                      \ No newline at end of file + more speed
                      Completion / Anonymous transitions
                      Internal transitions
                      Other state types
                      Helper functions
                      Phoenix-like STL support
                      Back-end
                      Creation
                      Starting and stopping a state + machine
                      Event dispatching
                      Active state(s)
                      Serialization
                      Base state type
                      Visitor
                      Flags
                      Getting a state
                      State machine constructor with arguments
                      Trading run-time speed for + better compile-time / multi-TU compilation
                      Compile-time state machine analysis
                      Enqueueing events for later + processing
                      Customizing the message queues
                      Policy definition with Boost.Parameter
                      4. Performance / Compilers
                      Speed
                      Executable size
                      Supported compilers
                      Limitations
                      Compilers corner
                      5. Questions & Answers
                      6. Internals
                      Backend: Run To Completion
                      Frontend / Backend + interface
                      Generated state ids
                      Metaprogramming tools
                      7. Acknowledgements
                      MSM v2
                      MSM v1
                      8. Version history
                      From V2.20 to V2.21 (Boost 1.47)
                      From V2.12 to V2.20 (Boost 1.46)
                      From V2.10 to V2.12 (Boost 1.45)
                      From V2.0 to V2.12 (Boost 1.44)
                      II. Reference
                      9. eUML operators and basic helpers
                      10. + Functional programming
                      Common headers — The common types used by front- and back-ends
                      Back-end — The back-end headers
                      Front-end — The front-end headers
                      \ No newline at end of file diff --git a/doc/HTML/pr01.html b/doc/HTML/pr01.html index 9d3691e..62cf7a9 100644 --- a/doc/HTML/pr01.html +++ b/doc/HTML/pr01.html @@ -1,6 +1,6 @@ - Preface

                      Preface

                      MSM is a library allowing you to easily and quickly define state machines of very high + Preface

                      Preface

                      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.

                      • When do I need a state machine?

                        More often that you think. Very often, one defined a state machine @@ -58,4 +58,4 @@ standard which is not implemented. MSM offers a very large part of the standard, with more on the way.

                      Let us not wait any longer, I hope you will enjoy MSM and have fun with it!

                      -

                      \ No newline at end of file +

                      \ No newline at end of file diff --git a/doc/HTML/pt01.html b/doc/HTML/pt01.html index 74e2f22..33eaa9e 100644 --- a/doc/HTML/pt01.html +++ b/doc/HTML/pt01.html @@ -1,14 +1,14 @@ - Part I. User' guide

                      Part I. User' guide

                      Table of Contents

                      1. Founding idea
                      2. UML Short Guide
                      What are state machines?
                      Concepts
                      State machine, state, transition, event
                      Submachines, orthogonal regions, pseudostates
                      + Part I. User' guide

                      Part I. User' guide

                      Table of Contents

                      1. Founding idea
                      2. UML Short Guide
                      What are state machines?
                      Concepts
                      State machine, state, transition, event
                      Submachines, orthogonal regions, pseudostates
                      History
                      Completion transitions / anonymous transitions
                      Internal transitions
                      Conflicting transitions
                      State machine glossary
                      3. Tutorial
                      Design
                      Basic front-end
                      A simple example
                      Transition table
                      Defining states with entry/exit actions
                      What do you actually do inside actions / guards?
                      Defining a simple state machine
                      Defining a submachine
                      Orthogonal regions, terminate state, event deferring
                      History
                      Completion (anonymous) transitions
                      Internal transitions
                      more row types
                      Explicit entry / entry and exit pseudo-state / fork
                      Flags
                      Event Hierarchy
                      Customizing a state machine / Getting more speed
                      Choosing the initial event
                      Containing state machine (deprecated)
                      Functor front-end
                      Transition table
                      Defining states with entry/exit actions
                      What do you actually do inside actions / guards (Part 2)?
                      Defining a simple state machine
                      Anonymous transitions
                      Internal - transitions
                      eUML (experimental)
                      Transition table
                      A simple example: rewriting only our transition table
                      Defining events, actions and states with entry/exit actions
                      Defining a simple state machine
                      Defining a submachine
                      - Attributes / Function call
                      Orthogonal regions, flags, event deferring
                      + transitions
                      eUML (experimental)
                      Transition table
                      A simple example: rewriting only our transition table
                      Defining events, actions and states with entry/exit actions
                      Defining a simple state machine
                      Defining a submachine
                      + Attributes / Function call
                      Orthogonal regions, flags, event deferring
                      Customizing a state machine / Getting - more speed
                      Completion / Anonymous transitions
                      Internal transitions
                      Other state types
                      Helper functions
                      Phoenix-like STL support
                      Back-end
                      Creation
                      Starting and stopping a state - machine
                      Event dispatching
                      Active state(s)
                      Serialization
                      Base state type
                      Visitor
                      Flags
                      Getting a state
                      State machine constructor with arguments
                      Trading run-time speed for - better compile-time / multi-TU compilation
                      Compile-time state machine analysis
                      Enqueueing events for later - processing
                      Customizing the message queues
                      Policy definition with Boost.Parameter
                      4. Performance / Compilers
                      Speed
                      Executable size
                      Supported compilers
                      Limitations
                      Compilers corner
                      5. Questions & Answers
                      6. Internals
                      Backend: Run To Completion
                      Frontend / Backend - interface
                      Generated state ids
                      Metaprogramming tools
                      7. Acknowledgements
                      MSM v2
                      MSM v1
                      8. Version history
                      From V2.20 to V2.21 (Boost 1.47)
                      From V2.12 to V2.20 (Boost 1.46)
                      From V2.10 to V2.12 (Boost 1.45)
                      From V2.0 to V2.12 (Boost 1.44)
                      \ No newline at end of file + more speed
                      Completion / Anonymous transitions
                      Internal transitions
                      Other state types
                      Helper functions
                      Phoenix-like STL support
                      Back-end
                      Creation
                      Starting and stopping a state + machine
                      Event dispatching
                      Active state(s)
                      Serialization
                      Base state type
                      Visitor
                      Flags
                      Getting a state
                      State machine constructor with arguments
                      Trading run-time speed for + better compile-time / multi-TU compilation
                      Compile-time state machine analysis
                      Enqueueing events for later + processing
                      Customizing the message queues
                      Policy definition with Boost.Parameter
                      4. Performance / Compilers
                      Speed
                      Executable size
                      Supported compilers
                      Limitations
                      Compilers corner
                      5. Questions & Answers
                      6. Internals
                      Backend: Run To Completion
                      Frontend / Backend + interface
                      Generated state ids
                      Metaprogramming tools
                      7. Acknowledgements
                      MSM v2
                      MSM v1
                      8. Version history
                      From V2.20 to V2.21 (Boost 1.47)
                      From V2.12 to V2.20 (Boost 1.46)
                      From V2.10 to V2.12 (Boost 1.45)
                      From V2.0 to V2.12 (Boost 1.44)
                      \ No newline at end of file diff --git a/doc/HTML/pt02.html b/doc/HTML/pt02.html index c7b900f..fd3d8fa 100644 --- a/doc/HTML/pt02.html +++ b/doc/HTML/pt02.html @@ -1,4 +1,4 @@ - Part II. Reference

                      Part II. Reference

                      Table of Contents

                      9. eUML operators and basic helpers
                      10. + Part II. Reference

                      Part II. Reference

                      Table of Contents

                      9. eUML operators and basic helpers
                      10. Functional programming
                      Common headers — The common types used by front- and back-ends
                      Back-end — The back-end headers
                      Front-end — The front-end headers
                      \ No newline at end of file diff --git a/doc/HTML/re01.html b/doc/HTML/re01.html index d6466a3..c064d26 100644 --- a/doc/HTML/re01.html +++ b/doc/HTML/re01.html @@ -1,8 +1,8 @@ - Common headers

                      Name

                      Common headers — The common types used by front- and back-ends

                      msm/common.hpp

                      This header provides one type, wrap, which is an empty type whose only reason + Common headers

                      Name

                      Common headers — The common types used by front- and back-ends

                      msm/common.hpp

                      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.

                       template <class Dummy> wrap{}; {
                      }

                      msm/row_tags.hpp

                      This header contains the row type tags which front-ends can support partially + as shown in the Metaprogramming book, chapter 9.

                       template <class Dummy> wrap{}; {
                      }

                      msm/row_tags.hpp

                      This header contains the row type tags which front-ends can support partially or totally. Please see the Internals section for a description of the different types.

                      \ No newline at end of file diff --git a/doc/HTML/re02.html b/doc/HTML/re02.html index 1213e97..41131a9 100644 --- a/doc/HTML/re02.html +++ b/doc/HTML/re02.html @@ -1,79 +1,79 @@ - Back-end

                      Name

                      Back-end — The back-end headers

                      msm/back/state_machine.hpp

                      This header provides one type, state_machine, MSM's state machine engine + Back-end

                      Name

                      Back-end — The back-end headers

                      msm/back/state_machine.hpp

                      This header provides one type, state_machine, MSM's state machine engine implementation.

                       template <class Derived,class HistoryPolicy=NoHistory,class
                      -                            CompilePolicy=favor_runtime_speed> state_machine {
                      }

                      Template arguments

                      Derived

                      The name of the front-end state machine definition. All three - front-ends are possible.

                      HistoryPolicy

                      The desired history. This can be: AlwaysHistory, NoHistory, - ShallowHistory. Default is NoHistory.

                      CompilePolicy

                      The trade-off performance / compile-time. There are two predefined + CompilePolicy=favor_runtime_speed> state_machine {
                      }

                      Template arguments

                      Derived

                      The name of the front-end state machine definition. All three + front-ends are possible.

                      HistoryPolicy

                      The desired history. This can be: AlwaysHistory, NoHistory, + ShallowHistory. Default is NoHistory.

                      CompilePolicy

                      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 the backend.

                      methods

                      start

                      The start methods must be called before any call to process_event. It + favor_runtime_speed, best performance, longer compile-time. See the backend.

                      methods

                      start

                      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 backend.

                      void start();

                      process_event

                      The event processing method implements the double-dispatch. Each call + choose when a state machine can start. See backend.

                      void start();

                      process_event

                      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.

                      template <class Event> HandledEnum - process_event(Event const&);

                      current_state

                      Returns the ids of currently active states. You will typically need it - only for debugging or logging purposes.

                      const int* current_state const();

                      get_state_by_id

                      Returns the state whose id is given. As all states of a concrete state + process_event(Event const&);

                      current_state

                      Returns the ids of currently active states. You will typically need it + only for debugging or logging purposes.

                      const int* current_state const();

                      get_state_by_id

                      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.

                      const BaseState* get_state_by_id const(int id);

                      is_contained

                      Helper returning true if the state machine is contained as a - submachine of another state machine.

                      bool is_contained const();

                      get_state

                      Returns the required state of the state machine as a pointer. A + the id corresponds to no state, a null pointer is returned.

                      const BaseState* get_state_by_id const(int id);

                      is_contained

                      Helper returning true if the state machine is contained as a + submachine of another state machine.

                      bool is_contained const();

                      get_state

                      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.

                      template <class State> State* get_state();

                      get_state

                      Returns the required state of the state machine as a reference. A + machine.

                      template <class State> State* get_state();

                      get_state

                      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.

                      template <class State> State& get_state();

                      is_flag_active

                      Returns true if the given flag is currently active. A flag is active + machine.

                      template <class State> State& get_state();

                      is_flag_active

                      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 all regions (using AND as BinaryOp)

                      template <class Flag,class BinaryOp> bool - is_flag_active();

                      is_flag_active

                      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.

                      template <class Flag> bool is_flag_active();

                      visit_current_states

                      Visits all active states and their substates. A state is visited using + is_flag_active();

                      is_flag_active

                      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.

                      template <class Flag> bool is_flag_active();

                      visit_current_states

                      Visits all active states and their substates. A state is visited using the accept method without argument. The base class of all - states must provide an accept_sig type.

                      void visit_current_states();

                      visit_current_states

                      Visits all active states and their substates. A state is visited using + states must provide an accept_sig type.

                      void visit_current_states();

                      visit_current_states

                      Visits all active states and their substates. A state is visited using the accept method with arguments. The base class of all states must provide an accept_sig type defining the - signature and thus the number and type of the parameters.

                      void visit_current_states(any-type param1, any-type param2,...);

                      defer_event

                      Defers the provided event. This method can be called only if at least + signature and thus the number and type of the parameters.

                      void visit_current_states(any-type param1, any-type param2,...);

                      defer_event

                      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 activate_deferred_events(see example) type either directly or using the deferred_events configuration of eUML - (configure_ << deferred_events)

                      template <class Event> void defer_event(Event const&);

                      Types

                      nr_regions

                      The number of orthogonal regions contained in the state machine

                      entry_pt

                      This nested type provides the necessary typedef for entry point + (configure_ << deferred_events)

                      template <class Event> void defer_event(Event const&);

                      Types

                      nr_regions

                      The number of orthogonal regions contained in the state machine

                      entry_pt

                      This nested type provides the necessary typedef for entry point pseudostates. state_machine<...>::entry_pt<state_name> is a transition's valid target inside the containing state machine's - transition table.

                       entry_pt {
                      }

                      exit_pt

                      This nested type provides the necessary typedef for exit point + transition table.

                       entry_pt {
                      }

                      exit_pt

                      This nested type provides the necessary typedef for exit point pseudostates. state_machine<...>::exit_pt<state_name> is a transition's valid source inside the containing state machine's - transition table.

                       exit_pt {
                      }

                      direct

                      This nested type provides the necessary typedef for an explicit entry + transition table.

                       exit_pt {
                      }

                      direct

                      This nested type provides the necessary typedef for an explicit entry inside a submachine. state_machine<...>::direct<state_name> is a transition's valid target inside the containing state machine's - transition table.

                       direct {
                      }

                      stt

                      Calling state_machine<frontend>::stt returns a mpl::vector + transition table.

                       direct {
                      }

                      stt

                      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.

                      args.hpp

                      This header provides one type, args. which provides the necessary types for a - visitor implementation.

                      msm/back/history_policies.hpp

                      This header provides the out-of-the-box history policies supported by MSM. - There are 3 such policies.

                      Every history policy must implement the following methods:

                      set_initial_states

                      This method is called by msm::back::state_machine when constructed. + be used with generate_state_set or generate_event_set.

                      args.hpp

                      This header provides one type, args. which provides the necessary types for a + visitor implementation.

                      msm/back/history_policies.hpp

                      This header provides the out-of-the-box history policies supported by MSM. + There are 3 such policies.

                      Every history policy must implement the following methods:

                      set_initial_states

                      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).

                      void set_initial_states(); 
                      (int* const) - ;
                       

                      history_exit

                      This method is called by msm::back::state_machine when the submachine + ;

                       

                      history_exit

                      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).

                      void history_exit(); 
                      (int* const) - ;
                       

                      history_entry

                      This method is called by msm::back::state_machine when the submachine + ;

                       

                      history_entry

                      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.

                      template <class Event> int* const history_exit(); 
                      (Event const&) - ;
                       

                      Out-of-the-box policies:

                      NoHistory

                      This policy is the default used by state_machine. No active state of a + ;

                       

                      Out-of-the-box policies:

                      NoHistory

                      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.

                      AlwaysHistory

                      This policy is a non-UML-standard extension. The active state(s) of a + the initial state(s) are activated.

                      AlwaysHistory

                      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.

                      ShallowHistory

                      This policy activates the active state(s) of a submachine if the event - is found in the policy's event list.

                      msm/back/default_compile_policy.hpp

                      This header contains the definition of favor_runtime_speed. This policy has + submachine.

                      ShallowHistory

                      This policy activates the active state(s) of a submachine if the event + is found in the policy's event list.

                      msm/back/default_compile_policy.hpp

                      This header contains the definition of favor_runtime_speed. This policy has two settings:

                      • Submachines dispatch faster because their transitions are added into their containing machine's transition table instead of simply - forwarding events.

                      • It solves transition conflicts at compile-time

                      msm/back/favor_compile_time.hpp

                      This header contains the definition of favor_compile_time. This policy has two settings:

                      • Submachines dispatch is slower because all events, even those with + forwarding events.

                      • It solves transition conflicts at compile-time

                      msm/back/favor_compile_time.hpp

                      This header contains the definition of favor_compile_time. This policy has two settings:

                      • 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.

                      • It solves transition conflicts at run-time.

                      msm/back/metafunctions.hpp

                      This header contains metafunctions for use by the library. Three metafunctions + reduces compile-time.

                    • It solves transition conflicts at run-time.

                    • msm/back/metafunctions.hpp

                      This header contains metafunctions for use by the library. Three metafunctions can be useful for the user:

                      • generate_state_set< stt >: 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.

                      • recursive_get_transition_table<fsm>: recursively extends the transition table of the state machine fsm with tables - from the submachines.

                      msm/back/tools.hpp

                      This header contains a few metaprogramming tools to get some information out - of a state machine.

                      fill_state_names

                      attributes

                      fill_state_names has for attribute:

                      • char const** m_names: an already allocated + from the submachines.

                      msm/back/tools.hpp

                      This header contains a few metaprogramming tools to get some information out + of a state machine.

                      fill_state_names

                      attributes

                      fill_state_names has for attribute:

                      • char const** m_names: an already allocated array of const char* where the typeid-generated names of a - state machine states will be witten.

                      constructor

                      char const** names_to_fill(char const** names_to_fill);

                      usage

                      fill_state_names is made for use in a mpl::for_each iterating on a + state machine states will be witten.

                      constructor

                      char const** names_to_fill(char const** names_to_fill);

                      usage

                      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:

                      typedef some_fsm::stt Stt;
                       typedef msm::back::generate_state_set<Stt>::type all_states; //states
                      @@ -104,10 +104,10 @@ for (unsigned int i=0;i<some_fsm::nr_regions::value;++i)
                           std::cout << " -> " 
                                     << state_names[my_fsm_instance.current_state()[i]] 
                                     << std::endl;
                      -}

                      get_state_name

                      attributes

                      get_state_name has for attributes:

                      • std::string& m_name: the return value of the - iteration

                      • int m_state_id: the searched state's id

                      constructor

                      The constructor takes as argument a reference to the string to fill - with the state name and the id which must be searched.

                      string& name_to_fill,int state_id(string& name_to_fill,int state_id);

                      usage

                      This type is made for the same search as in the previous example, +}

                      get_state_name

                      attributes

                      get_state_name has for attributes:

                      • std::string& m_name: the return value of the + iteration

                      • int m_state_id: the searched state's id

                      constructor

                      The constructor takes as argument a reference to the string to fill + with the state name and the id which must be searched.

                      string& name_to_fill,int state_id(string& name_to_fill,int state_id);

                      usage

                      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.

                      display_type

                      attributes

                      none

                      usage

                      Reusing the state list from the previous example, we can output all + state name reference has been set.

                      display_type

                      attributes

                      none

                      usage

                      Reusing the state list from the previous example, we can output all state names:

                      mpl::for_each<all_states,boost::msm::wrap<mpl::placeholders::_1> >(msm::back::display_type ());

                      \ No newline at end of file diff --git a/doc/HTML/re03.html b/doc/HTML/re03.html index 995c2ce..e3cd077 100644 --- a/doc/HTML/re03.html +++ b/doc/HTML/re03.html @@ -1,11 +1,11 @@ - Front-end

                      Name

                      Front-end — The front-end headers

                      msm/front/common_states.hpp

                      This header contains the predefined types to serve as base for states or state machines:

                      • default_base_state: non-polymorphic empty type.

                      • polymorphic_state: type with a virtual destructor, which makes all - states polymorphic.

                      msm/front/completion_event.hpp

                      This header contains one type, none. This type has several + Front-end

                      Name

                      Front-end — The front-end headers

                      msm/front/common_states.hpp

                      This header contains the predefined types to serve as base for states or state machines:

                      • default_base_state: non-polymorphic empty type.

                      • polymorphic_state: type with a virtual destructor, which makes all + states polymorphic.

                      msm/front/completion_event.hpp

                      This header contains one type, none. This type has several meanings inside a transition table:

                      • as action or guard: that there is no action or guard

                      • as target state: that the transition is an internal transition

                      • as event: the transition is an anonymous (completion) - transition

                      msm/front/functor_row.hpp

                      This header implements the functor front-end's transitions and helpers.

                      Row

                      definition

                       template <class Source,class Event,class Target,class
                      -                                    Action,class Guard> Row {
                      }

                      tags

                      row_type_tag is defined differently for every specialization:

                      • all 5 template parameters means a normal transition with + transition

                      msm/front/functor_row.hpp

                      This header implements the functor front-end's transitions and helpers.

                      Row

                      definition

                       template <class Source,class Event,class Target,class
                      +                                    Action,class Guard> Row {
                      }

                      tags

                      row_type_tag is defined differently for every specialization:

                      • all 5 template parameters means a normal transition with action and guard: typedef row_tag row_type_tag;

                      • Row<Source,Event,Target,none,none> a normal transition without action or guard: typedef _row_tag @@ -21,7 +21,7 @@ transition with action and guard: typedef irow_tag row_type_tag;

                      • Row<Source,Event,none,none,none> an internal transition without action or guard: typedef _irow_tag - row_type_tag;

                      methods

                      Like any other front-end, Row implements the two necessary static + row_type_tag;

                      methods

                      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(

                      ); 
                      (Fsm& fsm,Event const& evt,SourceState&,TargetState,AllStates&) - ;
                       

                      Internal

                      definition

                       template <class Event,class Action,class Guard>
                      -                                    Internal {
                      }

                      tags

                      row_type_tag is defined differently for every specialization:

                      • all 3 template parameters means an internal transition + ;

                       

                      Internal

                      definition

                       template <class Event,class Action,class Guard>
                      +                                    Internal {
                      }

                      tags

                      row_type_tag is defined differently for every specialization:

                      • all 3 template parameters means an internal transition with action and guard: typedef sm_i_row_tag row_type_tag;

                      • Internal<Event,none,none> an internal transition without action or guard: typedef sm__i_row_tag @@ -42,7 +42,7 @@ without guard: typedef sm_a_i_row_tag row_type_tag;

                      • Internal<Event,none,Guard> an internal transition without action: typedef sm_g_i_row_tag - row_type_tag;

                      methods

                      Like any other front-end, Internal implements the two necessary static + row_type_tag;

                      methods

                      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(

                      ); 
                      (Fsm& fsm,Event const& evt,SourceState&,TargetState,AllStates&) - ;
                       

                      ActionSequence_

                      This functor calls every element of the template Sequence (which are also + ;

                       

                      ActionSequence_

                      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,...).

                      definition

                       template <class Sequence> ActionSequence_ {
                      }

                      methods

                      This helper functor is made for use in a transition table and in a + eUML sequence grammar (action1,action2,...).

                      definition

                       template <class Sequence> ActionSequence_ {
                      }

                      methods

                      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:

                      template <class Evt,class Fsm,class @@ -65,13 +65,13 @@

                      template <class Evt,class Fsm,class State> operator()(); 
                      Evt const&, Fsm&, State&;
                       

                      -

                      Defer

                      definition

                       Defer {
                      }

                      methods

                      This helper functor is made for use in a transition table and +

                      Defer

                      definition

                       Defer {
                      }

                      methods

                      This helper functor is made for use in a transition table and therefore implements an operator() with 4 arguments:

                      template <class Evt,class Fsm,class SourceState,class TargetState> operator()(); 
                      Evt const&, Fsm& , SourceState&, - TargetState&;
                       

                      msm/front/internal_row.hpp

                      This header implements the internal transition rows for use inside an + TargetState&;

                       

                      msm/front/internal_row.hpp

                      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.

                      methods

                      Like any other front-end, the following transition row types implements + internal_transition_table.

                      methods

                      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(

                      ); 
                      (Fsm& fsm,Event const& evt,SourceState&,TargetState,AllStates&) - ;
                       

                      a_internal

                      definition

                      This is an internal transition with an action called during the + ;

                       

                      a_internal

                      definition

                      This is an internal transition with an action called during the transition.

                       template< class Event, class CalledForAction, void
                                                           (CalledForAction::*action)(Event const&)>
                      -                                    a_internal {
                      }

                      template parameters

                      + a_internal {
                      }

                      template parameters

                      • Event: the event triggering the internal transition.

                      • 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.

                      • action: a pointer to the method which CalledForAction provides.

                      -

                      g_internal

                      This is an internal transition with a guard called before the transition - and allowing the transition if returning true.

                      definition

                       template< class Event, class CalledForGuard, bool
                      +                        

                      g_internal

                      This is an internal transition with a guard called before the transition + and allowing the transition if returning true.

                      definition

                       template< class Event, class CalledForGuard, bool
                                                           (CalledForGuard::*guard)(Event const&)>
                      -                                    g_internal {
                      }

                      template parameters

                      + g_internal {
                      }

                      template parameters

                      • Event: the event triggering the internal transition.

                      • 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.

                      • guard: a pointer to the method which CalledForGuard provides.

                      -

                      internal

                      This is an internal transition with a guard called before the transition +

                      internal

                      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.

                      definition

                       template< class Event, class CalledForAction, void
                      +                        called during the transition.

                      definition

                       template< class Event, class CalledForAction, void
                                                           (CalledForAction::*action)(Event const&), class
                                                           CalledForGuard, bool (CalledForGuard::*guard)(Event const&)>
                      -                                    internal {
                      }

                      template parameters

                      + internal {
                      }

                      template parameters

                      • Event: the event triggering the internal transition

                      • 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.

                      • 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.

                      • guard: a pointer to the method which CalledForGuard provides.

                      -

                      _internal

                      This is an internal transition without action or guard. This is equivalent - to an explicit "ignore event".

                      definition

                       template< class Event > _internal {
                      }

                      template parameters

                      +

                      _internal

                      This is an internal transition without action or guard. This is equivalent + to an explicit "ignore event".

                      definition

                       template< class Event > _internal {
                      }

                      template parameters

                      • Event: the event triggering the internal transition.

                      -

                      msm/front/row2.hpp

                      This header contains the variants of row2, which are an extension of the +

                      msm/front/row2.hpp

                      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.

                      methods

                      Like any other front-end, the following transition row types implements + through their irow2 variants.

                      methods

                      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(

                      ); 
                      (Fsm& fsm,Event const& evt,SourceState&,TargetState,AllStates&) - ;
                       

                      _row2

                      This is a transition without action or guard. The state machine only - changes active state.

                      definition

                       template< class Source, class Event, class Target >
                      -                                    _row2 {
                      }

                      template parameters

                      + ;

                       

                      _row2

                      This is a transition without action or guard. The state machine only + changes active state.

                      definition

                       template< class Source, class Event, class Target >
                      +                                    _row2 {
                      }

                      template parameters

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • Target: the target state of the transition.

                      -

                      a_row2

                      This is a transition with action and without guard.

                      definition

                       template< class Source, class Event, class Target,
                      +                        

                      a_row2

                      This is a transition with action and without guard.

                      definition

                       template< class Source, class Event, class Target,
                                                        {
                      }
                       class CalledForAction, void
                      -                                    (CalledForAction::*action)(Event const&) > _row2 {
                      }

                      template parameters

                      + (CalledForAction::*action)(Event const&) > _row2 {
                      }

                      template parameters

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • Target: the target state of the transition.

                      • 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.

                      • action: a pointer to the method which CalledForAction provides.

                      -

                      g_row2

                      This is a transition with guard and without action.

                      definition

                       template< class Source, class Event, class Target,
                      +                        

                      g_row2

                      This is a transition with guard and without action.

                      definition

                       template< class Source, class Event, class Target,
                                                        {
                      }
                       class CalledForGuard, bool (CalledForGuard::*guard)(Event
                      -                                    const&) > _row2 {
                      }

                      template parameters

                      + const&) > _row2 {
                      }

                      template parameters

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • Target: the target state of the transition.

                      • 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.

                      • guard: a pointer to the method which CalledForGuard provides.

                      -

                      row2

                      This is a transition with guard and action.

                      definition

                       template< class Source, class Event, class Target,
                      +                        

                      row2

                      This is a transition with guard and action.

                      definition

                       template< class Source, class Event, class Target,
                                                        {
                      }
                       class CalledForAction, void
                                                           (CalledForAction::*action)(Event const&),  {
                      }
                       class CalledForGuard, bool (CalledForGuard::*guard)(Event
                      -                                    const&) > _row2 {
                      }

                      template parameters

                      + const&) > _row2 {
                      }

                      template parameters

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • Target: the target state of the transition.

                      • 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.

                      • 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.

                      • guard: a pointer to the method which CalledForGuard provides.

                      -

                      a_irow2

                      This is an internal transition for use inside a transition table, with - action and without guard.

                      definition

                       template< class Source, class Event,  {
                      }
                       class CalledForAction, void
                      -                                    (CalledForAction::*action)(Event const&) > _row2 {
                      }

                      template parameters

                      +

                      a_irow2

                      This is an internal transition for use inside a transition table, with + action and without guard.

                      definition

                       template< class Source, class Event,  {
                      }
                       class CalledForAction, void
                      +                                    (CalledForAction::*action)(Event const&) > _row2 {
                      }

                      template parameters

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • 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.

                      • action: a pointer to the method which CalledForAction provides.

                      -

                      g_irow2

                      This is an internal transition for use inside a transition table, with - guard and without action.

                      definition

                       template< class Source, class Event,  {
                      }
                       class CalledForGuard, bool (CalledForGuard::*guard)(Event
                      -                                    const&) > _row2 {
                      }

                      template parameters

                      +

                      g_irow2

                      This is an internal transition for use inside a transition table, with + guard and without action.

                      definition

                       template< class Source, class Event,  {
                      }
                       class CalledForGuard, bool (CalledForGuard::*guard)(Event
                      +                                    const&) > _row2 {
                      }

                      template parameters

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • 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.

                      • guard: a pointer to the method which CalledForGuard provides.

                      -

                      irow2

                      This is an internal transition for use inside a transition table, with - guard and action.

                      definition

                       template< class Source, class Event,  {
                      }
                       class CalledForAction, void
                      +                        

                      irow2

                      This is an internal transition for use inside a transition table, with + guard and action.

                      definition

                       template< class Source, class Event,  {
                      }
                       class CalledForAction, void
                                                           (CalledForAction::*action)(Event const&),  {
                      }
                       class CalledForGuard, bool (CalledForGuard::*guard)(Event
                      -                                    const&) > _row2 {
                      }

                      template parameters

                      + const&) > _row2 {
                      }

                      template parameters

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • 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.

                      • 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.

                      • guard: a pointer to the method which CalledForGuard provides.

                      -

                      msm/front/state_machine_def.hpp

                      This header provides the implementation of the basic front-end. It contains one - type, state_machine_def

                      state_machine_def definition

                      This type is the basic class for a basic (or possibly any other) +

                      msm/front/state_machine_def.hpp

                      This header provides the implementation of the basic front-end. It contains one + type, state_machine_def

                      state_machine_def definition

                      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.

                       template <class Derived,class BaseState =
                      -                                default_base_state> state_machine_def {
                      }

                      typedefs

                      + default_base_state> state_machine_def {
                      }

                      typedefs

                      • flag_list: by default, no flag is set in the state machine

                      • deferred_events: by default, no event is deferred.

                      • configuration: by default, no configuration customization is done.

                      -

                      row methods

                      Like any other front-end, the following transition row types +

                      row methods

                      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(

                      ); 
                      (Fsm& fsm,Event const& evt,SourceState&,TargetState,AllStates&) - ;
                       

                      a_row

                      This is a transition with action and without guard.

                      template< class Source, class Event, class Target, + ;

                       

                      a_row

                      This is a transition with action and without guard.

                      template< class Source, class Event, class Target, void (Derived::*action)(Event const&) > a_row

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • Target: the target state of the transition.

                      • action: a pointer to the method provided by the concrete - front-end (represented by Derived).

                      g_row

                      This is a transition with guard and without action.

                      template< class Source, class Event, class Target, + front-end (represented by Derived).

                      g_row

                      This is a transition with guard and without action.

                      template< class Source, class Event, class Target, bool (Derived::*guard)(Event const&) > g_row

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • Target: the target state of the transition.

                      • guard: a pointer to the method provided by the concrete - front-end (represented by Derived).

                      row

                      This is a transition with guard and action.

                      template< class Source, class Event, class Target, + front-end (represented by Derived).

                      row

                      This is a transition with guard and action.

                      template< class Source, class Event, class Target, void (Derived::*action)(Event const&), bool (Derived::*guard)(Event const&) > row

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • Target: the target state of the transition.

                      • action: a pointer to the method provided by the concrete front-end (represented by Derived).

                      • guard: a pointer to the method provided by the concrete - front-end (represented by Derived).

                      _row

                      This is a transition without action or guard. The state machine only + front-end (represented by Derived).

                      _row

                      This is a transition without action or guard. The state machine only changes active state.

                      template< class Source, class Event, class Target > - _row

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • Target: the target state of the transition.

                      a_irow

                      This is an internal transition for use inside a transition table, with + _row

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • Target: the target state of the transition.

                      a_irow

                      This is an internal transition for use inside a transition table, with action and without guard.

                      template< class Source, class Event, void (Derived::*action)(Event const&) > a_irow

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • action: a pointer to the method provided by the concrete - front-end (represented by Derived).

                      g_irow

                      This is an internal transition for use inside a transition table, with + front-end (represented by Derived).

                      g_irow

                      This is an internal transition for use inside a transition table, with guard and without action.

                      template< class Source, class Event, bool (Derived::*guard)(Event const&) > g_irow

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • guard: a pointer to the method provided by the concrete - front-end (represented by Derived).

                      irow

                      This is an internal transition for use inside a transition table, with + front-end (represented by Derived).

                      irow

                      This is an internal transition for use inside a transition table, with guard and action.

                      template< class Source, class Event, void (Derived::*action)(Event const&), bool (Derived::*guard)(Event const&) > irow

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      • action: a pointer to the method provided by the concrete front-end (represented by Derived).

                      • guard: a pointer to the method provided by the concrete - front-end (represented by Derived).

                      _irow

                      This is an internal transition without action or guard. As it does + front-end (represented by Derived).

                      _irow

                      This is an internal transition without action or guard. As it does nothing, it means "ignore event".

                      template< class Source, class Event > - _irow

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      methods

                      state_machine_def provides a default implementation in + _irow

                      • Event: the event triggering the transition.

                      • Source: the source state of the transition.

                      methods

                      state_machine_def 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 BOOST_ASSERT so that the error will only be noticed in @@ -256,30 +256,30 @@ (Event const& ,Fsm&, std::exception&) ;

                       

                      -

                      msm/front/states.hpp

                      This header provides the different states (except state machines) for the - basic front-end (or mixed with other front-ends).

                      types

                      This header provides the following types:

                      no_sm_ptr

                      deprecated: default policy for states. It means that states do not - need to save a pointer to their containing state machine.

                      sm_ptr

                      deprecated: state policy. It means that states need to save a pointer +

                      msm/front/states.hpp

                      This header provides the different states (except state machines) for the + basic front-end (or mixed with other front-ends).

                      types

                      This header provides the following types:

                      no_sm_ptr

                      deprecated: default policy for states. It means that states do not + need to save a pointer to their containing state machine.

                      sm_ptr

                      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.

                      state

                      Basic type for simple states. Inherit from this type to define a + will call set_sm_ptr(fsm*) and give itself as argument.

                      state

                      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.

                       template<class Base = default_base_state,class
                      -                                    SMPtrPolicy = no_sm_ptr> state {
                      }

                      terminate_state

                      Basic type for terminate states. Inherit from this type to define a + SMPtrPolicy = no_sm_ptr> state {
                      }

                      terminate_state

                      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.

                       template<class Base = default_base_state,class
                      -                                    SMPtrPolicy = no_sm_ptr> terminate_state {
                      }

                      interrupt_state

                      Basic type for interrupt states. Interrupt states prevent any further + SMPtrPolicy = no_sm_ptr> terminate_state {
                      }

                      interrupt_state

                      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.

                       template<class EndInterruptEvent,class Base =
                                                           default_base_state, {
                      }
                       class SMPtrPolicy = no_sm_ptr>
                      -                                    interrupt_state {
                      }

                      explicit_entry

                      Inherit from this type in + interrupt_state {
                      }

                      explicit_entry

                      Inherit from this type in addition 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 - initial_state typedef).

                       template <int ZoneIndex=-1> explicit_entry {
                      }

                      entry_pseudo_state

                      Basic type for entry pseudo states. Entry pseudo states are an + initial_state typedef).

                       template <int ZoneIndex=-1> explicit_entry {
                      }

                      entry_pseudo_state

                      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 initial_state typedef). @@ -287,7 +287,7 @@ used in a concrete state machine) to inherit a basic type for logging or providing a common behavior.

                       template<int RegionIndex=-1,class Base =
                                                           default_base_state, {
                      }
                       class SMPtrPolicy = no_sm_ptr>
                      -                                    entry_pseudo_state {
                      }

                      exit_pseudo_state

                      Basic type for exit pseudo states. Exit pseudo states are an + entry_pseudo_state {
                      }

                      exit_pseudo_state

                      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.

                       template<class Event,class Base =
                                                           default_base_state, {
                      }
                       class SMPtrPolicy = no_sm_ptr>
                      -                                    exit_pseudo_state {
                      }

                      msm/front/euml/euml.hpp

                      This header includes all of eUML except the STL functors.

                      msm/front/euml/stl.hpp

                      This header includes all the functors for STL support in eUML. These tables show a full description.

                      msm/front/euml/algorithm.hpp

                      This header includes all the functors for STL algorithms support in eUML. + exit_pseudo_state {
                      }

                      msm/front/euml/euml.hpp

                      This header includes all of eUML except the STL functors.

                      msm/front/euml/stl.hpp

                      This header includes all the functors for STL support in eUML. These tables show a full description.

                      msm/front/euml/algorithm.hpp

                      This header includes all the functors for STL algorithms support in eUML. These tables show a full - description.

                      msm/front/euml/iteration.hpp

                      This header includes iteration functors for STL support in eUML. This tables shows a full - description.

                      msm/front/euml/querying.hpp

                      This header includes querying functors for STL support in eUML. This tables shows a full - description.

                      msm/front/euml/transformation.hpp

                      This header includes transformation functors for STL support in eUML. This + description.

                      msm/front/euml/iteration.hpp

                      This header includes iteration functors for STL support in eUML. This tables shows a full + description.

                      msm/front/euml/querying.hpp

                      This header includes querying functors for STL support in eUML. This tables shows a full + description.

                      msm/front/euml/transformation.hpp

                      This header includes transformation functors for STL support in eUML. This tables shows a full - description.

                      msm/front/euml/container.hpp

                      This header includes container functors for STL support in eUML (functors + description.

                      msm/front/euml/container.hpp

                      This header includes container functors for STL support in eUML (functors calling container methods). This tables shows a full description. It also provides npos for - strings.

                      Npos_<container type>

                      Functor returning npos for transition or state behaviors. Like all + strings.

                      Npos_<container type>

                      Functor returning npos for transition or state behaviors. Like all constants, only the functor form exists, so parenthesis are necessary. Example:

                      string_find_(event_(m_song),Char_<'S'>(),Size_t_<0>()) != Npos_<string>() // compare result of string::find with - npos

                      msm/front/euml/stt_grammar.hpp

                      This header provides the transition table grammars. This includes internal - transition tables.

                      functions

                      build_stt

                      The function build_stt evaluates the grammar-conform expression as + npos

                      msm/front/euml/stt_grammar.hpp

                      This header provides the transition table grammars. This includes internal + transition tables.

                      functions

                      build_stt

                      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 invalid_type, which will lead to a compile-time static assertion when this transition table is passed to a state machine.

                      template<class Expr> [mpl::vector<...> / - msm::front::euml::invalid_type] build_stt(); 
                      Expr const& expr;
                       

                      build_internal_stt

                      The function build_internal_stt evaluates the grammar-conform + msm::front::euml::invalid_type] build_stt(

                      ); 
                      Expr const& expr;
                       

                      build_internal_stt

                      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 invalid_type, which will lead to a compile-time static assertion when this transition table is passed to a state machine.

                      template<class Expr> [mpl::vector<...> / - msm::front::euml::invalid_type] build_internal_stt(); 
                      Expr const& expr;
                       

                      grammars

                      transition + msm::front::euml::invalid_type] build_internal_stt(

                      ); 
                      Expr const& expr;
                       

                      grammars

                      transition table

                      The transition table accepts the following grammar:

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

                      internal transition table

                      The internal transition table accepts the following grammar:

                      IStt := BuildEvent | (IStt ',' IStt)

                      BuildEvent being defined for both internal and standard transition - tables.

                      msm/front/euml/guard_grammar.hpp

                      This header contains the Guard grammar used in the previous +source + event /action, /* internal transition*/

                      internal transition table

                      The internal transition table accepts the following grammar:

                      IStt := BuildEvent | (IStt ',' IStt)

                      BuildEvent being defined for both internal and standard transition + tables.

                      msm/front/euml/guard_grammar.hpp

                      This header contains the Guard grammar used in the previous section. This grammar is long but pretty simple:

                      Guard := action_tag | (Guard '&&' Guard) 
                               | (Guard '||' Guard) | ... /* operators*/
                               | (if_then_else_(Guard,Guard,Guard)) | (function (Action,...Action))

                      Most C++ operators are supported (address-of is not). With function is meant any eUML predefined function or any self-made (using MSM_EUML_METHOD or MSM_EUML_FUNCTION). Action - is a grammar defined in state_grammar.hpp.

                      msm/front/euml/state_grammar.hpp

                      This header provides the grammar for actions and the different grammars and - functions to build states using eUML.

                      action grammar

                      Like the guard grammar, this grammar supports relevant C++ operators and + is a grammar defined in state_grammar.hpp.

                      msm/front/euml/state_grammar.hpp

                      This header provides the grammar for actions and the different grammars and + functions to build states using eUML.

                      action grammar

                      Like the guard grammar, this grammar supports relevant C++ operators and eUML functions:

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

                      attributes

                      This grammar is used to add attributes to states (or state machines) or + ^(bitwise), +=, -=, *=, /=, %=, <<=, >>=, <<, >>, =, [].

                      attributes

                      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:

                      • attributes_ << no_attributes_

                      • attributes_ << attribute_1 << ... << attribute_n

                      Attributes can be of any default-constructible type (fusion - requirement).

                      configure

                      This grammar also has two forms:

                      • configure_ << no_configure_

                      • configure_ << type_1 << ... << + requirement).

                      configure

                      This grammar also has two forms:

                      • configure_ << no_configure_

                      • configure_ << type_1 << ... << type_n

                      This grammar is used to create inside one syntax:

                      • flags: configure_ << some_flag where some_flag inherits from euml_flag<some_flag> or is defined using BOOST_MSM_EUML_FLAG.

                      • deferred events: configure_ << some_event @@ -378,12 +378,12 @@ ActionSequence := Action | (Action ',' Action)

                        Relevant operators are: + some_config inherits from euml_config<some_config>. At the moment, three predefined objects exist (in msm//front/euml/common.hpp):

                        • no_exception: disable catching exceptions

                        • no_msg_queue: disable message queue

                        • deferred_events: manually enable handling of - deferred events

                      initial states

                      The grammar to define initial states for a state machine is: init_ + deferred events

                      initial states

                      The grammar to define initial states for a state machine is: init_ << state_1 << ... << state_n 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.

                      functions

                      build_sm

                      This function has several overloads. The return type is not relevant + BOOST_MSM_EUML_ENTRY_STATE or BOOST_MSM_EUML_EXIT_STATE.

                      functions

                      build_sm

                      This function has several overloads. The return type is not relevant to you as only decltype (return type) is what one needs.

                      Defines a state machine without entry or exit:

                      template <class StateNameTag,class Stt,class Init> func_state_machine<...> build_sm(); 
                      Stt ,Init;
                       

                      Defines a state machine with entry behavior:

                      template <class StateNameTag,class Stt,class Init,class Expr1> func_state_machine<...> build_sm(); 
                      Stt ,Init,Expr1 const&;
                       

                      Defines a state machine with entry and exit behaviors:

                      template <class StateNameTag,class Stt,class Init,class @@ -402,7 +402,7 @@ ActionSequence := Action | (Action ',' Action)

                      Relevant operators are: + Base> func_state_machine<...> build_sm(

                      ); 
                      Stt ,Init,Expr1 const&, Expr2 const&, Attributes const&, Configure const&, Base;
                       

                      Notice that this function requires the extra parameter class StateNameTag to disambiguate state machines having the same parameters - but still being different.

                      build_state

                      This function has several overloads. The return type is not relevant + but still being different.

                      build_state

                      This function has several overloads. The return type is not relevant to you as only decltype (return type) is what one needs.

                      Defines a simple state without entry or exit:

                      func_state<class StateNameTag,...> build_state(); 
                      ;
                       

                      Defines a simple state with entry behavior:

                      template <class StateNameTag,class Expr1> func_state<...> build_state(); 
                      Expr1 const&;
                       

                      Defines a simple state with entry and exit behaviors:

                      template <class StateNameTag,class Expr1, class Expr2> func_state<...> build_state(); 
                      Expr1 const&,Expr2 const&;
                       

                      Defines a simple state with entry, exit behaviors and @@ -418,7 +418,7 @@ ActionSequence := Action | (Action ',' Action)

                      Relevant operators are: + func_state<...> build_state(

                      ); 
                      Expr1 const&, Expr2 const&, Attributes const&, Configure const&, Base;
                       

                      Notice that this function requires the extra parameter class StateNameTag to disambiguate states having the same parameters but still - being different.

                      build_terminate_state

                      This function has the same overloads as build_state.

                      build_interrupt_state

                      This function has several overloads. The return type is not relevant + being different.

                      build_terminate_state

                      This function has the same overloads as build_state.

                      build_interrupt_state

                      This function has several overloads. The return type is not relevant to you as only decltype (return type) is what one needs.

                      Defines an interrupt state without entry or exit:

                      template <class StateNameTag,class EndInterruptEvent> func_state<...> build_interrupt_state(); 
                      EndInterruptEvent const&;
                       

                      Defines an interrupt state with entry behavior:

                      template <class StateNameTag,class EndInterruptEvent,class Expr1> func_state<...> @@ -443,7 +443,7 @@ ActionSequence := Action | (Action ',' Action)

                      Relevant operators are: + const&, Attributes const&, Configure const&, Base;

                       

                      Notice that this function requires the extra parameter class StateNameTag to disambiguate states having the same parameters but still - being different.

                      build_entry_state

                      This function has several overloads. The return type is not relevant + being different.

                      build_entry_state

                      This function has several overloads. The return type is not relevant to you as only decltype (return type) is what one needs.

                      Defines an entry pseudo state without entry or exit:

                      template <class StateNameTag,int RegionIndex> entry_func_state<...> build_entry_state(); 
                      ;
                       

                      Defines an entry pseudo state with entry behavior:

                      template <class StateNameTag,int RegionIndex,class Expr1> entry_func_state<...> build_entry_state(); 
                      Expr1 const&;
                       

                      Defines an entry pseudo state with entry and exit behaviors:

                      template <class StateNameTag,int RegionIndex,class @@ -462,7 +462,7 @@ ActionSequence := Action | (Action ',' Action)

                      Relevant operators are: + Base> entry_func_state<...> build_entry_state(

                      ); 
                      Expr1 const&, Expr2 const&, Attributes const&, Configure const&, Base;
                       

                      Notice that this function requires the extra parameter class StateNameTag to disambiguate states having the same parameters but still - being different.

                      build_exit_state

                      This function has several overloads. The return type is not relevant + being different.

                      build_exit_state

                      This function has several overloads. The return type is not relevant to you as only decltype (return type) is what one needs.

                      Defines an exit pseudo state without entry or exit:

                      template <class StateNameTag,class Event> exit_func_state<...> build_exit_state(); 
                      Event const&;
                       

                      Defines an exit pseudo state with entry behavior:

                      template <class StateNameTag,class Event,class Expr1> exit_func_state<...> build_exit_state(); 
                      Event const&,Expr1 const&;
                       

                      Defines an exit pseudo state with entry and exit behaviors:

                      template <class StateNameTag,class Event,class Expr1, @@ -481,8 +481,8 @@ ActionSequence := Action | (Action ',' Action)

                      Relevant operators are: + exit_func_state<...> build_exit_state(

                      ); 
                      Event const&,Expr1 const&, Expr2 const&, Attributes const&, Configure const&, Base;
                       

                      Notice that this function requires the extra parameter class StateNameTag to disambiguate states having the same parameters but still - being different.

                      build_explicit_entry_state

                      This function has the same overloads as build_entry_state and - explicit_entry_func_state as return type.

                      msm/front/euml/common.hpp

                      types

                      euml_event

                      The basic type for events with eUML.

                       template <class EventName> euml_event; {
                      }
                      struct play : euml_event<play>{};

                      euml_state

                      The basic type for states with eUML. You will usually not use this + being different.

                      build_explicit_entry_state

                      This function has the same overloads as build_entry_state and + explicit_entry_func_state as return type.

                      msm/front/euml/common.hpp

                      types

                      euml_event

                      The basic type for events with eUML.

                       template <class EventName> euml_event; {
                      }
                      struct play : euml_event<play>{};

                      euml_state

                      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)

                      Relevant operators are: + void foo() {...} template <class Event,class Fsm> void on_entry(Event const& evt,Fsm& fsm){...} -};

                      euml_flag

                      The basic type for flags with eUML.

                       template <class FlagName> euml_flag; {
                      }
                      struct PlayingPaused: euml_flag<PlayingPaused>{};

                      euml_action

                      The basic type for state or transition behaviors and guards with +};

                      euml_flag

                      The basic type for flags with eUML.

                       template <class FlagName> euml_flag; {
                      }
                      struct PlayingPaused: euml_flag<PlayingPaused>{};

                      euml_action

                      The basic type for state or transition behaviors and guards with eUML.

                       template <class AcionName> euml_action; {
                      }
                      struct close_drawer : euml_action<close_drawer>
                       {
                           template <class Fsm,class Evt,class SourceState,class TargetState>
                      @@ -502,41 +502,41 @@ ActionSequence := Action | (Action ',' Action)

                      Relevant operators are: + { template <class Event,class Fsm,class State> void operator()(Event const&,Fsm& fsm,State& ){...} -};

                      euml_config

                      The basic type for configuration possibilities with eUML.

                       template <class ConfigName> euml_config; {
                      }

                      You normally do not use this type directly but instead the instances +};

                      euml_config

                      The basic type for configuration possibilities with eUML.

                       template <class ConfigName> euml_config; {
                      }

                      You normally do not use this type directly but instead the instances of predefined configuration:

                      • no_exception: disable catching exceptions

                      • no_msg_queue: disable message queue. The message queue allows you to send an event for procesing while in an event processing.

                      • deferred_events: manually enable handling of deferred - events

                      invalid_type

                      Type returned by grammar parsers if the grammar is invalid. Seeing - this type will result in a static assertion.

                      no_action

                      Placeholder type for use in entry/exit or transition behaviors, which - does absolutely nothing.

                      source_

                      Generic object or function for the source state of a given transition:

                      • as object: returns by reference the source state of a + events

                      invalid_type

                      Type returned by grammar parsers if the grammar is invalid. Seeing + this type will result in a static assertion.

                      no_action

                      Placeholder type for use in entry/exit or transition behaviors, which + does absolutely nothing.

                      source_

                      Generic object or function for the source state of a given transition:

                      • 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).

                        Example:

                        some_user_function_(source_)
                      • as function: returns by reference the attribute passed as parameter.

                        Example: -

                        source_(m_counter)++

                      target_

                      Generic object or function for the target state of a given transition:

                      • as object: returns by reference the target state of a +

                        source_(m_counter)++

                      target_

                      Generic object or function for the target state of a given transition:

                      • 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).

                        Example:

                        some_user_function_(target_)
                      • as function: returns by reference the attribute passed as parameter.

                        Example: -

                        target_(m_counter)++

                      state_

                      Generic object or function for the state of a given entry / exit +

                      target_(m_counter)++

                      state_

                      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:

                      • 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).

                        Example:

                        some_user_function_(state_) // calls some_user_function on the current state
                      • as function: returns by reference the attribute passed as parameter.

                        Example: -

                        state_(m_counter)++

                      event_

                      Generic object or function for the event triggering a given transition +

                      state_(m_counter)++

                      event_

                      Generic object or function for the event triggering a given transition (valid in a transition behavior, as well as in state entry/exit behaviors):

                      • 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).

                        Example:

                        some_user_function_(event_)
                      • as function: returns by reference the attribute passed as parameter.

                        Example: -

                        event_(m_counter)++

                      fsm_

                      Generic object or function for the state machine containing a given transition:

                      • as object: returns by reference the event of a transition, +

                        event_(m_counter)++

                      fsm_

                      Generic object or function for the state machine containing a given transition:

                      • 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).

                        Example:

                        some_user_function_(fsm_)
                      • as function: returns by reference the attribute passed as parameter.

                        Example: -

                        fsm_(m_counter)++

                      substate_

                      Generic object or function returning a state of a given state machine:

                      • with 1 parameter: returns by reference the state passed as +

                        fsm_(m_counter)++

                      substate_

                      Generic object or function returning a state of a given state machine:

                      • 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).

                        Example:

                        some_user_function_(substate_(my_state))
                      • with 2 parameters: returns by reference the state passed @@ -544,46 +544,46 @@ ActionSequence := Action | (Action ',' Action)

                        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_.

                        Example (equivalent to the previous example): -

                        some_user_function_(substate_(my_state,fsm_))

                      attribute_

                      Generic object or function returning the attribute passed (by name) as +

                      some_user_function_(substate_(my_state,fsm_))

                      attribute_

                      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:

                      attribute_(substate_(my_state),cd_name_attribute)++

                      -

                      True_

                      Functor returning true for transition or state behaviors. Like all +

                      True_

                      Functor returning true for transition or state behaviors. Like all constants, only the functor form exists, so parenthesis are necessary. Example:

                      if_then_(True_(),/* some action always called*/)

                      -

                      False_

                      Functor returning false for transition or state behaviors. Like all +

                      False_

                      Functor returning false for transition or state behaviors. Like all constants, only the functor form exists, so parenthesis are necessary. Example:

                      if_then_(False_(),/* some action never called */)

                      -

                      Int_<int value>

                      Functor returning an integer value for transition or state behaviors. +

                      Int_<int value>

                      Functor returning an integer value for transition or state behaviors. Like all constants, only the functor form exists, so parenthesis are necessary. Example:

                      target_(m_ringing_cpt) = Int_<RINGING_TIME>() // RINGING_TIME is a constant

                      -

                      Char_<char value>

                      Functor returning a char value for transition or state behaviors. Like +

                      Char_<char value>

                      Functor returning a char value for transition or state behaviors. Like all constants, only the functor form exists, so parenthesis are necessary. Example:

                      // look for 'S' in event.m_song
                       [string_find_(event_(m_song),Char_<'S'>(),Size_t_<0>()) != Npos_<string>()]

                      -

                      Size_t_<size_t value>

                      Functor returning a size_t value for transition or state behaviors. +

                      Size_t_<size_t value>

                      Functor returning a size_t value for transition or state behaviors. Like all constants, only the functor form exists, so parenthesis are necessary. Example:

                      substr_(event_(m_song),Size_t_<1>()) // returns a substring of event.m_song

                      -

                      String_ < mpl::string >

                      Functor returning a string for transition or state behaviors. Like all +

                      String_ < mpl::string >

                      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.

                      Example:

                      // adds "Let it be" to fsm.m_src_container
                       push_back_(fsm_(m_src_container), String_<mpl::string<'Let','it ','be'> >())

                      -

                      Predicate_ < some_stl_compatible_functor >

                      This functor eUML-enables a STL functor (for use in an algorithm). +

                      Predicate_ < some_stl_compatible_functor >

                      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.

                      Example:

                      //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>())

                      process_

                      This function sends an event to up to 4 state machines by calling + Predicate_<std::plus<int> >()) == Int_<1>())

                      process_

                      This function sends an event to up to 4 state machines by calling process_event on them:

                      • process_(some_event) : processes an event in the current (containing) state machine.

                      • process_(some_event [,fsm1...fsm4] ) : processes the same event in the 1-4 state machines passed as - argument.

                      process2_

                      This function sends an event to up to 3 state machines by calling + argument.

                      process2_

                      This function sends an event to up to 3 state machines by calling process_event on them and copy-constructing the event from the data passed as second parameter:

                      • process2_(some_event, some_data) : processes an event in the current (containing) state machine.

                      • 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))

                        With the following definitions:

                        BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::string,m_song)//declaration of m_song
                        -NotFound (const string& data) // copy-constructor of NotFound

                      is_flag_

                      This function tells if a flag is active by calling +NotFound (const string& data) // copy-constructor of NotFound

                      is_flag_

                      This function tells if a flag is active by calling is_flag_active on the current state machine or one passed as parameter:

                      • is_flag_(some_flag) : calls is_flag_active on the current (containing) state machine.

                      • is_flag_(some_flag, some_fsm) :calls is_flag_active on the state machine.passed - as argument.

                      defer_

                      This object defers the current event by calling + as argument.

                      defer_

                      This object defers the current event by calling defer_event on the current state machine. - Example:

                      Empty() + play() / defer_

                      explicit_(submachine-name,state-name)

                      Used as transition's target, causes an explicit entry into the given + Example:

                      Empty() + play() / defer_

                      explicit_(submachine-name,state-name)

                      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.

                      entry_pt_(submachine-name,state-name)

                      Used as transition's target from a containing state machine, causes + BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE.

                      entry_pt_(submachine-name,state-name)

                      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.

                      exit_pt_(submachine-name,state-name)

                      Used as transition's source from a containing state machine, causes + BOOST_MSM_EUML_ENTRY_STATE.

                      exit_pt_(submachine-name,state-name)

                      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.

                      MSM_EUML_FUNCTION

                      This macro creates a eUML function and a functor for use with the + BOOST_MSM_EUML_EXIT_STATE.

                      MSM_EUML_FUNCTION

                      This macro creates a eUML function and a functor for use with the functor front-end, based on a free function:

                      • first parameter: the name of the functor

                      • second parameter: the underlying function

                      • third parameter: the eUML function name

                      • fourth parameter: the return type if used in a transition behavior

                      • fifth parameter: the return type if used in a state behavior (entry/exit)

                      Note that the function itself can take up to 5 @@ -618,7 +618,7 @@ NotFound (const string& data) // copy-constructor of NotFound

                      MSM_EUML_FUNCTION(BinarySearch_,std::binary_search,binary_search_,bool,bool)

                      Can be used like:

                      binary_search_(begin_(fsm_(m_var)),end_(fsm_(m_var)),Int_<9>())

                      -

                      MSM_EUML_METHOD

                      This macro creates a eUML function and a functor for use with the +

                      MSM_EUML_METHOD

                      This macro creates a eUML function and a functor for use with the functor front-end, based on a method:

                      • first parameter: the name of the functor

                      • second parameter: the underlying function

                      • third parameter: the eUML function name

                      • fourth parameter: the return type if used in a transition behavior

                      • fifth parameter: the return type if used in a state behavior (entry/exit)

                      Note that the method itself can take up to 4 arguments @@ -630,40 +630,40 @@ NotFound (const string& data) // copy-constructor of NotFound

                      Can be used like:

                      Empty == Open + open_close / (close_drawer , activate_empty_(target_))

                      -

                      BOOST_MSM_EUML_ACTION(action-instance-name)

                      This macro declares a behavior type and a const instance for use in +

                      BOOST_MSM_EUML_ACTION(action-instance-name)

                      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:

                      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& ){...}
                      -};

                      BOOST_MSM_EUML_FLAG(flag-instance-name)

                      This macro declares a flag type and a const instance for use in - behaviors.

                      BOOST_MSM_EUML_FLAG_NAME(flag-instance-name)

                      This macro returns the name of the flag type generated by +};

                      BOOST_MSM_EUML_FLAG(flag-instance-name)

                      This macro declares a flag type and a const instance for use in + behaviors.

                      BOOST_MSM_EUML_FLAG_NAME(flag-instance-name)

                      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:

                      fsm.is_flag_active<BOOST_MSM_EUML_FLAG_NAME(CDLoaded)>()

                      BOOST_MSM_EUML_DECLARE_ATTRIBUTE(event-type,event-name)

                      This macro declares an attribute called event-name of type event-type. + with the back-end method is_flag_active). For example:

                      fsm.is_flag_active<BOOST_MSM_EUML_FLAG_NAME(CDLoaded)>()

                      BOOST_MSM_EUML_DECLARE_ATTRIBUTE(event-type,event-name)

                      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.

                      BOOST_MSM_EUML_ATTRIBUTES(attributes-expression,attributes-name)

                      This macro declares an attribute list called attributes-name based on + BOOST_MSM_EUML_ATTRIBUTES.

                      BOOST_MSM_EUML_ATTRIBUTES(attributes-expression,attributes-name)

                      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.

                      Attributes are added using left-shift, for example:

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

                      BOOST_MSM_EUML_EVENT(event-instance name)

                      This macro defines an event type (event-instance-name_helper) and +BOOST_MSM_EUML_ATTRIBUTES((attributes_ << m_song ), FoundDef)

                      BOOST_MSM_EUML_EVENT(event-instance name)

                      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.

                      BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(event-instance-name,attributes)

                      This macro defines an event type (event-instance-name_helper) and + for use in a transition table or state behaviors.

                      BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(event-instance-name,attributes)

                      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:

                      BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(Found,FoundDef)

                      The created event instance supports operator()(attributes) so that

                      my_back_end.process_event(Found(some_string))

                      - is possible.

                      BOOST_MSM_EUML_EVENT_NAME(event-instance-name)

                      This macro returns the name of the event type generated by + is possible.

                      BOOST_MSM_EUML_EVENT_NAME(event-instance-name)

                      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:

                      typedef msm::back::state_machine<Playing_,
                       msm::back::ShallowHistory<mpl::vector<BOOST_MSM_EUML_EVENT_NAME(end_pause)
                       > > > Playing_type;

                      -

                      BOOST_MSM_EUML_STATE(build-expression,state-instance-name)

                      This macro defines a state type (state-instance-name_helper) and +

                      BOOST_MSM_EUML_STATE(build-expression,state-instance-name)

                      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.

                      There are several possibilitites for the expression syntax:

                      • (): state without entry or exit action.

                      • (Expr1): state with entry but no exit action.

                      • (Expr1,Expr2): state with entry and exit action.

                      • (Expr1,Expr2,Attributes): state with entry and exit action, defining some attributes.

                      • (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).

                      • (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).

                      BOOST_MSM_EUML_INTERRUPT_STATE(build-expression,state-instance-name)

                      This macro defines an interrupt state type + non-default base state (as defined in standard MSM).

                      BOOST_MSM_EUML_INTERRUPT_STATE(build-expression,state-instance-name)

                      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.

                      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).

                      BOOST_MSM_EUML_TERMINATE_STATE(build-expression,state-instance-name)

                      This macro defines a terminate pseudo-state type + MSM).

                      BOOST_MSM_EUML_TERMINATE_STATE(build-expression,state-instance-name)

                      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.

                      There are several possibilitites for the expression syntax:

                      • (): 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).

                      BOOST_MSM_EUML_EXIT_STATE(build-expression,state-instance-name)

                      This macro defines an exit pseudo-state type + MSM).

                      BOOST_MSM_EUML_EXIT_STATE(build-expression,state-instance-name)

                      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.

                      There are several possibilitites for the expression syntax:

                      • (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).

                      Note that the forwarded_event must be constructible from the event - sent by the submachine containing the exit point.

                      BOOST_MSM_EUML_ENTRY_STATE(int + sent by the submachine containing the exit point.

                      BOOST_MSM_EUML_ENTRY_STATE(int region-index,build-expression,state-instance-name)

                      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).

                      BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE(int + MSM).

                      BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE(int region-index,build-expression,state-instance-name)

                      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).

                    • (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).

                    • BOOST_MSM_EUML_STATE_NAME(state-instance-name)

                      This macro returns the name of the state type generated by + non-default base state (as defined in standard MSM).

                      BOOST_MSM_EUML_STATE_NAME(state-instance-name)

                      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:

                      fsm.get_state<BOOST_MSM_EUML_STATE_NAME(StringFind)&>().some_state_function();

                      -

                      BOOST_MSM_EUML_DECLARE_STATE(build-expression,state-instance-name)

                      Like BOOST_MSM_EUML_STATE but does not provide an instance, simply a - type declaration.

                      BOOST_MSM_EUML_DECLARE_INTERRUPT_STATE(build-expression,state-instance-name)

                      Like BOOST_MSM_EUML_INTERRUPT_STATE but does not provide an instance, - simply a type declaration.

                      BOOST_MSM_EUML_DECLARE_TERMINATE_STATE(build-expression,state-instance-name)

                      Like BOOST_MSM_EUML_TERMINATE_STATE but does not provide an instance, - simply a type declaration.

                      BOOST_MSM_EUML_DECLARE_EXIT_STATE(build-expression,state-instance-name)

                      Like BOOST_MSM_EUML_EXIT_STATE but does not provide an instance, - simply a type declaration.

                      BOOST_MSM_EUML_DECLARE_ENTRY_STATE(int +

                      BOOST_MSM_EUML_DECLARE_STATE(build-expression,state-instance-name)

                      Like BOOST_MSM_EUML_STATE but does not provide an instance, simply a + type declaration.

                      BOOST_MSM_EUML_DECLARE_INTERRUPT_STATE(build-expression,state-instance-name)

                      Like BOOST_MSM_EUML_INTERRUPT_STATE but does not provide an instance, + simply a type declaration.

                      BOOST_MSM_EUML_DECLARE_TERMINATE_STATE(build-expression,state-instance-name)

                      Like BOOST_MSM_EUML_TERMINATE_STATE but does not provide an instance, + simply a type declaration.

                      BOOST_MSM_EUML_DECLARE_EXIT_STATE(build-expression,state-instance-name)

                      Like BOOST_MSM_EUML_EXIT_STATE but does not provide an instance, + simply a type declaration.

                      BOOST_MSM_EUML_DECLARE_ENTRY_STATE(int region-index,build-expression,state-instance-name)

                      Like BOOST_MSM_EUML_ENTRY_STATE but does not provide an instance, - simply a type declaration.

                      BOOST_MSM_EUML_DECLARE_EXPLICIT_ENTRY_STATE(int + simply a type declaration.

                      BOOST_MSM_EUML_DECLARE_EXPLICIT_ENTRY_STATE(int region-index,build-expression,state-instance-name)

                      Like BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE but does not provide an - instance, simply a type declaration.

                      BOOST_MSM_EUML_TRANSITION_TABLE(expression, + instance, simply a type declaration.

                      BOOST_MSM_EUML_TRANSITION_TABLE(expression, table-instance-name)

                      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 transition - table grammar.

                      BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(iexpression,table-instance-name)

                      Like BOOST_MSM_EUML_TRANSITION_TABLE but does not provide an instance, - simply a type declaration.

                      BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expression, + table grammar.

                      BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(iexpression,table-instance-name)

                      Like BOOST_MSM_EUML_TRANSITION_TABLE but does not provide an instance, + simply a type declaration.

                      BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expression, table-instance-name)

                      This macro declares a transition table type and also declares a const instance of the table.The expression must follow the transition table - grammar. For the moment, this macro is not used.

                      BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(iexpression,table-instance-name)

                      Like BOOST_MSM_EUML_TRANSITION_TABLE but does not provide an instance, + grammar. For the moment, this macro is not used.

                      BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(iexpression,table-instance-name)

                      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:

                      BOOST_MSM_EUML_DECLARE_STATE((Open_Entry,Open_Exit),Open_def)
                       struct Open_impl : public Open_def
                      diff --git a/doc/PDF/examples/SimplePhoenix.cpp b/doc/PDF/examples/SimplePhoenix.cpp
                      new file mode 100644
                      index 0000000..7df5009
                      --- /dev/null
                      +++ b/doc/PDF/examples/SimplePhoenix.cpp
                      @@ -0,0 +1,258 @@
                      +// Copyright 2010 Christophe Henry
                      +// henry UNDERSCORE christophe AT hotmail DOT com
                      +// This is an extended version of the state machine available in the boost::mpl library
                      +// Distributed under the same license as the original.
                      +// Copyright for the original version:
                      +// Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed
                      +// under the Boost Software License, Version 1.0. (See accompanying
                      +// file LICENSE_1_0.txt or copy at
                      +// http://www.boost.org/LICENSE_1_0.txt)
                      +
                      +#include 
                      +#include 
                      +
                      +#include 
                      +
                      +// add phoenix support in eUML
                      +#define BOOST_MSM_EUML_PHOENIX_SUPPORT
                      +#include 
                      +#include 
                      +
                      +
                      +using namespace std;
                      +using namespace boost::msm::front::euml;
                      +namespace msm = boost::msm;
                      +using namespace boost::phoenix;
                      +
                      +// entry/exit/action/guard logging functors
                      +#include "logging_functors.h"
                      +
                      +namespace  // Concrete FSM implementation
                      +{
                      +    // events
                      +    BOOST_MSM_EUML_EVENT(end_pause)
                      +    BOOST_MSM_EUML_EVENT(stop)
                      +    BOOST_MSM_EUML_EVENT(pause)
                      +    BOOST_MSM_EUML_EVENT(open_close)
                      +    struct play_event : boost::msm::front::euml::euml_event
                      +    {
                      +    };
                      +    play_event play;
                      +
                      +    enum DiskTypeEnum
                      +    {
                      +        DISK_CD=0,
                      +        DISK_DVD=1
                      +    };
                      +    // A "complicated" event type that carries some data.
                      +    struct cd_detected_event : boost::msm::front::euml::euml_event
                      +    {
                      +        cd_detected_event(){}
                      +        cd_detected_event(std::string const& name,DiskTypeEnum disk):cd_name(name),cd_type(disk){}
                      +        std::string cd_name;
                      +        DiskTypeEnum cd_type;
                      +    };
                      +    // define an instance for a nicer transition table
                      +    cd_detected_event cd_detected;
                      +
                      +    // Concrete FSM implementation 
                      +    // The list of FSM states
                      +    // state not needing any entry or exit
                      +    BOOST_MSM_EUML_STATE((),Paused)
                      +
                      +    // states with standard eUML actions
                      +    BOOST_MSM_EUML_STATE(( Stopped_Entry,Stopped_Exit ),Stopped)
                      +    BOOST_MSM_EUML_STATE(( Playing_Entry,Playing_Exit ),Playing)
                      +
                      +    // a "standard" msm state
                      +    struct Empty_impl : public msm::front::state<> , public euml_state
                      +    {
                      +        // this allows us to add some functions
                      +        void foo() {std::cout << "Empty::foo " << std::endl;}
                      +        // standard entry behavior
                      +        template 
                      +        void on_entry(Event const& evt,FSM& fsm) 
                      +        {
                      +            std::cout << "entering: Empty" << std::endl;
                      +        }
                      +        template 
                      +        void on_exit(Event const& evt,FSM& fsm) 
                      +        {
                      +            std::cout << "leaving: Empty" << std::endl;
                      +        }
                      +    };
                      +    //instance for use in the transition table
                      +    Empty_impl const Empty;
                      +
                      +    // entry and exit actions as phoenix functions
                      +    struct open_entry_impl
                      +    {
                      +        typedef void result_type;
                      +        void operator()()
                      +        {
                      +            cout << "entering: Open" << endl;
                      +        }
                      +    };
                      +    boost::phoenix::function open_entry;
                      +    struct open_exit_impl
                      +    {
                      +        typedef void result_type;
                      +        void operator()()
                      +        {
                      +            cout << "leaving: Open" << endl;
                      +        }
                      +    };
                      +    boost::phoenix::function open_exit;
                      +
                      +    // a state using phoenix for entry/exit actions
                      +    BOOST_MSM_EUML_STATE(( open_entry(),open_exit() ),Open)
                      +
                      +    // actions and guards using boost::phoenix
                      +    struct start_playback_impl
                      +    {
                      +        typedef void result_type;
                      +        void operator()()
                      +        {
                      +            cout << "calling: start_playback" << endl;
                      +        }
                      +    };
                      +    boost::phoenix::function start_playback;
                      +
                      +    // a guard taking the event as argument
                      +    struct good_disk_format_impl
                      +    {
                      +        typedef bool result_type;
                      +
                      +        template 
                      +        bool operator()(Event const& evt)
                      +        {
                      +            // to test a guard condition, let's say we understand only CDs, not DVD
                      +            if (evt.cd_type!=DISK_CD)
                      +            {
                      +                std::cout << "wrong disk, sorry" << std::endl;
                      +                return false;
                      +            }
                      +            std::cout << "good disk" << std::endl;
                      +            return true;
                      +        }
                      +    };
                      +    boost::phoenix::function good_disk_format;
                      +
                      +    // a simple action
                      +    struct store_cd_info_impl
                      +    {
                      +        typedef void result_type;
                      +        void operator()()
                      +        {
                      +            cout << "calling: store_cd_info" << endl;
                      +        }
                      +    };
                      +    boost::phoenix::function store_cd_info;
                      +
                      +    // an action taking the fsm as argument and sending it a new event
                      +    struct process_play_impl
                      +    {
                      +        typedef void result_type;
                      +
                      +        template 
                      +        void operator()(Fsm& fsm)
                      +        {
                      +            cout << "queuing a play event" << endl;
                      +            fsm.process_event(play);
                      +        }
                      +    };
                      +    // it is also possible to use BOOST_PHOENIX_ADAPT_CALLABLE to avoid defining a global variable
                      +    BOOST_PHOENIX_ADAPT_CALLABLE(process_play, process_play_impl, 1)
                      +
                      + 
                      +    // transition table. Actions and guards are written as phoenix functions
                      +    BOOST_MSM_EUML_TRANSITION_TABLE((
                      +          //an action without arguments
                      +          Playing   == Stopped  + play        / start_playback()                            , 
                      +          Playing   == Paused   + end_pause                                                 ,
                      +          //  +------------------------------------------------------------------------------+
                      +          Empty     == Open     + open_close                                                ,
                      +          //  +------------------------------------------------------------------------------+
                      +          Open      == Empty    + open_close                                                ,
                      +          Open      == Paused   + open_close                                                ,
                      +          Open      == Stopped  + open_close                                                ,
                      +          Open      == Playing  + open_close                                                ,
                      +          //  +------------------------------------------------------------------------------+
                      +          Paused    == Playing  + pause                                                     ,
                      +          //  +------------------------------------------------------------------------------+
                      +          Stopped   == Playing  + stop                                                      ,
                      +          Stopped   == Paused   + stop                                                      ,
                      +          // a guard taking the event as argument
                      +          // and an action made of a phoenix expression of 2 actions
                      +          // _event is a placeholder for the current event
                      +          // _fsm is a placeholder for the current state machine
                      +          Stopped   == Empty    + cd_detected [good_disk_format(_event)] 
                      +                                              / (store_cd_info(),process_play(_fsm)),
                      +          Stopped   == Stopped  + stop                            
                      +          //  +------------------------------------------------------------------------------+
                      +         ),transition_table)
                      +
                      +    // create a state machine "on the fly"
                      +    BOOST_MSM_EUML_DECLARE_STATE_MACHINE(( transition_table, //STT
                      +                                        init_ << Empty, // Init State
                      +                                        no_action, // Entry
                      +                                        no_action, // Exit
                      +                                        attributes_ << no_attributes_, // Attributes
                      +                                        configure_ << no_configure_, // configuration
                      +                                        Log_No_Transition // no_transition handler
                      +                                        ),
                      +                                      player_) //fsm name
                      +
                      +    // or simply, if no no_transition handler needed:
                      +    //BOOST_MSM_EUML_DECLARE_STATE_MACHINE(( transition_table, //STT
                      +    //                                    Empty // Init State
                      +    //                                 ),player_)
                      +
                      +    // choice of back-end
                      +    typedef msm::back::state_machine player;
                      +
                      +    //
                      +    // Testing utilities.
                      +    //
                      +    static char const* const state_names[] = { "Stopped", "Paused", "Open", "Empty", "Playing" };
                      +    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);
                      +        // will be rejected, wrong disk type
                      +        p.process_event(
                      +            cd_detected_event("louie, louie",DISK_DVD)); pstate(p);
                      +        p.process_event(
                      +            cd_detected_event("louie, louie",DISK_CD)); pstate(p);
                      +        // no need to call play as the previous event does it in its action method
                      +        //p.process_event(play);
                      +
                      +        // 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 none is defined in the transition table
                      +        p.process_event(stop);  pstate(p);
                      +        // test call to no_transition
                      +        p.process_event(pause); pstate(p);
                      +    }
                      +}
                      +
                      +int main()
                      +{
                      +    test();
                      +    return 0;
                      +}
                      +
                      diff --git a/doc/PDF/msm.pdf b/doc/PDF/msm.pdf
                      index dbc8e93b39dbdb53de3a249c8783f4464bd6e542..31354d5495369e829261b62e3123d9b85c02430c 100644
                      GIT binary patch
                      delta 84636
                      zcmZ2@(0SKU=Lt3wo%)zfjEy&5=Hi+Bm?xga#MsJsvm0*^BbYUL4&O8g!;F7b{a(H%
                      z1A&I`c1L@SBC2y=o?mrQVlrP#-XjMOQMP~yN4Ib9=sb9*VEX%a`%ZslX*?R?f6`;g
                      zv4|B>m+CE>o+(^u*`#_UD%gzwfB6p<$vY>mO+M?$Fg@_}+N}@P@2@@;)Y)aIW>T=^
                      z&Wi|b)_tv?Pql7rsnI#kux`z(W!wR4V%~L`sO)U8uidiZanPNEtzyBBhDT4VZ8TXL
                      z^vOc$$(y@Zoj=RG@3%T&SaLXf+uPbdipu#J{npc_Pqbzfp1fAzzo-FMYFUqy?_s?X!XUpetK6JN>U3#F1^R|!o`YqU19opPA9G-PE1TuY}
                      z$&tWZtI@E1T5|4@Om}bn>5pXUs+YEZI9y$|Y>ukJM=AdE9r8`IMA)!AqLk+-;TfZrr`(yo+ns*EOj!7RTz#znFaPHYu0+
                      z&RSWlt{WB4k^R2vo$o&Rd))HRw11l)V4ZB^=HjR>T_JULi>IRD%8LfxoA+p#>bPxA
                      z*(T9HKe5i=D#XZ2ODRE7U67};etFU4>qpOp+>SZCR_}G~@vRa;JA1NrukS9+OYo7L
                      zvsuE8@AP-c@U`Kuel_eDU@ZT{d~QnDBa3N8GxB4VJwAFVgqD8G>bs&IKQU~_g$;D2%MXc
                      z68SJ`N=CHu*-crSeNWd0uG6gu-ShHb#h)9RA0NI;`(-?H-v{xOXO|s9o!x|+r}S8_
                      zePsApF)&qvue2z6TfF+@Wtlg!qs>;o`g%mLoW=D>+z0?Xy*hG`kIGd;g}gzVni{r7!ziszD))z#}S*A~>KY>Wt9
                      zHT_HFQ(^vp=D*atYi6ZdYQDPqJn^o2ro*9>h%Q?x){W0wkMw5KO-r&o&UH`)cV@pyYt;^TT|%v`6vF`hu^<@o`=`AKP`UN
                      zT=_IDr#VY9z4o5|VVL9;(=0k=#rCwW7^gj{+nU54yzkbk4wtG9Ze8#EygTq+{nHhm
                      zjoeCV{-0&GWtef#HmK1}*eCINU9#$hs>sEPn}VcLh)0B5-Tq5iRkLs9OF<}
                      zXXX93XPIJ%j{Vn*H{Vyu7F&HjdDd~BPVS$!l#`iy9_W+f8e54LhA^x2wdv+YQ`B!BYJfm`-_zsmfcqPIlb;_)Hn=yiT`
                      zvJ+SCe5K-k$>v&~%bB2KtS_(lF)K{tvTM3mq^N$X=N5+tSjxwuw1Yj^&cw3CMvtFInEU2M0Zs;cJmv?(%ruiw=jTlaTu<(e%P
                      za{5nL99<@J9BKL4G{Zmqj)CC819OgN{+PAx*mY%#PhyXF+qi=j3)end^Ex`t*<{Vz
                      zMU`yzVsE1&cdtFX^zoO?7k}CWFPP%GK6TT=897SPMH6b&Qxy@(
                      zPMlo$?C~vu2^?(gLAwontlQQd{kK3TYl#r+{EoydraQ-4;{*Eh4xUljX)sxIReETt
                      zT3Xgk@5o8*(ia65Z`z9O*K?zsUX{B`+>2iwZs?;_H>hA*Rxt8Du0fci&baWV-)Gpk+pn{1skH9fZfo0Z9L<%>~**{U`P|9HM`x#=vi
                      zPxZnC?v6+HzMiTNTyAJ;zuoQUzj;m5tZTM?XLHJ`-(0q6cr>xX*};~@vF4z-{>OtM
                      zF*dKXOPCvPta4>;EL4|TaQoj1g8;E43qR%+y#`0r;(ooF8eVfvYpzxOhX$*^U7vP7
                      zw{4$sJ*(mC+n;^*+@94+4rs|d!N((8856A1bztW*6d(ZcQ_llNv+XsW@_ZT
                      zWpRIA`G(gRZ%_VJ9&q(z+1+gy57r0duF5)j#A2}{$5~zJ(Er!@ewXERJ-Bh+^itri
                      zZ2@LiD^F!+O8mRhayqvsnR!AE_vh^OKU`c6mrmPIrW9gT=iR%$u;Wg)Owx*Vr|t%w
                      zxR(1@bvys|*RH+llSNnUd7|-GGV7VfpPET6Cd^M4PRyBdN9M+4&Eg$ZRvnKL0u_7X
                      z>ji2)e_lWB+Si__FUiR#7cSvD{#AU|*49HOh2FVw=zEu6D!fwlF8#*gLeAB%HoRT;
                      zH4$+9{D~{8V9Q$jsxmzmvKJ)C-p6K9mxFvt{3r)!YXz`%Kf@AjYwr&#nLJ
                      zjwO@xSIdX}XO_zrya#SNY*#O5Q)Ohbu$=B!!PX#cWMrvlVys|fW};_mWT;?dVW4MZ
                      zreI`ltYHdO=Q9i6^bKqI1*azj
                      z@T*RDsbVvbF)=XKGqp5UurSp#H852$F*DOMHaAwVG|@9Pn0|3KoBH&L5$qDv&sVV-
                      zP8V?I=MaG^G&M5TGcq^9P#9g!#y7o|jZ1m@0%v|UVUR-&Ou;TOFjcTHLNS%u(9Cdp
                      zp}2rBlbO-vM0NFg$=i94&A#1@Ke#-TsX`*?%2wT7FOp`vcGupxSvax%W5R(GMLI6x
                      z{TfGkyZ-%_i&F_QdOMdXI$=`#2bqb_j}@odt=CZc@H_0Er*qe36X(jkzj8i^s4^yP
                      zbaZ8DcXZ)!HaX(hl4auVx?)oL99M&N56$!<%a~i&0SCM!0U%fv+to*y+B9`25*Nz0XX>xKbG;!8Ub5yHm+OqOu`|Pt9
                      zw#S}aeY-#7^XXU1&-w(qaro^wv%P=Tg~i@;63gVJ|22$!9y2V~JmqifIBmf*qr(}z
                      zU+#A+O*ZcA)c&yZb&ctv*l)8~>dP9Br+7{~s6OZ1oi^3$GS60De0L|DN%MN@(!*bL
                      zoa#iG*RQ&6y2~}c+2D}mF3T;;A1!?m6LMRGuS9G0DaQWT-zVf(hqIe-W
                      zc6|3;nX9{_%Z~2LIkhiGn*C%e^OV0a4bzLlJ5K9V#=ej)^%b1Zs#{d|q(7ClM|5p{
                      z$3fMMZB;kry|~}(-uCjo*x9^8Jy97aUTv6H;2bP^XwrqStFM=7lzr>Y$o{?ZuC-9a
                      z7Ks?{@lF67YNBNkzu4;=7Rzk~@qSYF^&8U6$#o#jVe5jLxM(DbGcjUfY%K
                      zS$FywXSP%M_X(SYWR^@iaONOKm*z6V2vbwDT8sJ*a&M!)+~VtazPHGXb9!%s_GFC*
                      zN*83Sqzs
                      zI>X^lpWLEGcfC`0nl9g6r~B?nj`*JxMh@}ztnBOV>)zdRu)bIPf8Ry6zKmFF8(F;*
                      zTpMqG$^NeVzFvRh$=kc~W`BOY+$1*QIETn%5td62*D^l6dgxH4b%-^$o!Gl;+qCE8
                      zrzT%t%r$KpYxX?(1Nqm*%}ZQE_k38keTL`R{a$J(0_8RvZZeQQUo3mE@oZq#P4TZA
                      zFR7S5I-%IrweN*m&m`4?PgCO#e=S=tT$28A|H?J#7MaTr3O{n(UEj#&*QcO1*S{c^
                      zOPKR{b*$mCoFA_YT_k?|X%CW7$`wXe4PW;;?=twBkfP*h
                      zb5MHjY+lLTHrp1wO-{|6d+Of;v)=kzwOCsr>3ffawdMtY1w#S`G?^p2kXXigD+3aPEl=*#kdpBEmEJuCa
                      zvJ?O9)~9gp5dRvrzOL%!*;jjmKJUG9DZ%WNy2vwj`PB+vHdJMvmd)ySJ+62*H-Fpq
                      z+tLph*|J>zr|DYmcdSl$|Eap!W%_#Aviu9*t{tCvRIYD-wOO0Du=3~4`nwO^sNgPL
                      zecamN$u4y!#SI@1`S*R!&ENmIpyO%o1s&eYH|mRi99Az8(kc7*QFhlgb(Tn$ScMAJ
                      zlR~u*(j`SNm>*lb`?cx(un9udQv=SlU;ga5eX~?p;=<|vuFC6=z02*oyd|vk&Lwl+
                      zi!P;ETs<0Axsqb+y9;w-O-xQFN_{POx#T6E?O8=nF|&q96S$J=zo{SUZ!IZ2BVNa|>(0-0`*r?A$W%te^4hcT{XeSsqSt|K@qf!;f0j)p
                      znNR1y~Q&qkAXYDEriyI4XXdbTU47&gK=OL-I`$zrM*XZ*r
                      zFVs2h(|2~`Nw)t1!ICBRGMz$yQr4I(W8FJV^N`BnkbUAyRO&As`4?)pdXxK2i@%*;
                      zW#%b3$NO~5F~9ul;=9elbK2SqGXf`QKFs2Me9!wP-?T?H8G#yl``%=Hl%Brr!wuWT
                      z+;dxV)Ooq3PMKUP<4d@7g`+RVG)1Vdd*TJn{9doit^dQt`(tOX(jhT3srK|4%UPw;KWt@5skc^lSj^J?NmQw$
                      zc1cL{tNn5kt%U*yPZ}(mH~GckB6|(TgpPAbVpZRy)gHau+r=Ge`mXl{d
                      zj?B;29xS+exVy1LqwQ7>Jwwd9=-aoYDwkrbADP5+XFs$Du2DRJaz7pFg_!u+SfauPSII$eNT0mapZ#I
                      z{^f6X>~o7`KPFbW-gh12WVvhSB#r&qs-8{uyme)js&Dt|pT&xQf~K0bxLEql=H`-X
                      z-JGzn-hjoSH^kgk@CwUTu61V14SNk#6}PZUUN!m0{PF8wkCfggZx6})a{VpPJ$!`c
                      zQ^gU5?X5F^-WR@ceAdy8$JVh*d%QlGp817ClWEs_FH_atN&(k26SLl{rMd@BUy_hA
                      z5mS#}&>DHcceUWN-=$A4F|bcb)eO;GJx8ZUh07o|=6`)h%k3%r$Mw9*_z$_x&^zI9
                      z?Bp})GQEgzn;)OnI;_EV{KTb}BXSEv6DRwt+<6?V!)@sOAZJS3yv=&oQ&V{rPpdLE
                      zo47NbzqoSKyy`+8pXale?=t!K`jYOEc~&wG$$kqCtMX{QvfP;}%g2$S*_|`v*N*zv
                      zf9}7&`)a>WT3t3*>U3ot0m13TEo`#WXSA^KF&mm0Okdc-_DRD~!9XF1%g&AqKDK9O
                      z1RdNnGBiVs_)Ql)$0NdQXl6Q{@jREt^tb#19Q94}xzvkOx~jInZYc3?=c_#@*S1iP
                      z$8A}1;pWZkn~(Y{gGers{vtC<`Yor_K!bpFF(IB!m~q~=8Z
                      zuRM~Ig1qzH<~h{Kn@Y+@^!PUOFZ`U+W8F84V+Vtw=Mj$ZMa{N(LPh+)Z%@=J|vpO@0-0hI_~e+cW*y^y8d%E|9kPryUyG+((Mkt
                      zmXf;BV)8!&R>3zFif#TcygcvoRoWOmaQu)NvG4Y!wuSRA>#oiIvg@3BQAz3T6&Kgs
                      z3D=x$dSF@Fvn{(4duRN78Zfc`eY8mI^rvD|t-}I6n7Thc$}wc)a#*j!pWT
                      z`%T|DeS<`WU(2!An~XHdPIoPvCt-Y6Z8fja^2|`FFI|oP+G(2tf`9Gvm_4uUS$$&q
                      zs^v#lxl6jR?OW~Ly*{V0orge#JJuutw=IxlzCuFL`FV)|Vy`JNozj@OtS#INx
                      za}Bx{#{HP|)Az9HkA=<$=0)|Fr^cpVk6xBOE2#gf<&{In6tZSXi}>DV_WZSMQKg@@
                      z?Z$Pd{&Xza=X^!RHtSN?+RcYdTB^M#GfaAQu-?FjEpYAK^xmVPaUAQKcwV|*ys&YD
                      zc+sTpW1BZgZ|kr-VXgOV&Jk|K*FP4zzH+KOIrl{VrDxKopDI{bsIJ=V>Jr44X})Xe
                      z?VPKDYn@e88uS48BEk*mZZ#=d7k
                      zX*!}y6)19awJG|oG9_Q
                      zzodIj#75cXde_YsvlZseyBv0!qx#`#4+)wUK
                      z=Nl!Grwd&7xTGf%&+25kwHyzo6Q?kCO-bG^?FrIwDa!CU8}=Qy&aw%
                      zHue3#)#1Ql&-%q%gG+wf=q~!#pLg-I&F)R|JNWmu3G!OIb?e!0c)iI|vE$92`bYQX
                      z?nw&}d>gHMc7-^9&EFq~4o%^yG4Uw>Y_EU+{JjrTw$F**S5?h=Pb&IXk&VS)_Xf`6
                      z%1-+6PMfsKtr>KFaTfmAqUO&&;ZdW5aCbrZ1HBKETDy5{m?Pt-H!s~`yX(F{e__JA
                      zMtNm>jyVig72@uzvPBfv`>Pt-d+n-P*Hxc!W9o$s-f=~D_;!WO6<$^R%sKGB%XQTg
                      zKiy8h%)NObZ(hlv)w65w*$TEiShH&Ov;bXo`AyXxG80@=51&kT@z<=LtGL0>>vMlDDGYFSJE4^K-^-U
                      ze6rJ@4fVaUG`L7GkNP)dMtRc+U;+y0p*dKHB;G@U#vUX_w})>-idiZoZ@Rc
                      zFJJsW<#*nkQ{SgZykGUnEIKoHW?WEXz^1bsPRomixg7=cf9Bko0Vm@Up
                      z*-&!$)tYC2ZSOO*8$7Zwbjn#NzHq*U;U4|T2UOGkJv-kq>w9iVcgpISxs1;yOieXE
                      z`aU^c;^4Z+ALVOpD%Q$$xgOg(_3WeKZd1X+4eyg>s<>jfothZq6P`97`4JOq^xDk(
                      zq(E2Q`r`Jptex)#%#Y=X98sSt_o;XNgMhsF%|WN-t3G7dgy`0#{x$i<@3l~4J9r#q
                      z^2hh*wG7QnFl$~@Xw7SAVS-fiKD^8+!enSRIYC`x`u;vP!TPM|*)a_&cejL__%`q0
                      z==ywcf$FU=<<7piYuPN{?^{0!P|-a(d)tfln1-)5&P5h;B>CE})XuFq(pqo+C|$7X
                      zT$14AB{OP5Yx>XB3Y`(rE}DCxKgL`k?!^y5%@dZ|N;@Tz1?$`oo{x+_Q2nVg$S>y8
                      z@{{ZLJI
                      zx+OChDi1hzE_&%R(e6m(Ig1@kfA+4}WPRbrR#CaObNq|%JY6x;
                      z9a8%;pKFGETIu14kF9aj#bx!_tW%!;7Sy|zvtnXg`1k(yQ?tAF|9kbT?+S0Ogk{><
                      zc^fvZ^lO=>nb;rcoN*~-Pf3+gVw!!~v%DX7SGM1Mvvc|S*~?Cu(FZ-+
                      zAB&CAM%~-h?cFQ@@*L+MDZ((w9AGo!OYBYm!|WYM9lMe|y!<&0fiI
                      z>(;sV2vu&_8S4?({Xlau&+b@*Q(tuTx8Gd1R$`VqN6u%3pl6O3X0i*;a^Je3GNjpz
                      zKk2kh7MDr?tK8Y_ks0$Io=S7fPo4X)atyRiAX&8t?|7cGHbV)c1;*IwtoY`!II-3RCN#F$2polK6;xm;dwU2R$y
                      zz^KZCdfVA$9MG?@AiP$C0kEgw|(+q4-apj
                      zleYAjYiv!v&W@@awN)!8O*c1~wykn;rSyiqY?nSbOIOstOG;pg63z^{z_ew{;!Kk&
                      z8;{8D1APxCt-t7P@SAszp4`q;SsPo%ECUUL8|Ow?ErVwF^6QHS}bJmh1wH=(wAgG7C@qZW9R;D1A3mbVbaj
                      z_ooxJwuzctbDWdQTU(#fcJDGf_tZa&96AcTcd16^$bOiWctSS&yYKniHLKTdQd{1(
                      z=H~TjQ#-Go*#39x!s8*Y+vXl%S2pWzns+u~|HN5`{)LL&3f-cS;d)@2K-Z$JD>EX~
                      zH*H)vdyeD2+n;QnyFX05$XFC!z+LYYG{1}Y{PE;6Im><7?SG5naK^k&
                      zsAT(Umfk+WkX0+w*3VwL`F}w9hxnSy6K78r3{Uzt>2t|W?*K6t;~
                      z#`}QB%F7?8rG0z1L1vA^PT#c&ORjy{Gf#7qke^Xyms@e6UY>SbMgvpc{iA=IEazD}
                      z${f(GXM8u!d1gW0-MftoHtpO!dDXs}tDaI*?j?N@UbHM~y3OxHCJUZ=UM^}|d3DOa
                      z>D`=nZgf6d_}VSbU=dSxcTMl<3HAA2C!D8?i#YA8cbXNJe#N%#!s~qpO;69g`awFZ
                      z>xx>klfi$@#}-B}-6jYuU8)pn;S#&3Gi8=%kk6B~@{8%q2*d*0f%=d7T!H@
                      zOhH-EZCUK%r-sJgL?t(tn-r(z$>=XqIHbA1w`7)X)m#omejD$nkzW`#ubDX`wUqVf
                      zjqSTU-@g;$JO1wU^e2(^ysbG(rv*0bztUW$S)>mBps)}_v5NZmETNyuW_?D-FrF8DZJ@xQ$*BDTI*Cf#NG
                      z0p9=eyIAAyf7q6{$mFMd$mid6zy2QeSid3v&h2Q~-%77s_rz;xx-D_7m5#1Is8#B|
                      ze*ca+dJZRKxISw1h#TL~3OaGWV)Dtg9NQ1fT-PmVQhh6OQ!)IPL}Y$d=SjKz
                      z+O%u#(G81#&hLGqoL_A0@HBC0&qeKpM$C#Qdb$!~)^PmFdRbh1WKH*q^odI?o(rD{
                      zn;;O(ml_mZUK+bzqq=_opU>^~LX{5I{`F61UubpK*;H$;m09{VY9>dlwe9u@{&mZh
                      zx}MIz`Zd^(Uoq-vb>Ci>L{B~={OpYJI7
                      zT=lOnNMPIb%PGM4M(oOi5rMs>Z@g4ns`NES~w0X+Me{
                      zzVb}UxihW1oTYhTk>p0Mlo`dVb2jVtac%5#n8=}ZZA)n82j;WUtABPZZFG9D_lm+^
                      zf6-;vM80XRuc-JgTXOZ8TgLTwU9G0wOq^R?rd7CKsy}rz+vV}?S$#9I#J>5st`+&0
                      z@>WnUt-kYqODHmaA${beOp#cj$di)vF%UHW%8QO-Tyvk>P=-Ie)f=4auMhF
                      zS?5ghPoJg1k(gUtud!j_p=rT?n#8^N-?hg^XkXZSK%?S8>D=6+w2e}`|8nfQ)teq(
                      zlkzqyYH7NRtPcVMA3!$-e$ZLQWiZpE$~L4Px9)Oc^eYKd6%l`ZjY*;`_eB>lXa(B
                      zXx6lniEqE9o#~U5%ByhWG||8GNVGUb+4bV0bf!|r_SL-=wHd3Or(WH3#{JxKpS?^9
                      zBHs&M7PVB@wYY}11-`$k+4SMWYJIj1Hs($C$r~5Xx{$*0;gOBnfp=RCy+m&+vvE09
                      zS}AFM`raY|~wwaQd&*ZSW7j6&LMPyjZ=FXbgyX)6g%{P7wODbp1H)&u_$e2D;`pcVo
                      zrR}@5jwLqz(eXGOia+$g!^
                      zvyPKbm-mZ9+xrsrzh9fsb@j*1L>K<-dFiU_xn|Yd8_RsGeHHWgUYFj?!}GtN2@F`1
                      z`D|TfpWCe|OS=@OX&di6v_9K;f9=0J3?J_vRQTFt9v*LS#aZ8JZn4NV+qG;D65Ad2
                      z{7SWaT{`i)$47ytLk}?MQEUS8BjhVi&UI)Jv|Xk&W!SPAd{u1wSu18R)2#
                      zxyQgfGW@ltTK(2vW&BLDn)?~0_Sx%(PT#)hVd}S2TV$^mUOk&SaT-ggg;uG~*`rPF
                      zJi=dvU+GmRxTGjeV0o${D)0Q{n7+gjX~X+`3);^4JTkwhaB0h-zmNXxl%84q&bs@A
                      zo#Qe4`Fy_}Lm8)c?)je?bfU-kIRBsbr)9pp&QpGJ;9%UERcrrG<#_z~$^Gqh0rBA0
                      zG^5#cMp=RL+GggM?P&{Wd)mmt$Ot~ZWo|J2;b9*2>DOnm$xj!2&89zHbvBzTqxtlY
                      zulXey&8IV-;y0MSWj31&RA_qm95&wRZw~XwOt+fDCO7@@95(&w?Q__ir+>V|CO$oP
                      zE*sx;y@y=N(}m`;xq!u(49%xA=5Y%%8JdF{?c3MPWfS8vfeouga~YaLM%@g}LF?#(
                      zxD3rf4Sx`A2KGZN+^y3K?{OZRE+EOmVQ&u7AH=1gpzoZYSCX1nQmkNTj_GG}xSvhU
                      zOyTBO7)($6%py5mW+j{EbS58m{plqu*_;_Iz@950(=R5li!&KoP8a;ku0LIEE1L^k1nfskQ_vLc_5)klg1AjB
                      zp=k!>MNn7O^1!GoP+de;dyQ%1w-
                      z8}r%4r>CBTY2-P{<_Htr3KA7K!KN~O-bpse=}xC$`rn*nvz;z@g-v4m`BMD|+8E)cO!
                      zkQg{@63(z`O&2@MW-vVfr0w7tkhUUr@#%}t!W`;#md$B;AxP{CNNhqam&o)pXW6tM
                      z2`%6a7sqtnb8J@Ah5oUNPve`e(GdvK8=G%Wcq|}Y%0^&U1zhK4o(mgZh*4S9X9sq);BFl~aIVhJ1gWLty$Ui;pF`LwMo+mKJZG8+1$aa45=|8#nMW;VtWLKH)`~)VZ
                      z@)YL#^B^&Be)i$!hx$J1DJ+idp25_;e9C4A$*gCdK|G-_z4#e412Y;;zp#=G8cJWE
                      zv1w0V{hUpIy2EQW_UU2I*=(jaK4FuXZt((=5mlx?dd_AC5$ghpfde<;1)KJC@s}`d
                      z2Va14A}IeZdC3M&qe|0#Ua~nrV)+|L45m$x$H>xB&%{h2uQVqoc6!+>HXDf5y01WH
                      zfO4*|4nH*CY<~qxDIl@guh|Si>LAtG^fZu?4X@dfz_r`-t#2T*?9&t9z;bEeA&3WL
                      zr$2wg<_gKB7v6%R8B`=!y@f@ofCaxOC|4;>XM4xy0E&8v>95|g8GvkKpFZ^+n>CZM
                      z0VH;}I6@pIJAMBTPS)uP@7e6&a?BrKPFVk*&35|2N;dK76FW$JBZk0kQg{H
                      zc70$IWHvW8o}PG=O_b4i`ofP~hSLL1v$0N>`p9NCJ#bz`ul$~XI-4`|oh)@!!u5S3m#y*|*
                      zD=4zgu!%Dn8&02igUxsv6FbZFSzp=gKv6C}z4{v{DSl&fft1CJv5+uMf^esPXETIY
                      z=lGq?7953)#?uA%>K~x;`UjiK^h@X2#HU|K110(&Y)KIA(VsA5
                      z3V*WMLSoLnlwV}}fj3+#)BpX1#IVHl2ftvx>;A=N!)OeN%$cS9;BrQFy5w(!=+ED5
                      zhSLie+1aNr{SAx8_CK&pt^bG35fY6zz+xx)MVQPir*HbhrZGM3FPlC@r@&t}TX0lO
                      zuWaK7*Jg6lr~hShfr!=rV>5uL)A|Q0Qm?UzPZwDQaf{OQt^e2@re6YyP5%#biOYXB
                      zo9RtK>=M&6R>90W^`FfJEH-r$JH)uDvFzYFRDAj_kZA?i*c7HdV+U8E;?qwvvV**rA^O%gk;&ebNhlaYp0mie3UDph8S_dN&JHbb1ymyWw;JR(9v{&Fd`@4O~kLaKqNf0MfuUGJrI2jSL_STq6Ths63=!
                      zVq^eQ4>BW&%gE3WB5w%QX9#KM8W}?M8Ja`oq56yr6b$MWg1C%~pc;*!78yY`8bK{G
                      zf@(B^T4W4$pfS`UW2io3s71z5ea29WjG_8Wp!R?}UqM_(CMF8?p!E($CQywgP>W2U
                      z8cm@VnL;(1LM<|dI?xnqkttLkxVsR1`2VOh@;zRYBLG3Yv>NB&bhXjck)P>Nl
                      zpb@lt2U>Rub|AD%Xaw!z8G-wCL0m=_P>Z15FC%F8%Lv-DGO~bLWC3*`v^!!1?ZX&Z
                      z)?J2jF9fVCN#K_yZ6Rs5QiZx&M`JK
                      znZC}MU2MAIX?|!|@24|6xX&g&{f-N};q-bJb~jMHEvICw!Mz}f=?#JG
                      z29S8r4rI51^murK*bS#|2xNDKaA$(J;NX9Ig^gpnPY}BqB+%7^*$t;p_|L^L{ZbG+
                      zv{AJgBnIxK#Rs!P>t3f2c7y2$Zm_XVe;LdUX*x|m2NnbM<|;$jZ6P5a9m;Mv?HwD(
                      zbhc1-XruXgC_A*1HaV0X+UqF|1Brn`Stg9#3DWCf3@JWV&dLaoHjq&P5$sM7G1Ewp7|5uH5$v|$-pusFU@?#n
                      zvLo3cJ)G(OQS64(9b(zpr~i&*x1Ij6oLyr2y(o5r=?zh!%mCtMM6(+}l!!*NTZ5WK
                      z;?uuILjsp=`n+g%a3fcIdSeXCDBT!#8%SS8V!A*q$gLntx5uzUdoU8y=YT{VV%c4$
                      zUjp?~G~>Ww#y0&@EV~0lXloqIw8S`e+vyL}*d?aB#KX*b9mnnn5xW2q1ACx49ufr-
                      z)8i7@4W=cqgR_Ff^p^=R_fJh=2lqzArCnm8Q
                      zOrP+Di(|TV5-4$iLSHtS-2jqjj)TO&g9EFQLBS1*g1}^0UNB36<%NgI>~^3QkHqw&
                      zDG(p9OwUeXcY=s5{KI87{dWo|8-RlQek!{GB$u|PvO7UyBs&d~zS*aXrLlusrsC6o
                      zq`}hd;xtIs5TD+X4zp4}o!ti7mynn)oB=a(XF9tBTzEc67+gkpW`H~g>SE|*!aQ<0
                      zgWU;|Lw10~!0M7S+3i5VE;-#Ji(Ma-8(5~l&183ih+P4Rfz{P!L6W}2^u%nKhXW$m
                      zS*CMm!zA88d%PQrClBd^%e$#7FGYH|4-0Woj;>#*klw+g0#H%(k&R_~X8|a~f;td+g)rl!3Ssf`2PC!tq;7E`yAve4bQHnV
                      znG~@@dkhlO#fwqG=3o)KEu=FcF?}&e3LH9q#UO8kqQ;;E5;d&TZxpjbyA69lVqkR{
                      zC9quLUCM4S{cQ=m8z@#Jre6nf!Lia<%5Deg3#61mjAEG%jurkgn8XK=1X%HGkXTa?
                      zyZH2)a(2V%iskI!{(<;(jtYoh*rsnT2c;TNmY7}v&Ty>L?J7Vn0|_ZtLV}QO`q>J0
                      zJ4nA^LnSzV*``NUg4*byo`X#l%(Ul~u+TqU1qm0{=|xqLu7bq$@M@TGjMX6HUhs=g
                      ze^L!Lj$?X1T&SQ1W}I{lNEv98(*GKmam#Ah9YI|KiRoRnu=HYD%WeZ{@=HvYsAC6r
                      zuT-WVs%5u@iDrRBLH%4N3$y7?b?lnczt+LJ5ew?rZ6M`ULp`Xo@sLYpx=uZ)j0Y8K
                      zm%w7s4#?_ycFpN=4KSSzZ0zjQ1sd2*A+hwbft`2y-M4J2(*;<$S*A~JfMhg@>5b-G
                      zB1|S0(*=9EHMXlavUAw*f*NI@QU7QzV>7euE_>PCnV}6o6LUyA%mms5Hi0&QO`uI+
                      zc=O5F%oH@!aN5xrI`@Ozcrr1EwAzpwPbT2DGssdyQ)5#@*j$5&h0*kb2ia{v!%_Ov
                      zbq=w+fd+QOr;8tE=bQfbHk-=y-G|s+!D1jk1eP)hGn-hLPd8NJ*VrC@m_3zK4dh^u
                      zxzSuE(Dt|qcv>R}(bhAuFa$f+-UQlGM{z8))sEs=SO^&zTUa98IytdPn90Nv5|ogH`o;*UOsk%-39Eu>1%JY^G%QY
                      z#iu+y=q6MQWEaHCmgeB4-`n5bWIxD`>}6Hj
                      zdD+m?4B=%+
                      z0{5t?1$?2OsevUZ9ZF6A_KjVE(QtYp8<+lcx9^Y^fH;$>;q*W!euL>(zq7l78)?j@
                      zhQ<&Lem~e%ATuKif54jIJwG9-S9!YrPng(AkQjK9Y{gG@<>`^X*bS!t{s}S;G(!IL
                      z7iciTnV)0&gkPWv4kT9ao1JfZENEC;A(D%Ay3B7->x7R*oY~X}I-}V0n_UewA8PEP1p7O63nJX#*k=y_J>`2`a_UU9RISrPFMQL
                      zCO%#BA3NXlT4#RM=@zC_mqH*MICP)4%^?H<&*2AJnmorqe)kf@=Rk
                      zp#yU0%m3_r(>V|E@JyfkpWSzA1&6^@DGs;kL9JZk(^(lg45zMu@%kA#_@>`o$)*CD
                      zU}K$b!^mL+R>o{<3`sY}kaTm7k;8=xIo&`zwx-a*4pV4{*3{5+x;+nvSOByi3);&H
                      z>cN{ri!)Q`*oG;zA8QI7+c1UpV@;uB8>Y~HtSPh~8$12tH+GT9w-4`zBuPV1k`&Rz
                      z=n|TO`@7&2X=Vs7)J%=1gLAE^F|?riz{}Cf2~Cm;(BTr~Bnj>%gH16pGMv6nfBumq#&
                      z^nhFZBFv^HkV)2AQXHu)x=7g(+8Z~84$+uGd*kqIX=;qfmL{Mu5Y~cr)RCPJ9?tPVmgK
                      z`1A*tIr*l)WnovD-gcQ2vaW*3)NHz-2BR>DW<1BPv0eTO=W!+#P+1BxG@8p4I<#gA
                      zt^5%QX7b1P$3S_8b9&Q3b|EoSGf=b!A@6ZAHM5+~c!N`f(QtC%3XrE5&vR*R54pi9
                      z%f@Iv{oxsQNW?(L=8$~_9;O31z|a)Yf-p6ouK0ruJe4H^YF|yc`Rsh(YU`i1+P
                      z36Md66*u`sr*DX5SDD`MfD<}kllYL+aJs@HPWI`%4>@fi(*VCg>cI1vvmSEVLBy&a
                      zLDV@A_E7TK_%agwFike+tt2kV|#C&oeG)
                      z_s#GbCuIErGpMfTdd8_aecv;X)^BWV(=(oN+DsRG!zMA^>p9H9U!QT>Ld52P#2~g>
                      z8cr{L&Z#+F>jg~f<>#ExL5yuLK(>PB4&z>MLi-CGFOhA1_<~b&`m~oYt@bZD?I5$e
                      zO0OWc%1%G_lG7C;Rss@(+G;V~_Z6r5wAY}p1-WcK*|Ax~MB4+#+rtaPwQ2d=?6Q92SEzBjUZ#ls;zv9yc
                      z-*JjgH~7gZ!en4N{ncAe&FO)k*bJs0c+JT+-SZu%?ew6}po;N5Oy~J`oX!xjYLFOA
                      zXUKa_&FP#UV7}k<9+b8sxg@4f`@ktO9qcyS51^O^iM;@cfpjt&OyBs6Q*(OBM@|FC
                      z5TV>hkVepYCdN;kqSFKZaVkz<`4OZMBo+)318HP3u$Zp%iBl7@^5es2PPXaYpEzx%
                      zfBMEIK0W6%#IdT=B|dZ7g2h1HkKgPfP>)(npZ=LsbGpwLPUw1*uOM~cCc}*{oX`o!
                      z3qkBG(_6oAT0`0rT3_MeWHFujE2rl49baME6TfoWK^hP)-(cF`e&uw4h)n~DfgNpZ
                      zIz9gzr{;9!?=YQbzi~p>fUN%xaWr^U2FvvD@0`%Z0gOLj78{#RzxAC{gV7k$BmS|AD_D%l%owz)LKx(2QAV@r2R?9WO#k&07S>CCa@tLQ^qWn5
                      zdiyU}>em0o=?D?K2@*5-$tlWc3DKDL8>Ug;?rIKKpYIx
                      zDEEg`bNZz}Fz@F7;NqO#`iIj5Ql7;9P86agiUr0E|)T$%rz(6}`jE@;7%&&CBE
                      zjF)2LvYTF1%Pu~B2}s=mCT^wa%hqKs&B(&0Jiz;MipZFVN7RzThJp>vUdjE=QPX;4OY(W;1h0du|CgSAkkRQnd{2wVOhF
                      z?WWLvxGA{v9mHj70hv89g?5xpp&eyYXcySj0#aL>LMN_FEkSL?ATCqr;yY7lU(yuX
                      z+cdQ_hs-IOLMN`wp#3{D=){#7v=e6r?zshVnL+zwX3&W%GXuy#ff=-YZw77On?Wb8
                      z%%GE*X3%*nGed|2&7kdlGb2ODoT3@D!EXj_@S8y!{ASPwzZtZ_Zw77fn?W1=X3)t@
                      zGjKybh|3JxIyVD1$w7Rm1EDQtGiXcM4BApQGckqCDVjkiuFRm5nP$+5D>HDDG>FR#
                      zI&ozNoy;_YPF$HmCo|2U6IW*7Hee8!8MIYr2Azj8gKk+fgHC3eL0evCX7W%MnnPyR
                      z%)qUrATBfL`qtR#iT620rg!=AAJQ^42c?xDly$6T&=DV`hL)MR>2!Ti!2w=JYX(|J
                      zYdpQjlcuHIo^fq(I>v&1D81M>2!vY%@^KRtVxUgJx`a1K$ifu4HEh
                      zEenvxmCT?MsYpR!4lWTumRK6VR~VZcOrOZeAD>ujT+^#ExQ=N;
                      zN+=W)K;3ST35J#?@MK|bFnysD*a$OFglcYIk;zrZKK;>G_H)|i(CKj$LqI7XVhAE_
                      znHzw*IU+5hntE}DR_@?J&gT`4vv&=TWo``0TukOBkfC9|PA)Z`dRVfJ<}!y?Yv#~l
                      zD|2XdW)5A3VGga%%%RIL%%QcJIdmC@IkYx2hc3e~ht_81&}A6r(Avx#I(%ggs?F3C
                      zg1F3~>oClr)tNbT9R@r*n;U|9+-J1Rp%pH2ZZ?N5w#F#?u|oaBFPW+s`Eek8AKa6KV*9+bdvGOcDF&&CQ^3ZDzJT@EF%Z
                      z_UYEgAO-$WE$C1Zic4VLG_{1S@-jAA?FkPBQ9t+`94Sttgh=Z7j#@J_X#MCJ>h~bMEVKhf|V?J
                      z!UY}DYJUn*!a3deDXd>2^o+}JI#}I4kQjKZYXL}XLm)fbbkAp?T*tAO@o
                      z+yIS4fp=l;0*M{C!NxH?^*PKLt}kHfK0W7xj$&N~iGj_ldBFu;^AYzFrjGk1mo;Q~
                      z>J3P2Lm)fH^yx3TphH#_uVCs_UU5MeKe4^$G6XFlV4J@F6|5Ye2oehbxzFx3mkqdd
                      zo-Y4}3%YFS*lTEWX!>f9Sil=D7sv>ceb`&HAHmdL~7j)Dq_#MPb
                      zmg&FVaydapo$iCg!0Ni+fr1k>>XiE)6vXej+#uEV4-gluWa)b@8^};n+XslNSf}fK
                      z;BthB34vBzgEvL&`@jWV_qqTi23}2d;WZn}bnlPQcEog@PoN+Hbyu&0#5QtsOHAMW
                      zi3_~Oh-G@>CoZSyU@^DPATiKNo==~+puS6!J1zN7eHhsfaF6ijbq;D`~_TONUAom^OU6$#`
                      zzd@_b>8n6u2g2DoriXtA1q*1x$l?b~-Tm)ePT(P(=|@0f;Gv)VA6(Gko1mW{J3tF&
                      ze*WNcf(+l>1Brpvb^Zh;c2G>@{Ne(y&f=Ud@e39^KR{yOB|l5RVn4VfrnmnFg%Zd-
                      z-QQeJpoWyhbm2c-(1lC;e#4{V56oWoKV0AiIO5ZF{&IoWKyggJ`3Dqo;F$Q!1zm-c
                      z_!k}%|6t~Q`pabl8Bw|X4;*|P)9e1h243R-LnC$?D;LLfq5oW_(BYHmZ$UB>{&TrP
                      z1*TSVgDqyCs>%(`6zq)LhTsK9Q#Wx#2U8}4guvdlXXJ(sy~#6iL-WK5Ms7$eX8LN7
                      zSO62Z3uHLNl9}6ZI(RwVBPMR>5Xljc7iBCOodWr5#7VqkTPSV8JQG11D#4PHIQHeHtuqz)t|$j%L2GPRqH
                      z8`6%RK98Ln+&NO5?#9jyT@d~OBnD}fgNOdqr`K?ReBsQ`HeH>A8@h~yi<29aWLc+g
                      z;^20KtSp(v$qinJ$v)kQ6Xr1$E|6AGk$Z-d8#?y00VEc{#LYfEh6@^&j26=kOV|w{
                      zLG_%A8#)qof*WRH2{*`Vpu`x#F901<`_B#X8c6IR4@4c?^j;orThQV=iRlHr+|YF-
                      zQoP*YZAcQ+4}ruMv~Yp&l
                      zj24hH~2|k{-J-tkN4vCPdEMQIepr{;_uNf`JYeL{;YqU
                      zapmVxYm;A(_UR~ynpxoc>8;I?#lf;
                      za{Nlk@+hxN>Hp`})tOG#+FkXv%JfWm>Xeyb(Y&|k9^X4D!qdjVhO4vn$lN20N%<;f
                      zLc#|XnjBe}IkqveL^C$6WjGktkg(ceL#VSEYZqMPAsh)T!JD>D_jCP
                      z7YI2jH@UIsvSzQ8wr2{<)n6cbq3pu3r*AVBm|pnxbZz(rt&GNKhV2Y_jCURtnQKnp
                      z?YZ-g@2RJGLHgyBt9H)5a{BI)*mr7gi_9~p?>>8f?;g75tK0f<)`A^4Z2bag~-M6o{y5{l2kMABIzkI*$=WM^7^M3q1%irF5wD+**
                      z>93RYw*C8X{Gzn`wAu>Iz!ck@*EfW&e10+MO4lpLSCu`US&pUdr43g7rk=h!pDTo~
                      zOpSPEsJ^l@Rjz!}tcYhD)u*4~WtU)+jVw#KIdQt6AiHS&#xsjUgM?4pB(avNPOH4)
                      zm6bHpecgh*BS!skp1nG(kzAYRxNlVcu<)LZ#U0n*m)LLG^vt#2_lB$A?eB52}LC2!YhZ92S>QkzUt
                      zZca>fpC%j0mtr~Lsl&8B9oa~$O(iLkCyXYf3V3TC3F6u~#YtzWkoU?XL0TK9c1-A9UV9`+d*c;1ovni2xhH}qELAu?$IP2kK26-;YkIJK@u@d<$Eq$o
                      zTVl!o*?-mjeU*EDW?D7|KR3BD-|t1u|6dP(uKMu!!^7Pi^Cy3@)Q#VJt~=a9-h97q
                      z#OvZY>)Y3+o%_6-slG$@$meRNj;Ti;f3na&##4dF^vgvJ)B7jGsKgdBsiWO
                      zoiY75*3|E=8TX5|RDXq7NO=hR%Fi}dD|oN^WvyQk7NUIGVOpaOb0piwGnbz)QJYrz
                      zO9qq}UKWGmy4Ei%Y3B0tp!lr^hxkfJh&w|={0$_K*ujD1?G6ob9#DvPq|UQbHw78G
                      zVBHZT|M`<=MLc_19AFMJFOqB1nQn*UK3k+_rp(u2U2`n*b_CZ6<8<|_+kgL_{rbE4
                      z|66+=mY!KJHT$cLKxDs7eN9~L<2`kA?@!H|%5i;{-1b?X=ihrRn0J4whwh4ZEBJ!W
                      zzxM*Al@+)DtaHgqy2-UMXKKVYFP&)BX={Z}U+YNCKC;Oalwu|fXa@)TAGW|jV}(m%HD*v-6uy;EY8BKxDyKc9Q$Ge`fG
                      zu2+n&_Uvf5()6nDmBLq>L&~Nb&v^4V-0et>OL548`Q35a^plG0Je=U10?yv~-0Y$<
                      z8_&Gv_3+jCT*Vv^o;35i^n_Uv&%UyO62x9cjKUyb;~dphovCs846nRET7ra6@43ft
                      zr5CKlZCaBKYvi-9Y^CS^g*Kg8Ui>Zovs&$I>CXj|dvDg?v#bjG`}EnvXCL4FvzdGU
                      z>+uc_`F(QJ|A=w_XH4AwN1S`UimH8Z;(E}CadAmeYGN*k1?qX3gI6trSkYYO=H}Z^
                      z*l??ZI)5MRxb+=D!^A;c7SPVI1+*J&0qq!DfP2G1To%wSt_8SXi?pWD+lWbQRg})L1-P#Za*v^*8Dh-9Vmj!QIYx`=|Icx0ZC~WTZO#TV`<%7~bdVpZ
                      zZ)^eX=YoweHHR-Ov@nMZwOg2jhT1i@^LubFXPsVjkMo?C1$15j*$i-(7i@-!F?{60
                      zVmc!$qX-kos8%-h?XUf~`&nS?WH_}gpwkH`#(;tlY>Xjd$&Q6Nc%&WF;P}d`xqU+j
                      zw+D1J-dQaR===kUA+T|FLsLt5XWIg@YSjX|YE>_WJB(%e$I0C1wV*Rv$R>bi62Q(d
                      zu!N5fTUbEGEi5d+V^r$fcO`OHurL~emJXfOvVcy6p%?=nq%uS-*s+*i=*=aXl{{d=h!v3+vRZ=uuPwDk@K96
                      z1$43vML&Fa%Fqx#UtnQrI9)KDQDpj|k9=C&pA~c8XJ@no4cmbh%5Z91Kqu*t%>mEX
                      zfr7-yzyJ}bmXHw)3ro}K;PtbAYq&kx8I8d~qHO^k&qpx^GzbSW#?S&Of-OM{yF?f*
                      zr=920-d^9z-2zLk&^ZGX6F@_7U=z$t;luxy2B6dm8g@UpmtSMMWiR&*Hb%?o2S0P4
                      z(*{o$pkx|L@LVF;40FWLy`_QibjK&$@Rg?OQ@Q!sr@xxQ%{6^@3)}AL1?)UrSeB4l
                      zf+r#&h9MSrSwfbOS{i^?*=lajo6G%KvAEi-N~|L6HMmSv_e9
                      zcLOVEIk2`RbW#&p2Y7xHY^^aOm0KE4pLmB`gvro&yW(o@ovhQjS95bsKlPdWs1|g<
                      z7{v&9`ZO_srwvO($iSMVq1og_b+zsMo4Cta8BM@0*Md%-q8I{CpvH(XRFD@m7=;-v
                      zCvOze+`eZAw+!p_1E0CiYeQ#SQ4D~mP$MLd7#V^igUJXo$i}yy`xYys5jc%PVgkD7
                      z6xk&37&kabOe~CGCAQ_{g9;+dmPV$afo1jW^2fM^L1S#7q@e|!+C?z~o7Xw{*^748U7mOJ>F
                      z`@9xpmKE6m@ZdYxBNk@xOmArnPM;!>MTh6^a96T{3sZ1#XhCP4QA~jsre=t7Q%mSd
                      zQcGiS%GB6i_k{Z+s5k{VMH3X4s96O(%nx>oxfwj)TS6u$ETNMVOW$xyvqKUp<^aDX
                      zc%B<KL?KjqtSK+PM(q-;-Gm;kZVoM4b0&IXJi6C8Ud{F%0V7YM&s%K4)QooH!5M*
                      zpPqM!#|1L^6ndD)aQZJe_ugS1=!#76R9Vkq9&4~VW=m5G(D7N0(?6B5>rW3n!s7-S
                      zE)bt?bCd@>ufQ?=`4JxQaDn*rV@G-TrpvyDEwwH_%3}jo%w%Z>iA*z4WU5cMV`b#p
                      z&VP(&Gn+Li4nSUr=CXvYQm}-!jx3?ABTH!O$P(H*vV^Wuh@F0)gGXZe`!nqO>@A@a
                      z6UfsIme5uda^!#;R3PgN&5`04I#FP0W(L{t5O9uX6)cq~fSXUKsRXsbAsfrXU=Abenh|3b%jDk<~
                      zSc2Ehp3$;22PsBvhFW5-)&N-$|DRWM`l<);lx=P~eeQo=4Mq#dI=ip`d0oKsQ&aEo
                      zfmiG+Pi^Fbh%j4PfQvTa>4mGOuEfz}CuVj-H#65JdM;RB~MsrYHm~A)U;S+fx0c%H^S{PX(
                      zni>`skev^uANUlfU#w!&pMLZMAM`+`)gSqwS>*g*cDCt}ANe2?=uDQDkStMLAf4Rik+l+$=*)Vc>NaAWs^an<6}EX$s2c
                      z>eCH=@hMFYI>aVCUEv6u%=E@zAg6-{4YPmqfpa|DbdleDkg-(I5)uo3k?9S;`Qjk6
                      z4yJ$j_#qn!1pn}%W(tLWOIlr(X
                      zbZHn;kzi;5Z=D$%SQt&8@PthkbVQK|vw?x>bX9JC&FNd7LYI1jg(|rDwWj~%=I4R<
                      zQkR!sX!<#Be(mXtK5`jM_kY39I$e*4A3WkM0rqPZo5A$0JpAC}#w3^x459mIbb0xW
                      zrhf!22%o^q@4{#Z4xH(=eEg84KV6QG-wh^u5+n-V$D_;3FEKr63!B9BNPd39>A(2+
                      z-9g2)#PpXS?pq;#j_H&5`RyTMWdi(s({)etD^D+2&(A(xQGg#jUJr5v^t8Rdg8bss
                      zR|@b;O%E32H<pU*}%vIk~?&H`Gu#mi|{K<-y*`V
                      z4{{>g^cWF-=+X{*QGWjE_tN;;r%!mzFFXB-2tVZb8)icTqv;P0^Jq-Z66KefE+)pW
                      zKYgnxzdLx#Dp(S{tQwrTe8l)6>phqa4Zv+HVJ1TZNb~BE7=JToJ**WL4N5$qqy|n!
                      zkZfjX06oyc&;Z&nHZ*`Pr7$#rwsH*(po=OD4WP|dLj<3PS^E^V84(+~@?E3|(1a
                      zXaHSWpSXaHSa0ngorpmf;i$A1>I6uZ%!UqlC^HE3u6Zw?xn7{YV3
                      zp@A_hPeHdhMJVwf;+QU_#1HMTG&u6}h=Q8+T=y|YD`P!FJa^qcJ5j!&T6<+@uRYSho|qe
                      zB{M>@dW|{WaQr*-jLB}&|GZhes{il(`B%?==B6;$Yd`6#)}3izD?gu{c-E)kW50^L
                      zs{ico{j-1b8-CQRwDD2vD?Y!Rap}JKlh1HB$NUwaaD3LEe~$`ZxQ1_f^;G`J$LnYH
                      z`;A?lz4pFwzx?^KkIRS2Ccd`2zQ~_dbCC*|u=tmWa0+MPbV*jz1N*~Wmx&7nhd=PX
                      z{xh*CokKy`^T9T&ol^b8h*6DHX%<;1f)?GGJ{m$L2MqvETa{BqTy&}muEWHx#YXaJ>osx?VFP*-}s^>$e`5xwFmv40{+V>_~
                      zEK9q^b)NNjg^q>ZjV&uv&i}deCDJH7Z-R>}d$R1JwVR7-Yi3nNPC58>Vg2L37Y$W?
                      zjK0j?blZA|z}ba0QdVhi5?-#Iu<6d!(3|t$%NYH?7Pcm5$LShE-P9Dy2KlS0qhi+1ONm*Qcg7;Zxqx
                      zDRuiMq)bq|^|S5`YuIPe^M1}8NfT~ws!wU{7R}CXy}5`Zyw>(ZZ~{APm{5!M9~*b2
                      z$v!-f?$79&RL*xYMWUH+(W)bv>!!TvJ;}2!lCk{mQjdGy>_$AnkJ)77?X++-tFSta$Q@^A13eW+L(qd%{Zdsz1Tv`{U#H*4JclPFZCz`;v*tzTX@3T(56t
                      zo2=Puu=-1lPSjVe`=1wg{9^R1(OO%kG87uTWh1R|K_2A7nKdXj%
                      z?O4yKlkCCVN{;bN<&3X)G#}fLwqdQ4VC43>8n<%q{CpSp;JWywN@&Z3FB|_k?U=11x5Uqrqog;xvG-U<&#j^)PDj2^hV$en-Pp45Q@3dIvx`m%
                      zj}5By&u8(jRQuZ0bI5n5ra$KrvyAICT=#lk*V}O|to4}7gaDD&72iLZ8DSJp{
                      zdS$u^Kl#k}nInXGv&oW=I=q=)n$IuqmixSGp~cCl$A+IXORl;r7*!-nt@l{IeaAcD
                      zhg(b63GK1(+WS19q}=#mQ=|5Y)j`p>_0D{myqjswy}7bE*4^Ij9FI#BweF?d|Gsd)
                      z+y5;M^^cD-uzi!cRe#DpJ$Qj*z2)u-p(7uh9pA}F9a~%Iq?omO?=l1NEo+h!9PU|e
                      zxo8vCbS!nn8cVB#r)rKL|L}SfYml4Qr`Cx*v4?!vx3jTqN^`ta&6CeIw{K730#SyE
                      zudjGq^izBPOxvpb*hvZ2K;@W3x4&mEt*fbu>iS-&=l8Nmd&ZM@_m)lGvgu=*e*V<@
                      zjKpX9IZM4a%4+|M2}#OV$lPCB@q^>vpVMb81XHqe0*|Q#J=5)e-0|wu%NzYCOmS^vhtLiKy!+I~S
                      z$huPYXy={c-7PmycF*&|cqK+rnfxFEm)h
                      zx1P?aGQG@l_T{;mIe+f{-1V(!OHcQ&ScVvnrUgcxnJ$yl!sN#)Zi40KCm@r<}|nN%x^B!x+X|g`G!@bo@}}v
                      zQXRkEB1z*;hSc-OY0H*9nZYGr;wSC3zv2E?+3@rBzxDO=ugV*m2p7J19x1TXzgJ5n
                      z;I2&ZHGZ`(SxvtKzdb8GcVJnpPsC2*U|-;bNq
                      zskS=c&B^b5F-hvKN2}X66^q>}Xs>o&|FkYi`<=XVyUF&`Gj0~g?{DE%_+V={_ilfr
                      z-2TW_FFj%w9d59e@2%lD=FoiMWWPto%p*ZJi>961Q7x4vY{9d%a9Q6@#)o;TAC6vF
                      zan|&Gh3>pWXSP_al{2*L>VIvDtFGu?$m@~m^LL8W@w#?CCfBf(-7+%Ly@Eb_C6i=L
                      z16@@X$j3%oIvx-6Fz}UYTJ(5L`AxpH8T;moFHz~Sdv&o+={9%sixXi{-z0YR?u-rS
                      zjM=+awtacwnQ!MO1mASIpmx~5jA7}SfDB!eDd`amMxxU$bOaThUvxZku~Yqtdwp9^
                      z6z|(~%w309OY!Mao>iA$9kJllFYNPQ_1J8JyxS(T^>Yg{r?;qa@AmODyHe;dcZTo0
                      zSxNFg1w~lDth(o7kgCqa*}A1D#B$=Bd|Rm%%eCGW&2CdKo7d18Dn40k(=3@a$DbAL
                      z4qE50Q~mt#l@se`oH`%oo4V(U^81-O-1T48O4+xI?AK&fZG0PYlf`bS+3nAZlD_Q?
                      zyyJ7%b4Io0llm8I&5@t}-su)Ay5IZcx7)Sb+uq;1=Vj};NbY5g)RBd}Vg=h2)~@WI
                      zBDLqfl6sMZRP9H(6TRz9KYWrgQfGND`tJOqJJvG$_Z(RCAU?qR&bf)4E?X5i=B7tq
                      zR&slFJlUrB3daqT9M_vS>~v?<`I#h7?l+mSH(uh_m8qE)^FDc0mRNec;FMLowN1;H
                      zyK<-T`&XL+zg|r0{++pk^?lp6xkXFXv1^gd4B$v
                      z@#%6!58u!G@9liv^D@uV-8a{FytS=xI6ap1I_x9dA)_x11C3#
                      zD5!aF;@LH)gkiSAF18uzkMD|T+ihQ6ZsoA=wF)E8XSRLKB}{*=l-@O&D7WAKie--I
                      zmb{F!?>u8qFhnqkFVpyvINR}o(fQ!pIo=m!clpodxx4PFkL}&FH;PYf%Qs4Xuun1j
                      zlF5=CMk2+ndyMx7+i|@ZbGc
                      zA7VFg-V1{nJ%%rK&Ya9zIPGYn&D^Pfo*(uXfB2e}q1K%7h5Esg7kjSjIw{ZA>X>wb
                      zF)P=9uGhA!MYY+^nHPmw4~F`87@Smluva0wAin$2ob~Gj`?gzJKUigzy?aM-6#q(3
                      z=7o97H~L+gm@TpPc(u&NTxb5-y1yDPO|$I&Jg=d?R%XMbj~f>@Fc$pdW;K5)wN3qz
                      z_2Q$}O6knmg`t}^8=ESeo@2nHc&;u(jWd2x=e%38P*?I_|t@K-t*q3
                      z4T6&l3_i)q->v6c$ru=XZF_Omipa?PDz`}EOIMh}{{|#(S|S!b@!OO&d5^l5Pc8O;
                      z&!_ZZlECd)v-w$206BqM?tr^|@47&ULTyH*l
                      z)REn0zNB`;8DS?uF~@tpiz3c#{_;0NMf~Oy2l?^`b{r2l_8&ERT<^8$^!`aqlT-Fs
                      z2hKdI8h9=H)|-OqomV+Z>pWhioGD$@eoCTN>-O5ko?FA_in0{#QM+x-!niGRU8JdQ
                      zbkRYBcg?Cifi_&sI;E}!!O`2+vOi6m(@=6_Dw}wc^~CD+LQJ=U8PAJ-{4vktrU*yb
                      zo%`|owyZoIq<(TimH(j^t9EtP&sk*|GuJ#mm#@I*`=Ym=R+
                      zFKaY>+w-~?m-b2InYAdoK5ch}qXm3}3nEoyM
                      zv`?MYte01{S?()4G=F5PDt|H~;Jy=+TTTActjPWHPvvH<;*OoYYx?)Q%cGT(E*Sn=
                      z_x0}nEi)O}&s^xKKRnH4{lVN__Yb$tTU^_E{?trMC;7%lGi7e+_Mho0uRr*6^2;wW
                      z3cLzi>+^N$*{cQmuU93p-JM)DHC&{Oea1)q1yi&x2AW8`lUMe=pXX-ecKJw;Sd^8N
                      z?Eh7(^39dEI(@88X6E9qHre%{U;OFayz}QaIe%EQ`qSBq9D5C2{?EzyA+B(%@^7tz
                      z6q~rhslbQZ>%ii91`+q`dNcd
                      z$9VlEmqgmy^za(}Hkc!`dYk_~@iQIsUB!4Ob4PCZ{LAa!1KDdTzpOV*jB8k7mfT-i
                      zd2!~)iNUQI-F^0IGuv;nc4Qgry%Q1S)sPF{^7wC_vC{X*l#3^x3w+&lr2lcENyvwV
                      z>sacq9^xtYa=vx=+%B#A^>V!j{?C%U&%7v5qV8;uy^OS&_M(cEqw|@2Eo5hYWc&MV
                      z|NbbJ%Z6=wKf2b5e%koja^CC|&i|?DCA<^-`x!!Od&5I?*JpGEou4%6!FwLIpG?y}
                      zwK}dozNb&+e`~aFshPz@OYz1}bM6=TSevo`dOA1p_e#x~hW}XaE9&d$vu%{`UGyPrwU?0dRFx%Ki-UJ*bk2HJ
                      zR^A>ik{F%U_q!-zR)GIXH}f?!susTf!c$+Om69>-SF58??A?WyQX+eIsERlyF}Kt)
                      z1Uz{B(LkPOU0m{GjnY3FC4Wsmu$x~={FuD4?f()pi666lx$>SnYtCc)b@z+a`hwew
                      zzQ4`Wi+HP(!Vk^wQ-aW$`YMxQq-gBSb{_H>g=E^c>aHE9D0CdvKIb}lw%sELz1Nfw*k%6iC
                      z^!)eGCW)j0uGKe$de(4-fOmPuFtdSD&tw$F4uU!HJ(!%+f^9
                      z!op0!#N15J(9m4L*uWUXpDtL+q&~e7bf$HlGr!Sv0cV6#QzK(N(AmJ4N`E`^^G}y!
                      z=LT=yVHdS90vV-XWMrUcWT9YWX$ayXOa_g3P5@nxaIS)lL)gMp4|Hl5$Q@>u3YI2%
                      zCYIAL&Sq1ezMzs#lF?xLN6?aI0cUAGW7X+JXWMm3*
                      zf`t)^si5O7KsoUl=-eTez>V)+ZNB}Tz&i1G^0wsQkTY33+jw?J9-Pmqdm#GT%QcptZ`#+N
                      zv-{6ylKt%PuE#U~^AsO__3VxEMPAN?KgutkZ~nb`|J`}9`}!jvY`)!VS~#b=@qDd4
                      zN71xO#q&@5H{X{1T~k*raciB{tM2m;7e`#wu##ew8cCg&4RomR^e
                      zR@1jU!@qfVaQwrd^@W#z)?5x$%lFVJpQTc@ny2pmmpo0$?|ThCKAg@n&F|l-Zw4D)
                      zXMelAPj8+}dFj=|yuz!C_O6=c`+M>np|iW{icc9mIlrOgui4*ox65-if7PkVxftu5
                      zUwYu_&reB}4-@L;T=|~ezp0rx=M2aG{f=7glNoAfRWka2lF3`prxATnFX0^jo|d`d
                      zuiF<%c2##}o3q@InI*(?ML6W6mfUl&|bs#EX7s`v{Mnj_)H`A0Ml)P?sqfnFO
                      zVvSdfO+9yu$1*Njx_XlzPy4!wZW=dYZ(p0&%*elYj(fq@k8b~hPxc>pf1~p1?Ts6^
                      zwtdr;5I=V&iOp#DYB}8tTip-Ur(ND^&AoQ@S+|me8=Q{Dd)mC$MqF(qjFv>lRgz|;Ujh|VUxl6$2M2Zq<1ZPsa=^ph5NI|
                      z+O2kL1&#e28J25lw_iB<`Tkplb;oQHIvY(sZW5W~c)+4vN9piNp3|8O&(E5jSD90<
                      z;G@`by65q7zD$?1U3rUisvN&>SsD;{Zd*^D|IDu}7GEUFWSW-EnQyMqXn1L%UdkQ*
                      zqYj+qt~=LCUH5c*d4^BbBA#(e(0P?>QQxjc^&}YfwUzzf)wUv_UqU(DS)(*jJm>9`
                      zNuLEK@%-s@yCX5t%}3qL%1*M=FHYdAi~S$b`dAsUhEJtgjZ3F#%?dikTe)|J-SekM
                      zn@ryxSdy{(`!>OKD<-kVo%(CT|Cd8}`mTc$t`{3*#yV%b{V>6V?|eM7nsUUMeQReW
                      zCO+ghm)Bv?^!*}c6L$ET6YInw8x%Gw4Z!O-igaj`w
                      zcvl)+s`XYWTR6$2;(JQ^tmhq7AHOoZd;Ov8-SN$5PkFg`UH@4xeM8)5D(5DzRY#Q%
                      zCztQAc)n7cT{6P($n4LaznP|6t#MtsnC+0e(KR(A;a0yosY{+A{YMvT@H0o6%bd(f
                      z>^AAWa8X2ad&*416*FhIg!M+xyMLhf-s1h*S6*)~`y)MNU%{l)+~*&?NV~nPOe9+%
                      zG>t8b#iK!YT0olPS*@){7S}gtT;h+_ngGUh%<_=A6-rK)}MQPb6Wbg`cxzN
                      z8QBNDR_uH#D?TCqOr(>_)LRpj6CTWd7G#yu=J@Do9h-0BoQtzXo=p5yqGKayBF=WO
                      z@!ZWFNe16@cgL+={qHna((82#v_o|yTPGM^VaSfI&XBn#rBUqd%Hv;M=$bI|R=mLP
                      zS5sG;pG^~s$jaZi>d#O0;2B~q=
                      zekzL=l(P;rVKMQ_e&H$K#OC#PTjQaqU2R4#${7q=F@Kp7H8>Y|J;_?*6p;M(pVWna
                      zPd0czI{$|0yT?_Q>^=2euhh2vO;B88U)^ok@52?bJ(*>~f}27?lL}ocf~15mi(Ux#
                      z5>tG8`#f=-+IA7S&
                      z)OoXRd*++M`guv$gLcGHTvjDl`z7v;2tpDR;ZZ-utt!
                      zZMgIP`C2g-hIvhUbV@(|sP&U$j}uBrF8A7(aCFxV{(>B>q7%h}uHoSY1uLwgw->mE
                      zY?u;$ATZ}>-6PclSNe@~OzWn)pB1kEdh4>>uDGuiQeo3s+y7b|Y4Txyq8OmeX1#p&
                      z3&A5_k`5?O;V27wDy{AG)9{>)kZI2CW`jh-tE;o+wcb9o$QGZuU1J~l&!Ob6Q{appM9)=R9*0+-dsxLmV@XTHfzfV`5H%4BQJ=M7P_S^R5SFLOB
                      z^u1TUm~+!yJapEX6;HlTb3CwZY1Z}B*e|x#>hW*HtN!e}|L}!d*8giqO-{@B$luC3
                      z`(p90Pca{-ZVk8J6UFd2ocrkKtDg=XH2ql19)4VXeZ9&I=`%GwpKQ(_opE0G>mBpu
                      zDs!S=|CTPRJb9&^eddOb9uMYOin$lBzEGSJo>RZ0IpOPEZ<+9YVl^l_sQFH
                      zmexF-HRtCcuIk@!f6t!Yb;_kq#q^@o{<@bjhaOL;o8(ZS(<&gxZNZyl*dh?q%*yC{
                      zyg|WknS@Dfb1tN_L%UF=vjyWGVaLSnR~3o2iXy(;3hC;j5~=tCLzJKI;;ei2I!>Q4<8n72t#WOk?C
                      zXDJ1??^DiOW}cA!y+c{sTJbH{((c6y9z`92HeE70I?Uyc0;_APcfHeStx{-AtMjUf
                      z;x7nyWN^0-V_ELw$K7;9jAi)~xu5k+^5_4tKZxBtAKXcBHUJ+!30f@!S|tEpW(b)mozkhE($a>051g$;)mmmL8Mia<76wG5J4GqA%{XzB^
                      znHw5RKl=sR;m|Pv@A(fx>TsA?80(psm_p{>LB|}X=B0o%8XHdE_?=Tt(hyUNp@q4g
                      ziShJ63w{wMQ)Bo-ACBoMLHx>~rGW;r#^!pKW)=!2#)f(pCZ-BThQ@k^re+EzCI)&I
                      zCg5HIqXD>|FkLj5-%<>w&cwi2&%o3Ko4TdJ{0{XJrzbr&d-rbr1Kqn*^LRb?7JHYO
                      zM^B!$Qf2nNQ;9ZHlcKjQmGb=J5n}!KJ7c_3>gjn;%nQP0{;L1P
                      z2`eou;gs=NJ1>PMO+!@pU74!_v&^I_)aXU9bZd**$!JCZ3W=wqn1
                      z#Kl$Qa?szvFIN`wm-|l^aXx(OcmIo*%g@%&6XWhR?CV;eJ9occOpDFQ&o+mi|6F|a
                      zNE@5T;=tM{i=sX$ZSJnf#-Dp%8SVQZ(asmY>|FTcJ73qFY~(gtR)6NSke%yMrQAo4
                      z!VcA#uHJn{H0#eI*4_-yD^*{LG98s>9Z#LOc!|TS?7R)J?f3S)_2~Pjdnm)v>zSag
                      zfy^q`3kF@BokAYRjl8*qS8w0@#QA)b3j4MG-W(VESufVQ$gVkFC?%S(cgbhPwU)cu
                      z7kgivD>&!oW)m&rg63l-u6g?Px5DPk`uAYT&-rVtxBc+uX1i`Eazv#adm3Y@ozK43e0
                      zO8TC^vb^k_9kLrMHW>DmWTn)mdF1*|n!j>-RkmE_9CwzxZ_h4rI;Bwc^Tcm0u8#Wq
                      z{fft%>R0ApS;);f>8q&pDpPKL#*dLFtQ@TMvIASgj@mhB?aQy4tk(C$X^RkZhI+ao
                      z$D!kFeaBu_h%`UBTCRPmU`xR)C)Jb2%6pfZ*gp2Y{-dwCB2(+J>d}CNcQ<%;J`R~D
                      zuio^qA;5!ALQOC9pZ}b7axPAfr6+BEx@^8<{pM1(w%SQ@uWzi&tNM5LMdkAel|t2d
                      zdpl0;*Vpf#mg#b8jZWdr^%Xa}=f%e+_?(K~WOu6ZdX7awW$Hw$&K>D#wE|17rUc!N
                      zQA;nYO<8pMji-m$MTu9j)240T^n8;3nR)J$mcQ!B=9ew9ZCx;1w2(>fk?GOA-1>^+
                      z|1U&WntrG^+03=DVVwp~&8vu`%va{z)c+~{*v5-n;(LMI`W5xNZ**_n<8e9qQzLh?
                      zMK9y61E0kIZDJ_fX|z5y;-+cT97*Zr>D6Tuyx0HVU;llFux-d$K2z0o43#6
                      ze_>&Aq2$TyD6N-`jK9j~95D}m*_3}%SMIV#;mP>3JNjGQ*4L|tvlX*9UexlRBpUqR
                      zX6Kb3j-EZ7XT!go<>USH`3ldygK=jbXe>*7zJJEMB?o{0h<4k)R4Vzg*BhfMIqMY@
                      zuQdqfyM0+HzFaOhpOw?fMr4(dYKiM}abqc_8gDt?Ia}YZ&WpXSoy*lOcFcRuL{ZW0
                      zQk-XB@_No)mo%wk=MIMh^|=d5Tef}A(5>!PIc1>PZRFp(sQj$@R>?}4)VyT|8#2Aw
                      z%KV-^_j8i>bd-G&9Vp8q8@5;4GR?~%FmiQ$^0lR}lB8~*e0%B5;rkcgdA^G1FIu-I@
                      zd*=7FPnTFa3{#YPR;JxQJ~h_gQ}C&)%pKhaX$gLYp{x}p6JF*>ZOXoWV)KjTGu_{O
                      zSFo-xPF}IW|wM_L~;5SxV1#2;4m1
                      zaVi_%x*zAhur$BY`O+1>Xu^fh8ZX#Z$wxd`b#WV`RLQA^bb;80wnzKqrT4IwbTA!?
                      zmQ+yNJZDy!$iih}hcp(}v6bD_D7BGsyjFItNF#oi(evXuPVZOe#QkvgSa*eGyO5^F
                      zxzip8>%T4*V^7RFmMr7G^Hn8#XrG+T)0yvQSQQvI?*9;1CF1vfqNnK9X7zcqw(*v{
                      zIJ?c@_S+wUvy4-9_f*|jcdP5?q-S=sjf@`e<*;e&bT|7eqA?*!l`pbPj6MDGnS{%m
                      zdmW#2njO|HYv^EK;Thj;!2fU0UgZlj((bUH3Qk~{G$*uvUP9aT$UXCSrB7CxK7Z}x
                      zXEIT@-j`lx^Nw7T{WsM4sIvX~>AiFLEqf;N?^5Ysb2+%<+^fYB$K9s#pH&IX_``bd
                      z>&A$?S)VNS*8D!n5mWw&<+8*w%g-E4WeHmz*3138P%8&970>ZIz`l?R{Ke>c|-d8T@d^HjluW?algrU
                      zZ=2PA%urz?!@bUT9J5VWRDKIRSQp#&qgh~a&%C()m^X_X{>9A*OS{PY{^tU=&F!z{
                      zu8IdQ?_v|VdUVpE7tIAeA=|@Q1I(S9e+4Djcb`+vOPv=h+8A(E!S?e3x9EC9o&2-E
                      zB@?;X_i)DVNv}V^oFBmTaKEXxsX_DH_%&74=Dm~Ua<($R(wM(sZ()c(d*2PeTgKZK
                      zdD->}F){OV-j|o}_KCFT`?FLqtV{jVy3gO){yR-P!6?9h{on%YK-LKDBkI*nItP1xiT%F5{eD%-Yq>t1bL&3L
                      ze9IrQ>7T(yW^>oO7ql#1TT5&1KKC;$dwRfcqb2ih{bvf=yu<^vs|IODm#G{Z|@KSP3jiJ2^|Stv0G%0-UYo)?6F&JzwIm+XZK7r5X%*w
                      z>N0)N;~)3uKXesSJ$+8;chL3~7Rp6=f7*;g_WRegJUlP`^@P&>)0<>;SDh?B{XI}>
                      zfx*T#64ikM$udgzpPD2>SDfz(TzSo+d4cS~#pdEKOn+qu`5XK?|D^t(_8Coqw$k04
                      zc8W3GyJpuE=4=*D_@jKY{bJUqIFB6>jU?w&dca
                      z#}fQ!J})`><3!RMsT!WS^2c^uUQzFvD5jw1|5+xkGLqjcv5wEczNh?n1m~34<#YQs
                      zE#{fnbcJ_v&-E8VdpQ|8UpP%VKFQB|SIYei_rD)sCcBGlNnAav>)Dl@lXFj=+p#>~
                      zcjk)|ZbC0TR-8yWo7Em@ut{i1)}Fqvi8p&^zBy*CHK+A-?%sfT+nzT{PiNp~+AJ88
                      zS-&!3?<}PWJ0IWPVqcJw;fxWzt1th^gFgd*y-;&ydYHt%1uu-%+HE;qvSzDL-_Y2hEb
                      zHtbqDi#K+IYV;P9wQ`w(B|=_7>$j!2y3gr2+$dZxU$UjvqIn|MO<`u25*b-XC7E-1
                      zXT@IksidAPm*w<$(b1$AS=+Ge;m4($!}8OLdAD^P3Jf%G6yJ2GT!u|R{{^S%U!Dy%
                      zQyGunQ~!9NdR@ZnYRw}XrX|(;&NuyK;(k23zsJfpXXDz=bB^m%&t7BOI7{K~1p{drQc0xns%n?n86!Ai9@Wrv=7HR%=zdy;cOe%_q7kACtFOr
                      zn74mn)~@0eO?qCOr(~|34-fxwbK&$UC)O6Edt8^D&AN{9IOC^<_0PU2oA^Y_tH-hI
                      zs8V`5P3A)83^Sp&29cr_*UX)_Zuls3Pu{e_Jumylt|I%tvzrteLZ(z(@W?K^C)KWZ
                      zbFspryWZL%Jx?aevoOEUUdOt0C;Rh$+p8ICH*J_vrq7de=0-|`>Y9yhD=JtGN~gX3
                      zxlOt3%#O?zvt}iq4_G37>uo`O$(x+4Z#{1^ikqUXx6kH1azpg*g4d5cG!A75blKOR
                      zQ>+NyvTK)<{a)7#IW{qUOJ>L)kDIiLk8OF{!?(sO%~W0DcXLcVrL?i3##PJ7w02sC
                      zbBose*`^JT>IEcZ85s;#i$4`hSiM?EL_~vM?8VvMi*U5)P(sk_{2Ahl3QbUYP`KMpLwtMqDmV$4|rT0`5|1_!h*4&(^aA=-<
                      zip25CXCgHRI_66Cpd_fE#=yu2y3>Swt&J((l3
                      zK9-|=(v{%#8}3K<2ToWLH_2IjR@+1M#vu8
                      zoO`8kakJaGWP>lv`W%eSjv`V!dGB*^yqNm#n#!*0t{=5`xh;!Yv_1b|#KuLR=4?%r
                      za0>2_jel5wM)7Q<_oEZtlMK#(GL!C+TKa)?_PMA@$KqrT*17ECy>n(xMc})q1!6{t
                      zd`ZrBj`n%nZHZIn)Mv|FDtpnUba#V5%5$C9^ime-0iZ%mlo@AJL!8cng>phdwpTM0K=qn;TlCpU*@zfHeiph;hBC#
                      z+0rUD>%}~I>)UZBCTpD7%X3M#tIhTK@ALEDr+xM>pZ{$8g!Ioh>+k<9`=0pi;phC%
                      zH+O%R&zE12w{YT)mHAP&mi6V6oUey6>@Ziox%f9*)`vd~AKJNnZ{L}{YG2@qowI&=
                      zh~1ado9NYlzcGZtCA2d3U2@&h>Lj
                      zZiyY;vp`5MOJLe>(dQ1Ep52zYwX4g6Rf=Qlg5nv+79`5L6}e1bZ!qbB0Q)xird{_{
                      zKgOtUY`XR0{hf!>&fU`-FMeT^C~H4*B}~1PZ$eNI<8ra;rl@mE-`RXoXAVApE-ghy
                      zU5@XtjsK%J^HWmhq%d3NTJ8K$om$rSHm8lf{#TU5m#=%3tdDPbde9+y^}_XUMQ>Uz
                      z(mi<5A-X$C{N4If=L~cI2{7iV{0}Va%j9meC{+G=>y6AsVcw4)gUsfgc34q8@BQ)s
                      z?$1lKueggwi8^0?^@6Ycz~MVQa(XPPt)ZIRp7pVW?rB-I^7_WKH_73XR&Eno7jfaD
                      zEFCJE|k`K@%L8Pr4!aH-whuB
                      z7MoSb*7Z&H`$MLvuYGqoejWL-t?*y)gVRs`UzNDI4m^f4y(yLdBa^xLbnzdshQ-e`
                      zej#2nVA(k~oj({R51B7DL6NV{;13WrF*O7mU}R>fXKA8fVrBpuk%8%#p01q9
                      zZwFqkwhi2}`E}vlqBz&@r_D4rc$zh)YQ$+Sf6<#+}*wOUHW_8yH6Mv
                      z)T{i>`D9VOafWTRsK9Zx?$YOv6gJA--kN*d(<7%c@6i9^lZ#a5>xuoIcGY#)-akHK
                      z|7YLTt7@y-mV4BG*4+2iT26CZ0#j}t{vmj}LW7xe-3j}zB9fbSc>6brJ$Uaq_3gxC
                      z+g5(CD5;aEf9mJ%%d%J@X_AKLgUO=b4;|Znp7jiW@?DFtn041P7yqr8qG%o&z2Vio
                      zy1SRP7O#G)x>KcZ>V)pLcbBYkGuN^3ySpy!IuQ}MY}z9+=~X961I^ba-LhIct0{l6
                      zisj&k>5~
                      z4}05Y=IR{fmUZh*#)RV2B{Fn5hZo)rX!AeHyT3?DTTNW_b;jYlK}z-h
                      zZbdq$zm+DJGI{K*-F26%+oB#F~kL=>c
                      zzPy{~er$O6V*V_#H{P%REZ?ZU;Qtp}#yFM3cXyV%%t?N>n6H1!qn*s`$N0HEJztsd
                      zJFR+;)~ao3KkXiGRQXo@O-t&UmVS}W?TxwCor~%>^1ZH|`f*9j^)*@RGp4RCJ!X2I
                      ze+|d7TYazluFv#%sG@%i?S(rMWxlmh>Kp$
                      zIr*xuao3jHVl&rdXjI=hoM}>g_VlENGt1qNeF}{;i4RlS82$I@^ZCcwEHB*uC8nz{
                      z6?Q4~*s7STPwTbyo2C_iJZ~?nd(6OM*DmRud;a8N%g)I-cL@wlCxX`jTXldTPg?hK9g?;u@sDG_kq}m#0mAL;o
                      z|C{IM(jGK#u@YLST5_Q$WKD)fV?pDIts%!4{sBHTp#BSjFBEs%Y?1Cz5A>9ef
                      z7}x`u)IQwL&X^jL`Ys`G<&TY0fA{$we0O;z=d9!VMBU;hv3RO%7jR^e35juCS+y`}
                      z>S=@R7Dv0E#~8A&(#)CGzi@8wclP2t(#3U2R)GD=)k#x)D{FPN-h4H^J3abOx#}@{_4-HY
                      zp^leT_xrDSd~}*T<1W6(pI`MHbJTvM`*`E3KNd&H?oh3=Ii@)8{3>H9^;6g4
                      z^`9TP^14x|FP6ddnZx=@!{^71U%1(_CNaF*$Q`RO(c^`(Qrm^*e@nR9(u{fPj=p*k
                      z%H(1vd%HVQH?(jy%c@R|xTO5E=F(*=o-K2!clq67+G)KZjbX#T9koAyJv;oCBje-N
                      z<_YK9l8y@R&di*}za-e<(&oRPt@+A@GGG3BP}Ux9R%vah+U#rN!NWhTKe;^1I`F#}
                      z$ImIdD=oyuwhGUXzWMOTorA~bw>@)g?u*gj=8UkPr<hJpM^w?{+E#Va`K85
                      z`HG%mHuXYla<)tBJUr4l)#3hz*aOcWAGPCeS7&&xJWn>y#Bh$o-{!D;+b$FfB>Fy^Z%TUf8R#g-O4Wf8UY)^#xOoO7oaCS_X#a^1VnsD(u&|{_97{
                      zzhPULYZI@sZ0r7`@=@i-glvglKg1%81CFtKJpLW$J$wqXPDd;`Eqj3@qDw-a{m3xw}<$yp4{;*
                      zHOC<2WX!B<1q;2@4>ZdkVZJ?G+|6F>f857^-+zC)q@?uZNG@wxMbn1{W!2PKS9|OW
                      zro0sI`fkdx)ah|&`ua(l%iTE@*mfMb&9#-s>;2pK?fK%Txf#wKfBJOiWA2=K={}j)
                      zy)_G_&d}ueV9H>%>Y1Uhg=$VPPrbp5wkMA-?pgU^JKxdAuHinWWyaG_GVllQz2q5R
                      zu`S(k%I&_#?!wy&e)~tg-+6K8&f={*5B<*QycTxN+3(Y#vMXT*u5YDpStdMEJXVo^XpB$zBuH@&BKe
                      z$6@kFZuPw_pR_b9SFG5ub!WNN)WSfUf+>2*0eXpqC%yZP?*sXoRcb{mz%>uV_kH@DXuFM6_>|3Sa;UFd*kw|OlY<99E%kZ@uuzK=Q
                      z#aXU?dkd78FVHRGKPHu|(_7T~V#4H;2J_~fHkcmI!>Up*!WS}T`^^5m`(5{~UPFb+`wO_myq&#---MCb%-m?Y_b*tRIlq)&nAOBY
                      z&%kK<#Sd)4jKM;VrHm}~%#9SxOicAa*C!fU8tIvvE0~#@=$THR@RVPJ$-o?P4FFd;zpKR%XDwvpA>KPlFC>R-7=owl}pZJttozWb!
                      z&0eK~AAFPnhnS%yL@}({j;R>rmWM3t2H@)>ML`p(Aj6G}O!N%R6$~xS(98xYXMD|K
                      zAZ=!@XK1PbS8r*eXK9449(31MPbI&RoUx&So`oqwxrwQPo~gMhHuX|fuxRGqS{{bo!Y#e!l57;sP9u2H+Dn>Z79bZ(9k~onNnT&Ms${heYQtadz${Ym5EF
                      zaxa_dm5KWbYM9A#Z&eMSH2cZ@_Y)4!Rynr(#&R_WCf+hwIUPj
                      z`}Wn>w3>MfIqYv={6O+y(3P(j-QCTvGQ5cQ+~06Ve(x;#xv?rLJSS>Wedman@I(l-
                      zBsvyJZFKr$V03?y{_)SX_qT-Zto%6j%>Po8+5Bo!tc+*tw^r84tl%h|lq$)4?4$Bg
                      zmlMo1B!QVu_#aBj_
                      zYesxp+2x2tr}fX(WuH&x*_o(w@Z_zQS=)B4e)V*P=!q_-S)!2w9Up8IaxT63GXMV!
                      zE^nn%mppnTlUH}w?$5WZWW1j|Ytm!+J#SYnd#AHJGV<5muh!ghtIi%Pux
                      z{59V7tKCoUcwBqFJ~~VCf9^Liom00MeeZ6+dUs#B$?ob+U$}HauYT{F^!uLZ)xvZp
                      z{?}O>=gm^`bz2r;wj{6W(}gYfIe2_`m2SSTD$u7Kc!a$U#-cSzDVNc)2mmne*Gi%nXOX7Z
                      zCKGPkqJ4g|o|_07a(y>8EHv(WgDev)6`FkL&;vneJb
                      zD`3ZheX5GQ&H^)yLMPwjXzvQq?lelc-d%8OTKCqETlRCbMLK=HBHG3&uWEIh_3EeE
                      zMu50*c!F-8SA`
                      z7GtrhGD+xCt;OMey087R#h)pu|N4}7n0M02)pl!AA1SZ+*}QP}tYGE~X&#HOPS7)t
                      zO=g%SkjeKm<@knN1Jm4k=ges3P1oH1%(kAo_33&u|N8xs1;sII{oX8J_Vosr*MSRR
                      zTAmvuF80XSul(w8!8F{|zhR%@lXbauA>Mf#qD)zCUfC`)t#`SxqfOY}pA5eu0<%MN
                      zSuYs7r=+iQx!tyO>elt*8*cBdbmV=Vr1I~G0*jk|r+xeN_UH1OZ@>PjvD;l+{_ofM)8CEVcf^?J#!T;PI}^Bm
                      z@BRFPukLoH&(e{4*>J8aILcv$-MgrJr86|Uwm-ScG_7{)CT0F)KgP!fEq%u)G_L&f
                      z|I3=wYkjO(pXbHTUv)}>_d^QKQDQQ`Qw=9XS#j0d
                      z!ZpdCZ?>tJJNsMf-1I{m1#adX3RFst=bqX6e6Q9160Ice?Hr0lN?}RD8(Y`Lb;-HZ
                      z>umBl;`PF1jqJ%fv&5(sS}$kT#q=!Gzq{~`fk$Q0#{8p~wzV!k#QDz5+c^GakX-)>
                      z-Zu+RsYWJdYZ!0Hs`|sM&B^`X%K5It|7LEx{LeG_)S7w$$^Q{2bhiB4xaYd>-c|1&
                      zn)K*7FDsK&dTn&%R%*wE)ULAFWf8YhIo6(@Gx1pc=@m1|<@%qk-CH@!NNT1lf8)I$
                      zEBsGYPit(qW;r&$&A4FALofbl!E0CBmfPfRDBGFHao<`feDD>vsZ#Yg>
                      z`|W%GbKYcQCY}0!J04i8?h$V+T7T`-^E~dP8~V#7bs8={y!0ecXm<}NYtk$flhV#9Tb!|{uaoh@T?qHZMm
                      zR7u>8(so_eoqovEX4Zxo0h}|#=da2(D15yzUn61lshxMORb7e>=~U9PF?xUMsClJj
                      zL%ZP09}y1oE=PE9L_C?uu(_%J^PSJqlPpeWNGvs|TcdaQ2hIe>f3DuXS^C45
                      z8)1)5N%T!}wiH-pR-2!C>(HFP_WQJ7%xGi$}
                      zkjlDja$je+`4X!QUQ)-m&%Yu(JJDuK=>5;P9@H-PJ1f*_y}gF=TJ|^~>3C?5VOqHu
                      zySv=%Nv@V>g(Y-OF3LQAv37H|djHHtJT?eZ6!9{DQtDoHip
                      zZ}!=LcSkbu7OueoXR
                      zenH(Nwd;BQ`qsBpB$+w#K3<#Udgk)Ql*g~rc4sFX{dKyf#p?*y$FkW!L}sR_Z1MQG
                      z=(_oyJE59qO(^_RiQ-@K`l(rr<1Aj>JsQ;;&s7
                      z?&v75*){*=lOxTq!lI+r&gR;|&V4r6-+=2;_cp0bW^R@y8`7nxKg&s3xU(wS!>Dp!
                      zdB#%3rge9$JgPY+YDirD{Vdz>*R_s)@|TE}9mh{v>`P%Q=lI=W{$Hs3P{L#Hx&Ku^eSA?rB}};!+=&q|
                      zFbAD&1Y31rZZuu5m0wvEcFq&{oMzApPU!Kzh6d0x;tWCOfJL|RKVUQluS{UFFrFUR
                      z#xKkRItdSCnvuDo`Se$Rq5UFe0}IpXOWOFgroUFk
                      zepm3(SRm^I53z|%S2)6^G<|0`KjcPdWOp}n!7wIUz`4M9N&KI6&)dQcnmkT;Y=0>B5pfs`AWSy)V8HcV#r3&iIB?g4xi}V7lTDHb}Q^`n#F@Hc*-At7h{XO)s6r?+g>Ln8VLM
                      zU1l}E%Jida`K6|xn!|4}-ETHO_$F7$=}~j}d8hyV%BC{??rg{@Zj#djKCu~1&zS>N
                      z0=k8ajZ1&}uQ~kgpxb{WnG6j+2N^6u=DV!DEKtgL{#V{RVmE;TiTbEQW>##?uYO1%w$5ryKGM2v3h*&CfZVV--Ii
                      z=twX5!USYYxhe$DBh*tro(o~`27n*M4vKM%;`4$~{v@as?S
                      zUJXsU%!Y=BkW?YHhTjF8n!!S#e(m%XYoOkqp1+RYV7l2_ez)n2d->4TzF{rD
                      z{&a`+{07tc*YUeex81-mJ^jpje*Nk5pv!RhWI4GxW;D5;}4oXO%ln~8jXb3xt&Ct+%`ifor
                      zn(~H*&{KO24UHg450TIe4Z#0{v0uhm0xy3yo|hmTGdkYwRx
                      zG@foCE+E2aJpJHqeqnLY&3g)9=bBlV!19!_>GX&G{OZhx#-`J+pXAq?u6UZ?V7lQc
                      ze$ZKipd2#Y>I}cp^aH2hS!Vh%kU+p`eiukN5PTN0CzWmb?%&MGQ?qDG+-8;lDHdwve((VtV9bexB(%dF-mwThH>lz(oCT@jGl+I>)cd#Rtj;
                      zAh&~}(%5Wz!3}-|4MRi7CR;8;L+DYzhKA6U_ekMkYzjKv@eH#e=rlQT0paP|Px$4S
                      zP0cN*pMAh7J6+%wzu5HpC;S4_AK&Dcn$G0IE({kFoNj)LUuyc_C;U9qdGom0Squ$L
                      zpa-B%xW#{(W4h}f{-e_sp78T9non=M$uG=kG2Ib#`TNC{pwmll@ryB9PH%X^uQ`3?
                      z8%~I^jF!_cKjGJ8GBto4Z@Bjrzu}XDUy1_es&*{Q%`CX?Uc*n0jo$nA2`}D52{6^DN-t!xRhsvgZddqJ&
                      zefE2P&*_!#_}!;#f8bYx6xd(h@f(814)v#pyythDE*QrSDz42zg@XR{CorMubN=x=
                      zZg2j;FU`#l-U0zjC8mbc_y6Xvk~cJj)is9DLu!!{hY9%L*E7t9rbgg=K3$VdK$gYG
                      z!pLm;ZB{Nwex6>#CZNe=W(G>SkdhH3A~gNMUw(<{k{nzJF~RAE|M;b*8*`$Fwfy6k
                      zp1y)jz;3$36>iS$&;IcjvrXT@De!i>8=C+h3%%i5VtZ}m`$JHDWJhfY$cc`~sb9(-~z2-ti%wbZ=;AIUTg&db)s|fY$c4;sPP8(>YWH-Z2}Sm`?wx
                      zD&R5QHjkTQyOW&2QMT!(Is)&fe^V9U16`mX!fa@1K0WXlm*#dCHGxm8(|=b8aDh(k
                      zIi?7$x=~6=OIX%5G&L}rZlfn4FR<->vaWvztoBn1w$j~k*x~)jvz_P>3sSE^3&yBv$25+ToKTT$rC&UG?@&HrZc*O
                      z>N`CFIXy^&LqR{FD76e^1f;}77zwIpgSfy(8W|W)pKlGTFe0Wn7N>0HJFs?+xv3aCx5G8T|wG?+deB%op>AQlO;
                      z5EfW4Ghmj$JO%e9q!9x1r4jVVQw4pfFQJ|^G@kwsWJiyw0PpmpMgkhs^GyV#nGDUQ
                      z_m~K%PS-aUux7NFe#JyUi^Bz{~aGJS*>hvB{0To8G=?NwfTa8Vo&oPI^pro0AIitz+
                      zY-0gAOX#iKh^RA!1v@nApamBqR81ghXS!jmfbeu)3jvYo=gkB}ru$ofqcg_>n@KZ6W9Xf7Zp1M@62P>f)i$Wg(_
                      zWO|{sfbjIGmIA`lr#lPCG8tM-zh)_*HN7!jKzO>am4NIt7XfXMsJE4X7L%#b^l~c!
                      z)#-IE0{YY4Ed}@)EvDZGOPEgQwiZyGF6kjr>q6E84ag@11XD9ex`3Sk?{sck0b@ps
                      z=~wLpYBoV|efbh*FmkV2K&z}RSdtDS%rqsjCQb^^*maATllgt5_d
                      ze_H`@2}cD(Blx8eh#)csHPXRVqX^h2J9`1G>607;gr`^A3n=JgmDS!gl6$XP&jI;WF>1`o1Br*Cu?P+&BiehDPo>?B~yXfa*a1yaIT
                      znoN&$5m24}%Sk|<(QJCSrGT83DX6;u@&zn8LARp9landT+o(mhrTO$PAhV`B3&^3@
                      zOD2e5H8wDqUhFEMI{mw|fGMNN^gXTuT1*DU(_etZ>Rbdo8BL}exCw}h!2AgFi=%?E
                      z!Sq6B0paO!ZUVxf?5(Q=%QF#V#lfbcX>EkDCmKp8yP0`etD
                      z>vUar0r}|@jRb_J$GZ!NOy_kIP=b2_q(H&Y2)fx8Y?h(v^vCW3s?!VI1e6)grn|ce
                      z$W7lDh*V^n!XgG%9>e(1ATu-v7n#O}7SmUG2*^+8br(>cKHE!xbGp5!0EYsk+yGkz
                      zJ>?rY)0!GjPjnXu0jU?1g&7PDEmK&CI4T$$nM@D$6p)|ZZ6UxvUC=|o9<0L%W;j%b
                      z8H^8$Zs_$G@aQ%(0+k*j+{WNuDB8gq4reKVIX}nEoS;Uzp9%#8}S&a;!JAk*Nj9
                      z%fi#oc?yWw!;FMR4BWj?E6iZY6O@IacYGiR-}H}V?2w}##UXx2+WBm3Y^G;n0@}tb
                      zJbkmbfavrNF98ujbPFw}SNjM^G8-D1PFM61P(ZXN#lbgs1R)t{WMQCZXbe7_eEM=9
                      z0nzDB-U7~YXa=IV*vxRcpf9vm14kI6$@F?(0qN-z{RM=lul0o_eQ?bt29g(;&g&;2
                      z!)QF6F+f0gx~-pp@bo=C0_qT{em?;jCS$YdYyAXNr_Zqx5Si}f3rT4L)0zFj+7x{R
                      zgr^&W%mx)X5N##?0y0b{M$;$x3#fwXKz)et6R@!9bfy3SRZt#Lgb2q32ylu*10Q-Z
                      z8z_E_O)REofmFKr3&??0%9z3OBTO}{sBu&DFbFaENMf#aqy&V
                      z0V`Wz+0qn}EzJz3+Xe}!P8SIj5SuA8UdMvTVO-v?l~wV){pr*ySLwf3!ltt&y-00oCaa
                      z!2+_3#?xnp2xu``m`pzk5?dcEAj)VwT`?3SWAvA$<(AVc!y%E&
                      zGF>`MKvxh}3_!!q!en})8Mu-#GccO|K3qU$`phr^Q(bgru=YJPMlE0sQAY(c1Jmi;
                      zkpimI6~YB{7>%dzjTVsOfrq%Gg4y&!R{`Pag^>ax)8~Z?n8>0VjbxOe;q>#7u$HiO
                      zgg`l?$#e$`0XZw^*e{|b47;KP+KV!RjuOKgtB@ErGc=j*6a{Mdfm&k|qCi~>^XY3r
                      zBCU}EvW%9~KSl|N!xA<0iW5+xHZwAq&KoVDGW~O;fRZ3AIYYzD(s26OXaT9|4?&g8
                      zuV?|`>1j~{QjC_<3u6T2d10B}QNhf}Z2HLCX}bBqd-01kJfd;EZc#YA{_qQ9yP2ig*E`>30$ZxTcpR
                      z3J8Nvr04_*|APuku{tW4nVL=KPJ)GNb%H=JbW|7Cc{GOJ`vOl}#s;v&4yo0R4J@W5
                      z3V=rHdXofnr@JHyXuul{kgzd^-m?czIc7%F|AFk=kS4$~-9Ax(b^5kM0S#SPvVepx
                      z!VZ`Tu+Vl?Ff%iqek>UhHBb{Qk_0qRTQW;i1mu~_ET$hzK~cCXNkAR$IG9yPMw=T>
                      z-g`Dp@D
                      z%x0EG(|e%e+S5f-1xg%Xu@12SVII`uNL_U^_~;P4mtbsYG+od{Ky>=OQ~^m0qhRGe
                      z%qUo5aZ~`UfdkEkAT08nSL{!mzhvWn^i1Y016sB8d2zX34O&2g^G@E`iUBG<$ymSF8MspB5i_ro^nNQbG
                      z7hs#-m?4lR2+lVO=8&7R6hNoA{KycH;RL5j1ygh5>9UyuQT34KxdQkSrXU4K&?#6#
                      zE^bw@gxtQW0LiophL8ah1xrZ1tzZe6t5mRr+ykm$Xb5(
                      zqhM$N>1-+(Li&RWhSR@g3J9q{++=6~Jxklr0Mf@%Fod*>6+lPGOxMX0kgSJTUW5vQ8;zSF`!G^JWVlcptP=vKiJ8X=a@2(dJTM4csM5g7$bXhOAwMyMquLS+>!p}}Vf4L(CdNTWi*(!_lF-5h~BMvLh&xdLu_
                      z;Izf1prG$&3`*|cpagR*L0oWLfVt)%uEq2VxdM*yh8Cbf4p10_q&#yi6ri^aDk$iC
                      z<{FwQ7{bPZL3}d>NNR$pH8fN(2m2MmH8NB%Mb>PjU~DmcLY{!>^e1@&0@JVN3Gj;<
                      znJ8F7(mq6wA;@W#(|6|yNU<3iD_EKvPXCoBpe}5p0PEC)tTi%Hur!^Xm?t2;-9KMo
                      z4W}9?Pk?4aY;53_pAjVYalzWo#s-$t6)OcK87-$x2Gg4=1=Q+6Q>RFB1_lO3mY@WUE(RL&Kov6q_r;OK3=Pc9%|J)|
                      zBZ(Op7#M@^t3wqtF#)A$0|SG4m_rQ=3`|Tw#T%MJQ&9Rs6*Dyk&4i+gnV4b`GXten
                      zRCT7tsGh3_Nt>91N)r$Z8fpdx2BxNa)0-Bg9D1W1h8Crts2vjixGgv6p
                      zBP=m81Ql4Q3XKggqQub15OkX*nmS|9=roF$k%1AYLyaP4Xl#s@7VAOYMNgn$F;E^u
                      z)oft~x}+0b3{*O!h#47}V2Bx;V5TD@15*RDdbHp-GByJhY^Vkrn}G@~R53GSP=SXo
                      zhLQS>jg2w%8XFsf3VyKOdPp`kFfcYTM++JQ0~2HLmGNMONa`?x)!5tuRA8a1GY4O*
                      zjv{7aYyhe#ki{|$OpL(`c8~=POiTO~2GyCUVx~r*abI*Xj4(4ZFvG|zW(H=Usu#7mF*7s+
                      zjijL%Xl7vwYEPqz8Jc0_3o|otjf|?!%p4=Hm|2*EsyT!@P;p~!W{8nl%q+}7<7Wtk
                      z1_lP^rsgIVXvx#u)ErdxqpCAA2346TVirbbpqd3m%-qb_tlk98KnnwN(50#<3M~vQ
                      zKusJ}F(V65TLe|i5_}yws+bY@&UjQYb8}FW3M7UoZY<0#Kvfw?5MBgX8W>`f;+6&$
                      zpxPH*9jKXyDh641hAM_peAOEmSQ=uM;+Dpk<(H+YF-C3%C2a$=5VSNkMNe>sW=6)K
                      zh8L=1Oie9}MNl;xni-fISWFjd6i}_l2o8`b=-JxP%m93iHnPcvW`+jnacF2}WCohk
                      zK~`sEY-)*Vo{8Bb6R22W4Bx7V|
                      zYGzMEfbZU!2+K@l@DG&VAx-qs?Z
                      zT5p10se%jvO_HE#0C(rm#LUp!G$uwS7;PUDBXc9rC=aS$69Z5;5GANhj7$tcT@h4;
                      z=7#9SrHPS=5qeQ;0*Yfx)GQ1VLvPuc7@3%%RCJ(X-^9oS+?_+U*aV}oZDM3@g4T#P
                      zFfp<;#t3pFb66u9o<2;BEX~ksNfTou(EJ`_n}BdVdV)7GHUf7wQQTx~2JSVYiW!-s
                      z7icENMi%HT5ffuGL(sinsCtdTH#Vcxz9z=ThUk@+iLo(w848+aL|X~k1Trx;HUV{8
                      zQPr85pjRCx#unzNX}2EKq%t!>uW3z;%}gO#5>W=47-P0JO^nUVFmjc#nT3HdT9Pof
                      zutaY%n3x!unbo7G9b*eij5KC!X@J^h0CkLv%+PxtCdQVADA^g*fiku<1}&3C4H-*g
                      z(2xg63|{-17+ad6H(yPREzLmFbRdPWa>T^M2;9F%5i>WnfE24pp#@5yW@w>cVr+nB
                      zN4Zv){a0p(AX5c#5MuNlOcv<%uS5Y8v7}XIih@5E54AJ|}CMIS^u+)n1iJ1vnLNYKhF#`|6pgP*j
                      z45NTEF+*zK)`N#cK$qiFCMupyJ!q*cdaKj7`xS!6jm@
                      zuc-z4kg18OnE~49G*~aHB?bm2re=odV__zyW=58_sN)cZ1_ox97~KX_GZT!`($vh<
                      z+-SPp83Dz5km=^=170SkW)^5R8X6c_nxgp>q}LKOXN2T?0~1qo^y1mjz|a_@A!1@`
                      zZe(tP-W)SEM=!HMnvI|{1&G#;sktde6CN}!hF*)Bnp>a`RG65WTf*Cm@a7n(L5tcn
                      zH#9Ibw?v;5FaecS=nYF#jKO|G10!<-^dTV=QwtOHc0;|1sRep>9;6wwFKTLm(Zx40
                      zwLou4gY+6yHiGmQB(
                      z6LT|jjAGo}43Vm#Z9dRo14d5Ln_%>e%t2m3t&mL2K{I|B
                      zVwUIwVJ7Al2B7T

                      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

                      HOVd2Bvx@ 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 diff --git a/doc/src/msm.xml b/doc/src/msm.xml index d153fbd..2530c2f 100644 --- a/doc/src/msm.xml +++ b/doc/src/msm.xml @@ -2,7 +2,7 @@ - Meta State Machine (MSM) V2.20 + Meta State Machine (MSM) Christophe Henry christophe.j.henry@googlemail.com @@ -660,7 +660,7 @@ template <class Fire> void send_rocket(Fire const& evt) fire_rocket(evt.direction, current_calculation); } ... -}; +}; Entry and exit actions represent a behavior common to a state, no matter through which transition it is entered or left. States being reusable, it might make sense to locate your data there instead of in the state machine, @@ -699,6 +699,23 @@ void on_entry(Event const& evt, Fsm& fsm) g_row2, a_irow2, irow2, g_irow2 let you call an action located in any state of the current fsm or in the front-end itself, thus letting you place useful data anywhere you see fit. + It is sometimes desirable to generate new events for the state machine + inside actions. Since the process_event method belongs to the back end, you + first need to gain a reference to it. The back end derives from the front + end, so one way of doing this is to use a cast: + struct launcher_ : public msm::front::state_machine_def<launcher_>{ +template <class Fire> void send_rocket(Fire const& evt) +{ + fire_rocket(); + msm::back::state_machine<launcher_> &fsm = static_cast<msm::back::state_machine<launcher_> &>(*this); + fsm.process_event(rocket_launched()); +} +... +}; + The same can be implemented inside entry/exit actions. Admittedly, this is + a bit awkward. A more natural mechanism is available using the functor + front-end. Defining a simple state machine @@ -750,7 +767,8 @@ void no_transition(Event const& e, Fsm& ,int state){...}back-end part. After a call - to start, the state machine is ready to process events. + to start, the state machine is ready to process events. The same way, + calling stop() will cause the last exit actions to be called. Defining a submachine @@ -1694,6 +1712,17 @@ struct Empty : public msm::front::euml::func_state<Empty_Entry,Empty_Exit>{}; fire_rocket(evt.direction, src.current_calculation); } }; + It was a little awkward to generate new events inside actions with the basic + front-end. With the functor front-end it is much cleaner: + struct send_rocket +{ + template <class Fsm,class Evt,class SourceState,class TargetState> + void operator()(Evt const& evt, Fsm& fsm, SourceState& src,TargetState&) + { + fire_rocket(evt.direction, src.current_calculation); + fsm.process_event(rocket_launched()); + } +}; Defining a simple state machine @@ -2015,6 +2044,47 @@ Empty_impl const Empty; now use this inside a transition: Empty == Open + open_close / (close_drawer,activate_empty_(target_)) + + <command xml:id="eUML-phoenix"/>Writing actions with Boost.Phoenix (in development) + 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 + will be mixing of eUML and Phoenix functors. Writing guards in one + language and actions in another is ok though. + Phoenix also supports a larger syntax than what will ever be possible + with eUML, so you can only use a reduced set of phoenix's grammar. This + is due to the nature of eUML. The run-time transition table definition + is translated to a type using Boost.Typeof. The result is a "normal" MSM + transition table made of functor types. As C++ does not allow mixing + run-time and compile-time constructs, there will be some limit (trying + to instantiate a template class MyTemplateClass<i> where i is an int + will give you an idea). This means following valid Phoenix constructs + will not work: + + + + literals + + + function pointers + + + bind + + + ->* + + + + Future versions of MSM will support Phoenix better. You can contribute + by finding out cases which do not work but should, so that they can be + added. + Phoenix support is not activated by default. To activate it, add + before any MSM header: #define BOOST_MSM_EUML_PHOENIX_SUPPORT. + A simple example shows some basic capabilities. + Defining a simple state machine @@ -2651,8 +2721,9 @@ struct Open_impl : public Open_def describe what can be done with it. - <command xml:id="backend-start"/>Starting a state machine - The start method starts the state machine, meaning it will + <command xml:id="backend-start"/>Starting and stopping a state + machine + The start() method starts the state machine, meaning it will activate the initial state, which means in turn that the initial state's entry behavior will be called. We need the start method because you do not always want the entry behavior of the initial state to be called immediately @@ -2661,6 +2732,11 @@ struct Open_impl : public Open_def back to the initial state is an algorithm call. Each call to start will make the algorithm run once. The iPodSearch example uses this possibility. + The stop() method works the same way. It will cause the exit + actions of the currently active states(s) to be called. + 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. Event dispatching @@ -3685,6 +3761,10 @@ typename ::boost::enable_if< Thanks to Matt Calabrese, Juraj Ivancic, Adam Merz and Joseph Wu for reporting bugs. + + Thanks to Thomas Mistretta for providing an addition to the + section "What do you actually do inside actions / guards". + @@ -3716,7 +3796,44 @@ typename ::boost::enable_if< Version history - From V2.12 to V2.20 + From V2.20 to V2.21 (Boost 1.47) + + + + added a stop() method in the back-end. + + + Added partial support for Boost.Phoenix functors in eUML + + + Bugfixes + + Trac 5117, 5253, 5533 + + + gcc warnings about unused variables + + + better implemenation of favor_compile_time back-end + policy + + + bug with eUML and state construction + + + incorrect eUML event and state macros + + + incorrect event type passed to a direct entry state's + on_entry action + + + + + + + + From V2.12 to V2.20 (Boost 1.46) @@ -3740,7 +3857,7 @@ typename ::boost::enable_if< Possibility to provide a - container for the event and deferred event queues. A + container for the event and deferred event queues. A policy implementation based on a more efficient Boost.CircularBuffer is provided. @@ -3750,27 +3867,27 @@ typename ::boost::enable_if< added possibility to enqueue events for delayed processing. + >enqueue events for delayed processing. Bugfixes - - Trac 4926 - - - stack overflow using the Defer functor - - - anonymous transition of a submachine not called for - the initial state - - + + Trac 4926 + + + stack overflow using the Defer functor + + + anonymous transition of a submachine not called for + the initial state + + - From V2.10 to V2.12 + From V2.10 to V2.12 (Boost 1.45) @@ -3793,7 +3910,7 @@ typename ::boost::enable_if< - From V2.0 to V2.12 + From V2.0 to V2.12 (Boost 1.44)