123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #ifndef BOOST_STATECHART_RESULT_HPP_INCLUDED
- #define BOOST_STATECHART_RESULT_HPP_INCLUDED
- //////////////////////////////////////////////////////////////////////////////
- // Copyright 2002-2010 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/assert.hpp>
- namespace boost
- {
- namespace statechart
- {
- namespace detail
- {
- //////////////////////////////////////////////////////////////////////////////
- enum reaction_result
- {
- no_reaction,
- do_forward_event,
- do_discard_event,
- do_defer_event,
- consumed
- };
- struct result_utility;
- //////////////////////////////////////////////////////////////////////////////
- class safe_reaction_result
- {
- public:
- //////////////////////////////////////////////////////////////////////////
- safe_reaction_result( const safe_reaction_result & other ) :
- reactionResult_( other.reactionResult_ )
- {
- // This assert fails when an attempt is made to make multiple copies of
- // a result value. This makes little sense, given the requirement that
- // an obtained result value must be returned out of the react function.
- BOOST_ASSERT( reactionResult_ != consumed );
- other.reactionResult_ = consumed;
- }
- ~safe_reaction_result()
- {
- // This assert fails when an obtained result value is not returned out
- // of the react() function. This can happen if the user accidentally
- // makes more than one call to reaction functions inside react() or
- // accidentally makes one or more calls to reaction functions outside
- // react()
- BOOST_ASSERT( reactionResult_ == consumed );
- }
- private:
- //////////////////////////////////////////////////////////////////////////
- safe_reaction_result( reaction_result reactionResult ) :
- reactionResult_( reactionResult )
- {
- }
- operator reaction_result() const
- {
- const reaction_result val = reactionResult_;
- reactionResult_ = consumed;
- return val;
- }
- safe_reaction_result & operator=( const safe_reaction_result & );
- mutable reaction_result reactionResult_;
- friend struct result_utility;
- };
- } // namespace detail
- #ifdef NDEBUG
- typedef detail::reaction_result result;
- #else
- typedef detail::safe_reaction_result result;
- #endif
- namespace detail
- {
- //////////////////////////////////////////////////////////////////////////////
- struct result_utility
- {
- static ::boost::statechart::result make_result( reaction_result value )
- {
- return value;
- }
- static reaction_result get_result( ::boost::statechart::result value )
- {
- return value;
- }
- };
- } // namespace detail
- } // namespace statechart
- } // namespace boost
- #endif
|