#ifndef BOOST_STATECHART_ASYNCHRONOUS_STATE_MACHINE_HPP_INCLUDED

#define BOOST_STATECHART_ASYNCHRONOUS_STATE_MACHINE_HPP_INCLUDED

//////////////////////////////////////////////////////////////////////////////

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

//////////////////////////////////////////////////////////////////////////////







#include <boost/statechart/state_machine.hpp>

#include <boost/statechart/fifo_scheduler.hpp>

#include <boost/statechart/null_exception_translator.hpp>

#include <boost/statechart/event_processor.hpp>



#include <memory>   // std::allocator





namespace boost

{

namespace statechart

{







class event_base;







//////////////////////////////////////////////////////////////////////////////

template< class MostDerived,

          class InitialState,

          class Scheduler = fifo_scheduler<>,

          class Allocator = std::allocator< void >,

          class ExceptionTranslator = null_exception_translator >

class asynchronous_state_machine : public state_machine<

  MostDerived, InitialState, Allocator, ExceptionTranslator >,

  public event_processor< Scheduler >

{

  typedef state_machine< MostDerived,

    InitialState, Allocator, ExceptionTranslator > machine_base;

  typedef event_processor< Scheduler > processor_base;

  protected:

    //////////////////////////////////////////////////////////////////////////

    typedef asynchronous_state_machine my_base;



    asynchronous_state_machine( typename processor_base::my_context ctx ) :

      processor_base( ctx )

    {

    }



    virtual ~asynchronous_state_machine() {}



  public:

    //////////////////////////////////////////////////////////////////////////

    // The following declarations should be private.

    // They are only public because many compilers lack template friends.

    //////////////////////////////////////////////////////////////////////////

    void terminate()

    {

      processor_base::terminate();

    }



  private:

    //////////////////////////////////////////////////////////////////////////

    virtual void initiate_impl()

    {

      machine_base::initiate();

    }



    virtual void process_event_impl( const event_base & evt )

    {

      machine_base::process_event( evt );

    }



    virtual void terminate_impl()

    {

      machine_base::terminate();

    }

};







} // namespace statechart

} // namespace boost







#endif

