File: SimpleKleene.cpp

package info (click to toggle)
boost1.90 1.90.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 593,168 kB
  • sloc: cpp: 4,190,642; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,776; makefile: 1,162; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (107 lines) | stat: -rw-r--r-- 2,953 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright 2025 Christian Granzin
// Copyright 2010 Christophe Henry
// henry UNDERSCORE christophe AT hotmail DOT com
// This is an extended version of the state machine available in the boost::mpl library
// Distributed under the same license as the original.
// Copyright for the original version:
// Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed
// under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

// back-end
#include "BackCommon.hpp"
// front-end
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>

#ifndef BOOST_MSM_NONSTANDALONE_TEST
#define BOOST_TEST_MODULE simple_kleene_test
#endif
#include <boost/test/unit_test.hpp>

namespace msm = boost::msm;
namespace front = msm::front;
using front::Row;
using front::state_machine_def;
namespace mp11 = boost::mp11;

namespace {

template <bool Value>
struct Guard
{
    template <typename Event, typename Fsm, typename SourceState, typename TargetState>
    bool operator()(const Event&, Fsm&, SourceState&, TargetState&)
    {
        return Value;
    }
};

template <int E>
struct Event {};

template <int I>
struct Action
{
    template <typename Event, typename Fsm, typename SourceState, typename TargetState>
    void operator()(const Event&, Fsm&, SourceState&, TargetState&)
    {
        return;
    }
};

template <int I>
struct State : front::state<>
{
    template <class Event,class Fsm>
    void on_entry(Event const&, Fsm&)
    {
        active = true;
    }

    template <class Event,class Fsm>
    void on_exit(Event const&, Fsm&)
    {
        active = false;
    }

    static constexpr int value = I;

    bool active = false;
};

struct Simple_ : front::state_machine_def<Simple_> 
{
    using transition_table = mp11::mp_list<
        Row<State<0>, Event<0>, State<1>, Action<0>, Guard<false>>,
        Row<State<0>, boost::any, State<1>, Action<1>, Guard<true>>
    >;

    using initial_state = State<0>;
};

// Pick a back-end
using Fsms = mp11::mp_list<
#ifndef BOOST_MSM_TEST_SKIP_BACKMP11
    msm::backmp11::state_machine_adapter<Simple_>,
#endif // BOOST_MSM_TEST_SKIP_BACKMP11
    msm::back::state_machine<Simple_>
    // back11 requires a const boost::any overload to identify the Kleene event.
    // Leave it out of this test to ensure backwards compatibility.
    // msm::back11::state_machine<Front>
    >;

BOOST_AUTO_TEST_CASE_TEMPLATE(simple_kleene_test, Fsm, Fsms)
{     
    Fsm fsm;

    fsm.start();
    BOOST_CHECK_MESSAGE(fsm.template get_state<State<0>&>().active == true, "State<0> entry not called correctly");

    fsm.process_event(Event<0>{});
    BOOST_CHECK_MESSAGE(fsm.template get_state<State<0>&>().active == false, "State<0> exit not called correctly");
    BOOST_CHECK_MESSAGE(fsm.template get_state<State<1>&>().active == true, "State<1> entry not called correctly");
}

} // namespace