Your scalable C++14 one header only State Machine Library with no dependencies (Try it online!)
  
  Let's release a TCP connection!
  
[Boost].SML requires only one file. Get the latest header here!
#include <boost/sml.hpp>
namespace sml = boost::sml;struct sender {
  template<class TMsg>
  constexpr void send(const TMsg& msg) { std::printf("send: %d\n", msg.id); }
};struct ack { bool valid{}; };
struct fin { int id{}; bool valid{}; };
struct release {};
struct timeout {};constexpr auto is_valid = [](const auto& event) { return event.valid; };constexpr auto send_fin = [](sender& s) { s.send(fin{0}); };
constexpr auto send_ack = [](const auto& event, sender& s) { s.send(event); };struct tcp_release final {
  auto operator()() const {
    using namespace sml;
    /**
     * Initial state: *initial_state
     * Transition DSL: src_state + event [ guard ] / action = dst_state
     */
    return make_transition_table(
      *"established"_s + event<release>          / send_fin  = "fin wait 1"_s,
       "fin wait 1"_s  + event<ack> [ is_valid ]             = "fin wait 2"_s,
       "fin wait 2"_s  + event<fin> [ is_valid ] / send_ack  = "timed wait"_s,
       "timed wait"_s  + event<timeout>                      = X
    );
  }
};int main() {
  using namespace sml;
  sender s{};
  sm<tcp_release> sm{s}; // pass dependencies via ctor
  assert(sm.is("established"_s));
  sm.process_event(release{}); // complexity O(1)
  assert(sm.is("fin wait 1"_s));
  sm.process_event(ack{true}); // prints 'send: 0'
  assert(sm.is("fin wait 2"_s));
  sm.process_event(fin{42, true}); // prints 'send: 42'
  assert(sm.is("timed wait"_s));
  sm.process_event(timeout{});
  assert(sm.is(X));  // terminated
}MSVC-2015 (Example)
- use 
state<class state_name>instead of"state_name"_s - expliclty state a lambda's result type 
auto action = [] -> void {} 
- GCC/Clang
$CXX -std=c++14 -O2 -fno-exceptions -Wall -Wextra -Werror -pedantic -pedantic-errors tcp_release.cpp - MSVC
cl /std:c++14 /Ox /W3 tcp_release.cpp
 
| tcp_release.cpp | Clang-3.8 | GCC-6.3 | MSVC-2015 | 
|---|---|---|---|
| Compilation Time | 0.102s | 0.118s | 0.296s | 
| Binary size (stripped) | 6.2kb | 6.2kb | 105kb | 
| ASM x86-64 -  https://godbolt.org/z/y99L50  | 
    
       | 
  ||
send: 0
send: 42| Enum/Switch | Variant | [Boost].SML - 1.1.0 | Boost-1.65.MSM-eUML | Boost-1.65.Statechart | |
|---|---|---|---|---|---|
| Compilation time | 0.132s | 15.321s | 0.582s | 1m15.935s | 5.671s | 
| Execution time | 679ms | 827ms | 622ms | 664ms | 2282ms | 
| Memory usage | 1b | 2b/8b | 1b | 120b | 224b | 
| Executable size | 15K | 187K | 34K | 611K | 211K | 
- Introduction
 - Overview
 - Features/Benchmarks
 - Tutorial/Workshop
 - UML vs SML
 - User Guide
 - Examples
 - FAQ
 - CHANGELOG
 
Disclaimer Boost.SML is not an official Boost library.
