proxygen
StateMachine-inl.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018-present, Facebook, Inc.
3  * All rights reserved.
4  *
5  * This source code is licensed under the BSD-style license found in the
6  * LICENSE file in the root directory of this source tree.
7  */
8 
9 namespace fizz {
10 namespace sm {
11 
12 template <typename SM, typename SM::StateEnum s1, typename SM::StateEnum s2>
14 template <typename SM, typename SM::StateEnum s>
15 struct StateSame<SM, s, s> : std::true_type {};
16 
17 template <class... Conditions>
18 struct Or : std::false_type {};
19 
20 template <class Condition, class... Conditions>
21 struct Or<Condition, Conditions...>
22  : std::conditional<Condition::value, std::true_type, Or<Conditions...>>::
23  type {};
24 
25 template <
26  typename SM,
27  typename SM::StateEnum state,
28  typename SM::Event event,
29  typename SM::StateEnum... AllowedStates>
31  protected:
32  template <typename SM::StateEnum to>
33  static void Transition(typename SM::State& stateStruct) {
34  static_assert(
35  Or<StateSame<SM, to, AllowedStates>...>::value, "Transition invalid");
36  CHECK_EQ(stateStruct.state(), state);
37  VLOG(8) << "Transition from " << toString(state) << " to " << toString(to);
38  stateStruct.state() = to;
39  }
40 };
41 
42 template <typename SM, typename SM::StateEnum state, typename SM::Event event>
43 class EventHandler : public EventHandlerBase<SM, state, event> {
44  public:
45  static typename SM::Actions handle(
46  const typename SM::State& curState,
47  typename SM::Param param) {
48  return SM::InvalidEventHandler(curState, event, std::move(param));
49  }
50 };
51 
52 #define FIZZ_DECLARE_EVENT_HANDLER(sm, statename, eventname, ...) \
53  template <> \
54  class EventHandler<sm, statename, eventname> \
55  : public EventHandlerBase<sm, statename, eventname, __VA_ARGS__> { \
56  public: \
57  static typename sm::Actions handle( \
58  const typename sm::State&, \
59  typename sm::Param param); \
60  };
61 
62 template <typename SM>
64  typename SM::StateEnum state,
65  typename SM::Event event) {
66  static constexpr auto handlers = getEventHandlers(
67  std::make_index_sequence<SM::NumStates * SM::NumEvents>());
68  const auto i = static_cast<std::size_t>(state) * SM::NumEvents +
69  static_cast<std::size_t>(event);
70  CHECK_LT(i, handlers.size()) << "Out of bounds handler requested";
71  return handlers[i];
72 }
73 
74 template <typename SM>
75 template <std::size_t i>
76 constexpr typename StateMachine<SM>::EventHandlerFun
78  return EventHandler<
79  SM,
80  static_cast<typename SM::StateEnum>(i / SM::NumEvents),
81  static_cast<typename SM::Event>(i % SM::NumEvents)>::handle;
82 }
83 } // namespace sm
84 } // namespace fizz
static void Transition(typename SM::State &stateStruct)
folly::StringPiece toString(StateEnum state)
Definition: State.cpp:16
boost::variant< ClientHello, ServerHello, EndOfEarlyData, HelloRetryRequest, EncryptedExtensions, CertificateRequest, CompressedCertificate, CertificateMsg, CertificateVerify, Finished, NewSessionTicket, KeyUpdate, Alert, Accept, Connect, AppData, AppWrite, EarlyAppWrite, WriteNewSessionTicket > Param
Definition: Params.h:90
PskType type
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
bool_constant< true > true_type
Definition: gtest-port.h:2210
State
See Core for details.
Definition: Core.h:43
std::enable_if< detail::is_chrono_conversion< Tgt, Src >::value, Tgt >::type to(const Src &value)
Definition: Conv.h:677
std::vector< Action > Actions
Definition: Actions.h:81
static EventHandlerFun getHandler(typename SM::StateEnum state, typename SM::Event event)
StateEnum
Definition: Actions.h:16
static const char *const value
Definition: Conv.cpp:50
static SM::Actions handle(const typename SM::State &curState, typename SM::Param param)
static constexpr EventHandlerFun getEventHandler()
Event
Definition: Events.h:15
static set< string > s
bool_constant< false > false_type
Definition: gtest-port.h:2209
typename SM::Actions(*)(const typename SM::State &, typename SM::Param) EventHandlerFun
Definition: StateMachine.h:18
state
Definition: http_parser.c:272