#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 |