Chris@16: #ifndef BOOST_STATECHART_RESULT_HPP_INCLUDED Chris@16: #define BOOST_STATECHART_RESULT_HPP_INCLUDED Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Copyright 2002-2010 Andreas Huber Doenni Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompany- Chris@16: // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: Chris@16: Chris@16: #include Chris@16: Chris@16: Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace statechart Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: enum reaction_result Chris@16: { Chris@16: no_reaction, Chris@16: do_forward_event, Chris@16: do_discard_event, Chris@16: do_defer_event, Chris@16: consumed Chris@16: }; Chris@16: Chris@16: struct result_utility; Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: class safe_reaction_result Chris@16: { Chris@16: public: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: safe_reaction_result( const safe_reaction_result & other ) : Chris@16: reactionResult_( other.reactionResult_ ) Chris@16: { Chris@16: // This assert fails when an attempt is made to make multiple copies of Chris@16: // a result value. This makes little sense, given the requirement that Chris@16: // an obtained result value must be returned out of the react function. Chris@16: BOOST_ASSERT( reactionResult_ != consumed ); Chris@16: other.reactionResult_ = consumed; Chris@16: } Chris@16: Chris@16: ~safe_reaction_result() Chris@16: { Chris@16: // This assert fails when an obtained result value is not returned out Chris@16: // of the react() function. This can happen if the user accidentally Chris@16: // makes more than one call to reaction functions inside react() or Chris@16: // accidentally makes one or more calls to reaction functions outside Chris@16: // react() Chris@16: BOOST_ASSERT( reactionResult_ == consumed ); Chris@16: } Chris@16: Chris@16: private: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: safe_reaction_result( reaction_result reactionResult ) : Chris@16: reactionResult_( reactionResult ) Chris@16: { Chris@16: } Chris@16: Chris@16: operator reaction_result() const Chris@16: { Chris@16: const reaction_result val = reactionResult_; Chris@16: reactionResult_ = consumed; Chris@16: return val; Chris@16: } Chris@16: Chris@16: safe_reaction_result & operator=( const safe_reaction_result & ); Chris@16: Chris@16: mutable reaction_result reactionResult_; Chris@16: Chris@16: friend struct result_utility; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: Chris@16: Chris@16: #ifdef NDEBUG Chris@16: typedef detail::reaction_result result; Chris@16: #else Chris@16: typedef detail::safe_reaction_result result; Chris@16: #endif Chris@16: Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: struct result_utility Chris@16: { Chris@16: static ::boost::statechart::result make_result( reaction_result value ) Chris@16: { Chris@16: return value; Chris@16: } Chris@16: Chris@16: static reaction_result get_result( ::boost::statechart::result value ) Chris@16: { Chris@16: return value; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace statechart Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: Chris@16: #endif