diff options
Diffstat (limited to 'boost/statechart/result.hpp')
-rw-r--r-- | boost/statechart/result.hpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/boost/statechart/result.hpp b/boost/statechart/result.hpp new file mode 100644 index 0000000000..6843ba358a --- /dev/null +++ b/boost/statechart/result.hpp @@ -0,0 +1,122 @@ +#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 |