|
Boost : |
From: Alexander Nasonov (alnsn_at_[hidden])
Date: 2006-12-19 16:15:57
Andrey Semashev wrote:
> A pointer to the state's data doesn't help if the state is actually
> destroyed when being left (the pointer is freed and the data is lost).
> And storing such pointer in a place somewhere out of the state (i.e.
> in a base state, a state machine or its some common storage like
> virtual bases in my implementation) means that data is exposed
> and is no longer specific to the state. IMO, this breaks the natural
> state encapsulation that is one of the main ideas of FSM concept.
struct my_fsm : fsm<my_fsm>
{
// Events
enum event { Start, Pause, Stop };
private:
struct Data { /* ... */ };
// States
struct Operational { Data* data_ptr; };
struct Paused : Operational {};
struct Running : Operational {};
struct Stopped {};
struct Initial {};
Data m_data; // Paused and Running will point to it.
Running on_process(id<1>, Initial, integral_c<event,Start>) const;
Paused on_process(id<2>, Running, integral_c<event,Pause>) const;
Running on_process(id<3>, Paused, integral_c<event,Pause>) const;
Stopped on_process(id<4>, Operational, integral_c<event,Stop> ) const;
// Last function is most interesting because it defines transitions
// for all states derived from Operational.
public:
my_fsm();
};
Running my_fsm::on_process( id<1>
, Initial
, integral_c<my_fsm::event,event::Start>
) const
{
Running result;
result.data_ptr = &m_data;
return result;
}
In this example, all states and state data are private.
-- Alexander Nasonov http://nasonov.blogspot.com We need not think alike to love alike. -- Francis David -- This quote is generated by: /usr/pkg/bin/curl -L http://tinyurl.com/veusy \ | sed -e 's/^document\.write(.//' -e 's/.);$/ --/' \ -e 's/<[^>]*>//g' -e 's/^More quotes from //' \ | fmt | tee ~/.signature-quote
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk