summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/statechart/example/Handcrafted/Handcrafted.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/statechart/example/Handcrafted/Handcrafted.cpp')
-rw-r--r--src/boost/libs/statechart/example/Handcrafted/Handcrafted.cpp205
1 files changed, 205 insertions, 0 deletions
diff --git a/src/boost/libs/statechart/example/Handcrafted/Handcrafted.cpp b/src/boost/libs/statechart/example/Handcrafted/Handcrafted.cpp
new file mode 100644
index 000000000..7b77c26f4
--- /dev/null
+++ b/src/boost/libs/statechart/example/Handcrafted/Handcrafted.cpp
@@ -0,0 +1,205 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright 2002-2006 Andreas Huber Doenni
+// Distributed under the Boost Software License, Version 1.0. (See accompany-
+// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// This is a quick-and-dirty handcrafted state machine with two states and two
+// transitions employing GOF-visitation (two virtual calls per event).
+// It is used to make speed comparisons with Boost.Statechart machines.
+//////////////////////////////////////////////////////////////////////////////
+
+
+
+#include <boost/config.hpp>
+
+#include <iostream>
+#include <iomanip>
+#include <ctime>
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std
+{
+ using ::clock_t;
+ using ::clock;
+}
+#endif
+
+#ifdef BOOST_INTEL
+# pragma warning( disable: 304 ) // access control not specified
+#endif
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+class EvFlipBit;
+class state_base
+{
+ public:
+ virtual ~state_base() {};
+
+ virtual const state_base & react( const EvFlipBit & toEvent ) const = 0;
+
+ protected:
+ state_base() {}
+};
+
+template< class Derived >
+class state : public state_base
+{
+ public:
+ state() : state_base() { }
+
+ static const Derived & instance()
+ {
+ return instance_;
+ }
+
+ private:
+ static const Derived instance_;
+};
+
+template< class Derived >
+const Derived state< Derived >::instance_;
+
+
+//////////////////////////////////////////////////////////////////////////////
+class event_base
+{
+ public:
+ virtual ~event_base() {}
+
+ protected:
+ event_base() {}
+
+ public:
+ virtual const state_base & send( const state_base & toState ) const = 0;
+};
+
+template< class Derived >
+class event : public event_base
+{
+ protected:
+ event() {}
+
+ private:
+ virtual const state_base & send( const state_base & toState ) const
+ {
+ return toState.react( *static_cast< const Derived * >( this ) );
+ }
+};
+
+
+//////////////////////////////////////////////////////////////////////////////
+class EvFlipBit : public event< EvFlipBit > {
+public:
+ EvFlipBit() : event < EvFlipBit >() { }
+};
+const EvFlipBit flip;
+
+class BitMachine
+{
+ public:
+ //////////////////////////////////////////////////////////////////////////
+ BitMachine() : pCurrentState_( &Off::instance() ) {}
+
+ void process_event( const event_base & evt )
+ {
+ pCurrentState_ = &evt.send( *pCurrentState_ );
+ }
+
+ private:
+ //////////////////////////////////////////////////////////////////////////
+ struct On : state< On >
+ {
+ On() : state<On>() { }
+
+ virtual const state_base & react( const EvFlipBit & ) const
+ {
+ return Off::instance();
+ }
+ };
+
+ struct Off : state< Off >
+ {
+ Off() : state<Off>() { }
+
+ virtual const state_base & react( const EvFlipBit & ) const
+ {
+ return On::instance();
+ }
+ };
+
+ const state_base * pCurrentState_;
+};
+
+
+//////////////////////////////////////////////////////////////////////////////
+char GetKey()
+{
+ char key;
+ std::cin >> key;
+ return key;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+int main()
+{
+ // common prime factors of 2^n-1 for n in [1,8]
+ const unsigned int noOfEvents = 3 * 3 * 5 * 7 * 17 * 31 * 127;
+ unsigned long eventsSentTotal = 0;
+
+ std::cout << "Boost.Statechart Handcrafted example\n";
+ std::cout << "Machine configuration: " << 2 <<
+ " states interconnected with " << 2 << " transitions.\n\n";
+
+ std::cout << "p<CR>: Performance test\n";
+ std::cout << "e<CR>: Exits the program\n\n";
+ std::cout <<
+ "You may chain commands, e.g. pe<CR> performs a test and then exits the program\n\n";
+
+ BitMachine bitMachine;
+
+ char key = GetKey();
+
+ while ( key != 'e' )
+ {
+ switch ( key )
+ {
+ case 'p':
+ {
+ std::cout << "\nSending " << noOfEvents <<
+ " events. Please wait...\n";
+
+ const unsigned long startEvents2 = eventsSentTotal;
+ const std::clock_t startTime2 = std::clock();
+
+ for ( unsigned int eventNo = 0; eventNo < noOfEvents; ++eventNo )
+ {
+ bitMachine.process_event( flip );
+ ++eventsSentTotal;
+ }
+
+ const std::clock_t elapsedTime2 = std::clock() - startTime2;
+ const unsigned int eventsSent2 = eventsSentTotal - startEvents2;
+ std::cout << "Time to dispatch one event and\n" <<
+ "perform the resulting transition: ";
+ std::cout << elapsedTime2 * 1000.0 / eventsSent2 << " microseconds\n\n";
+ }
+ break;
+
+ default:
+ {
+ std::cout << "Invalid key!\n";
+ }
+ }
+
+ key = GetKey();
+ }
+
+ return 0;
+}