]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/msm/include/boost/msm/front/states.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / msm / include / boost / msm / front / states.hpp
CommitLineData
7c673cae
FG
1// Copyright 2008 Christophe Henry
2// henry UNDERSCORE christophe AT hotmail DOT com
3// This is an extended version of the state machine available in the boost::mpl library
4// Distributed under the same license as the original.
5// Copyright for the original version:
6// Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed
7// under the Boost Software License, Version 1.0. (See accompanying
8// file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10
11#ifndef BOOST_MSM_FRONT_STATES_H
12#define BOOST_MSM_FRONT_STATES_H
13
14#include <boost/mpl/bool.hpp>
15#include <boost/mpl/vector.hpp>
16#include <boost/msm/front/common_states.hpp>
17#include <boost/msm/row_tags.hpp>
18#include <boost/msm/back/metafunctions.hpp>
19
20namespace boost { namespace msm { namespace front
21{
22
23struct no_sm_ptr
24{
25 // tags
26 typedef ::boost::mpl::bool_<false> needs_sm;
27};
28struct sm_ptr
29{
30 // tags
31 typedef ::boost::mpl::bool_<true> needs_sm;
32};
33// kept for backward compatibility
34struct NoSMPtr
35{
36 // tags
37 typedef ::boost::mpl::bool_<false> needs_sm;
38};
39struct SMPtr
40{
41 // tags
42 typedef ::boost::mpl::bool_<true> needs_sm;
43};
44
45// provides the typedefs and interface. Concrete states derive from it.
46// template argument: pointer-to-fsm policy
47template<class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
48struct state : public boost::msm::front::detail::state_base<BASE>, SMPtrPolicy
49{
50 // tags
51 // default: no flag
52 typedef ::boost::mpl::vector0<> flag_list;
53 typedef ::boost::mpl::vector0<> internal_flag_list;
54 //default: no deferred events
55 typedef ::boost::mpl::vector0<> deferred_events;
56};
57
58// terminate state simply defines the TerminateFlag flag
59// template argument: pointer-to-fsm policy
60template<class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
61struct terminate_state : public boost::msm::front::detail::state_base<BASE>, SMPtrPolicy
62{
63 // tags
64 typedef ::boost::mpl::vector0<> flag_list;
65 typedef ::boost::mpl::vector< boost::msm::TerminateFlag> internal_flag_list;
66 //default: no deferred events
67 typedef ::boost::mpl::vector0<> deferred_events;
68};
69
70// terminate state simply defines the InterruptedFlag and EndInterruptFlag<EndInterruptEvent> flags
71// template argument: event which ends the interrupt
72// template argument: pointer-to-fsm policy
73template <class EndInterruptEvent,class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
74struct interrupt_state : public boost::msm::front::detail::state_base<BASE>, SMPtrPolicy
75{
76 // tags
77 typedef ::boost::mpl::vector0<> flag_list;
78 typedef typename boost::msm::back::build_interrupt_state_flag_list<
79 typename boost::msm::back::get_interrupt_events<EndInterruptEvent>::type
80 >::type internal_flag_list;
81
82 //default: no deferred events
83 typedef ::boost::mpl::vector0<> deferred_events;
84};
85
86// not a state but a bunch of extra typedefs to handle direct entry into a composite state. To be derived from
87// template argument: zone index of this state
88template <int ZoneIndex=-1>
89struct explicit_entry
90{
91 typedef int explicit_entry_state;
92 enum {zone_index=ZoneIndex};
93};
94
95// to be derived from. Makes a type an entry (pseudo) state. Actually an almost full-fledged state
96// template argument: containing composite
97// template argument: zone index of this state
98// template argument: pointer-to-fsm policy
99template<int ZoneIndex=-1,class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
100struct entry_pseudo_state
101 : public boost::msm::front::detail::state_base<BASE>,SMPtrPolicy
102{
103 // tags
104 typedef int pseudo_entry;
105 enum {zone_index=ZoneIndex};
106 typedef int explicit_entry_state;
107 // default: no flag
108 typedef ::boost::mpl::vector0<> flag_list;
109 typedef ::boost::mpl::vector0<> internal_flag_list;
110 //default: no deferred events
111 typedef ::boost::mpl::vector0<> deferred_events;
112};
113
114// to be derived from. Makes a state an exit (pseudo) state. Actually an almost full-fledged state
115// template argument: event to forward
116// template argument: pointer-to-fsm policy
117template<class Event,class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
118struct exit_pseudo_state : public boost::msm::front::detail::state_base<BASE> , SMPtrPolicy
119{
120 typedef Event event;
121 typedef BASE Base;
122 typedef SMPtrPolicy PtrPolicy;
123 typedef int pseudo_exit;
124
125 // default: no flag
126 typedef ::boost::mpl::vector0<> flag_list;
127 typedef ::boost::mpl::vector0<> internal_flag_list;
128 //default: no deferred events
129 typedef ::boost::mpl::vector0<> deferred_events;
130};
131
132}}}
133
134#endif //BOOST_MSM_FRONT_STATES_H
135