1 #ifndef BOOST_STATECHART_RESULT_HPP_INCLUDED
2 #define BOOST_STATECHART_RESULT_HPP_INCLUDED
3 //////////////////////////////////////////////////////////////////////////////
4 // Copyright 2002-2010 Andreas Huber Doenni
5 // Distributed under the Boost Software License, Version 1.0. (See accompany-
6 // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 //////////////////////////////////////////////////////////////////////////////
8 
9 
10 
11 #include <boost/assert.hpp>
12 
13 
14 
15 namespace boost
16 {
17 namespace statechart
18 {
19 namespace detail
20 {
21 
22 
23 
24 //////////////////////////////////////////////////////////////////////////////
25 enum reaction_result
26 {
27   no_reaction,
28   do_forward_event,
29   do_discard_event,
30   do_defer_event,
31   consumed
32 };
33 
34 struct result_utility;
35 
36 //////////////////////////////////////////////////////////////////////////////
37 class safe_reaction_result
38 {
39   public:
40     //////////////////////////////////////////////////////////////////////////
safe_reaction_result(const safe_reaction_result & other)41     safe_reaction_result( const safe_reaction_result & other ) :
42       reactionResult_( other.reactionResult_ )
43     {
44       // This assert fails when an attempt is made to make multiple copies of
45       // a result value. This makes little sense, given the requirement that
46       // an obtained result value must be returned out of the react function.
47       BOOST_ASSERT( reactionResult_ != consumed );
48       other.reactionResult_ = consumed;
49     }
50 
~safe_reaction_result()51     ~safe_reaction_result()
52     {
53       // This assert fails when an obtained result value is not returned out
54       // of the react() function. This can happen if the user accidentally
55       // makes more than one call to reaction functions inside react() or
56       // accidentally makes one or more calls to reaction functions outside
57       // react()
58       BOOST_ASSERT( reactionResult_ == consumed );
59     }
60 
61   private:
62     //////////////////////////////////////////////////////////////////////////
safe_reaction_result(reaction_result reactionResult)63     safe_reaction_result( reaction_result reactionResult ) :
64       reactionResult_( reactionResult )
65     {
66     }
67 
operator reaction_result() const68     operator reaction_result() const
69     {
70       const reaction_result val = reactionResult_;
71       reactionResult_ = consumed;
72       return val;
73     }
74 
75     safe_reaction_result & operator=( const safe_reaction_result & );
76 
77     mutable reaction_result reactionResult_;
78 
79     friend struct result_utility;
80 };
81 
82 
83 
84 } // namespace detail
85 
86 
87 
88 #ifdef NDEBUG
89   typedef detail::reaction_result result;
90 #else
91   typedef detail::safe_reaction_result result;
92 #endif
93 
94 
95 namespace detail
96 {
97 
98 
99 
100 //////////////////////////////////////////////////////////////////////////////
101 struct result_utility
102 {
make_resultboost::statechart::detail::result_utility103   static ::boost::statechart::result make_result( reaction_result value )
104   {
105     return value;
106   }
107 
get_resultboost::statechart::detail::result_utility108   static reaction_result get_result( ::boost::statechart::result value )
109   {
110     return value;
111   }
112 };
113 
114 
115 
116 } // namespace detail
117 } // namespace statechart
118 } // namespace boost
119 
120 
121 
122 #endif
123