Comments (2)
Just wrap ur calls. See:
#include <boost/sml.hpp>
#include <cassert>
#include <iostream>
namespace sml = boost::sml;
namespace {
struct printf_logger
{
template <class SM, class TEvent>
void log_process_event(const TEvent&)
{
std::printf("[%s][event] %s\n", sml::aux::get_type_name<SM>(), sml::aux::get_type_name<TEvent>());
}
template <class SM, class TGuard, class TEvent>
void log_guard(const TGuard&, const TEvent&, bool result)
{
std::printf("[%s][guard] %s(%s): %s\n", sml::aux::get_type_name<SM>(), sml::aux::get_type_name<TGuard>(),
sml::aux::get_type_name<TEvent>(), (result ? "accept" : "reject"));
}
template <class SM, class TAction, class TEvent>
void log_action(const TAction&, const TEvent&)
{
std::printf("[%s][action] %s(%s)\n", sml::aux::get_type_name<SM>(), sml::aux::get_type_name<TAction>(),
sml::aux::get_type_name<TEvent>());
}
template <class SM, class TSrcState, class TDstState>
void log_state_change(const TSrcState& src, const TDstState& dst)
{
std::printf("[%s][transition] %s -> %s\n", sml::aux::get_type_name<SM>(), src.c_str(), dst.c_str());
}
};
struct connect {
int id{};
};
struct disconnect {};
struct interrupt {};
struct Disconnected {};
struct Connected {
int id{}; /// per state data
};
struct Interrupted {
int id{}; /// per state data
};
class data {
using Self = data;
public:
explicit data(const std::string& address) : address{address} {}
auto operator()() {
using namespace boost::sml;
const auto set = [](const auto& event, Connected& state) { state.id = event.id; };
const auto update = [](Connected& src_state, Interrupted& dst_state) { dst_state.id = src_state.id; };
// clang-format off
return make_transition_table(
* state<Disconnected> + event<connect> / (set, wrap(&Self::print)) = state<Connected>
, state<Connected> + event<interrupt> / (update, wrap(&Self::print)) = state<Interrupted>
, state<Interrupted> + event<connect> / (set, wrap(&Self::print)) = state<Connected>
, state<Connected> + event<disconnect> / (wrap(&Self::print)) = X
);
// clang-format on
}
private:
void print(Connected& state) { std::cout << address << ':' << state.id << '\n'; };
std::string address{}; /// shared data between states
};
} // namespace
printf_logger logger;
int main() {
data d{std::string{"127.0.0.1"}};
sml::sm<data, sml::logger<printf_logger>> sm{d, Connected{1}, logger};
sm.process_event(connect{1024});
sm.process_event(interrupt{});
sm.process_event(connect{1025});
sm.process_event(disconnect{});
assert(sm.is(sml::X));
}
This prints:
[{anonymous}::data][event] boost::ext::sml::v1_1_6::back::on_entry<boost::ext::sml::v1_1_6::back::_, boost::ext::sml::v1_1_6::back::initial>
[{anonymous}::data][event] {anonymous}::connect
[{anonymous}::data][transition] {anonymous}::Disconnected -> {anonymous}::Connected
[{anonymous}::data][action] {anonymous}::data::operator()()::<lambda(const auto:14&, {anonymous}::Connected&)>({anonymous}::connect)
[{anonymous}::data][action] zero_wrapper<void ({anonymous}::data::*)({anonymous}::Connected&), void ({anonymous}::data::*)({anonymous}::Connected&)>({anonymous}::connect)
127.0.0.1:1024
[{anonymous}::data][event] {anonymous}::interrupt
[{anonymous}::data][transition] {anonymous}::Connected -> {anonymous}::Interrupted
[{anonymous}::data][action] {anonymous}::data::operator()()::<lambda({anonymous}::Connected&, {anonymous}::Interrupted&)>({anonymous}::interrupt)
[{anonymous}::data][action] zero_wrapper<void ({anonymous}::data::*)({anonymous}::Connected&), void ({anonymous}::data::*)({anonymous}::Connected&)>({anonymous}::interrupt)
127.0.0.1:1024
[{anonymous}::data][event] {anonymous}::connect
[{anonymous}::data][transition] {anonymous}::Interrupted -> {anonymous}::Connected
[{anonymous}::data][action] {anonymous}::data::operator()()::<lambda(const auto:14&, {anonymous}::Connected&)>({anonymous}::connect)
[{anonymous}::data][action] zero_wrapper<void ({anonymous}::data::*)({anonymous}::Connected&), void ({anonymous}::data::*)({anonymous}::Connected&)>({anonymous}::connect)
127.0.0.1:1025
[{anonymous}::data][event] {anonymous}::disconnect
[{anonymous}::data][transition] {anonymous}::Connected -> terminate
[{anonymous}::data][action] zero_wrapper<void ({anonymous}::data::*)({anonymous}::Connected&), void ({anonymous}::data::*)({anonymous}::Connected&)>({anonymous}::disconnect)
127.0.0.1:1025
from sml.
Great. Thanks!
from sml.
Related Issues (20)
- How to achieve shallow history behavior? HOT 1
- dependency injection through process_event() to save sm memory footprint HOT 2
- [Question] Can you know upfront if an event can be processed?
- What's the actual point of this all? HOT 9
- sm.is("state"_s) suddenly doesn't compile anymore HOT 5
- How to store a "dispatch table" in a class? HOT 1
- sml::aux::get_type_name<TAction>() not returning name of lambda function HOT 2
- Compilation error when using logger, process_queue and member function action HOT 1
- how to know weather state is a sub-state machine or a normal state HOT 1
- How to make a state transition that changes to the next state upon completion of its action?
- Question: Debugging in STM32CubeIDE
- copy of class containing transition table is made when boost::sml::sm is instantiated HOT 1
- [Documentation] Who is using it HOT 2
- can not work with CLion HOT 1
- deferred event not processed when in any orthogonal region other than first
- gcc 10.5 warning: array subscript is outside array bounds HOT 4
- SML version change caused static assert fail in state machine constructor HOT 4
- Adding boost-ext-sml to conan-center-index HOT 2
- Anonymous event HOT 1
- Hello World error HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from sml.