{"id":18004528,"url":"https://github.com/erikzenker/hsm","last_synced_at":"2025-05-02T22:31:04.066Z","repository":{"id":37896058,"uuid":"176371273","full_name":"erikzenker/hsm","owner":"erikzenker","description":"Finite state machine library based on the boost hana meta programming library. It follows the principles of the boost msm and boost sml libraries, but tries to reduce own complex meta programming code to a minimum.","archived":false,"fork":false,"pushed_at":"2022-12-23T09:29:56.000Z","size":1613,"stargazers_count":195,"open_issues_count":8,"forks_count":17,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-04-07T07:42:52.760Z","etag":null,"topics":["boost-hana","cpp17","finite-state-machine","metaprogramming","state-machine"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/erikzenker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/contributing.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"erikzenker"}},"created_at":"2019-03-18T21:19:26.000Z","updated_at":"2025-03-26T05:47:05.000Z","dependencies_parsed_at":"2023-01-30T18:15:44.500Z","dependency_job_id":null,"html_url":"https://github.com/erikzenker/hsm","commit_stats":null,"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erikzenker%2Fhsm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erikzenker%2Fhsm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erikzenker%2Fhsm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erikzenker%2Fhsm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/erikzenker","download_url":"https://codeload.github.com/erikzenker/hsm/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252116094,"owners_count":21697306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["boost-hana","cpp17","finite-state-machine","metaprogramming","state-machine"],"created_at":"2024-10-30T00:14:44.840Z","updated_at":"2025-05-02T22:30:59.792Z","avatar_url":"https://github.com/erikzenker.png","language":"C++","funding_links":["https://github.com/sponsors/erikzenker","https://paypal.me/erikzenker"],"categories":["State Machine","Libraries"],"sub_categories":["C++"],"readme":"# Hana State Machine (HSM)\n![Linux CI](https://github.com/erikzenker/hsm/workflows/Linux%20CI/badge.svg) ![MacOs CI](https://github.com/erikzenker/hsm/workflows/MacOs%20CI/badge.svg) ![Windows CI](https://github.com/erikzenker/hsm/workflows/Windows%20CI/badge.svg)\n\n[![codecov](https://codecov.io/gh/erikzenker/hsm/branch/master/graph/badge.svg)](https://codecov.io/gh/erikzenker/hsm) [![GitHub license](https://img.shields.io/github/license/erikzenker/hsm.svg)](https://github.com/erikzenker/hsm/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/erikzenker/hsm.svg)](https://GitHub.com/erikzenker/hsm/graphs/contributors/) [![GitHub release](https://img.shields.io/github/release/erikzenker/hsm.svg)](https://GitHub.com/erikzenker/hsm/releases/) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/erikzenker) [![Join the chat at https://gitter.im/hsm-gitter/community](https://badges.gitter.im/hsm-gitter/community.svg)](https://gitter.im/hsm-gitter/community?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n=\n\nThe **hana state machine** (hsm) is a [finite state machine](https://en.wikipedia.org/wiki/Finite-state_machine) library based on the [boost hana](https://www.boost.org/doc/libs/1_61_0/libs/hana/doc/html/index.html) meta programming library. It follows the principles of the [boost msm](https://www.boost.org/doc/libs/1_64_0/libs/msm/doc/HTML/index.html) and [boost sml](https://boost-ext.github.io/sml/index.html) libraries, but tries to reduce own complex meta programming code to a minimum.\n\nThe following table compares features among popular c++ state machine libraries.\nA click on a particular feature check mark will forward to the feature documentation.\n\n \u003ctable style=\"width:100%\"\u003e\n  \u003ctr\u003e\n    \u003cth\u003eFeature\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://github.com/erikzenker/hsm\"\u003eHsm\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://boost-ext.github.io/sml/index.html\"\u003eSml\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/index.html\"\u003eMsm\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/index.html\"\u003eStatechart\u003c/a\u003e\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eExternal transition\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/basic_transitions.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/examples.html#transitions\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e358\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/uml_mapping.html#Transition\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eAnonymous transition (Completion)\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/anonymous_transition.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/examples.html#transitions\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e713\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eInternal transition\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/internal_transition.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/examples.html#transitions\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e740\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/uml_mapping.html#InternalTransition\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eDirect transition\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/direct_transition.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e875\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eGuards / actions\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/guards_actions.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/guards_actions.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e358\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/uml_mapping.html#Reactions\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eEntry / exit actions\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/entry_exit_actions.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/examples.html#transitions\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e406\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/uml_mapping.html#Actions\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e  \n  \u003ctr\u003e\n    \u003ctd\u003eOrthogonal regions\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/orthogonal_regions.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/examples.html#orthogonal-regions\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e577\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/tutorial.html#OrthogonalStates\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e \n  \u003ctr\u003e\n    \u003ctd\u003eHierachies / sub state machines\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/basic_transitions.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/examples.html#composite\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e529\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/tutorial.html#BasicTopicsAStopWatch\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eEvent defering\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/defer_events.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/examples.html#deferprocess\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/tutorial.html#DeferringEvents\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/tutorial.html#DeferringEvents\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e  \n  \u003ctr\u003e\n    \u003ctd\u003eTransition logging\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/transition_logging.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/examples.html#logging\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✓\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e?\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eInitial pseudo state\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/basic_transitions.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/uml_vs_sml.html\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e471\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/tutorial.html#DefiningStatesAndEvents\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eHistory pseudo state\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/history_pseudo_state.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/examples.html#history\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e668\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/tutorial.html#History\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eeUml postfix frontend\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/transition_postfix_dsl.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/uml_vs_sml.html\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s04.html\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eeUml prefix frontend\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/transition_prefix_dsl.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/uml_vs_sml.html\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s04.html\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eEntry / exit pseudo state\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/entry_exit_pseudo_states.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e875\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eState data members\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/state_data_members.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://github.com/boost-ext/sml/blob/master/example/data.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✓\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/tutorial.html#StateLocalStorage\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eUnexpected event / no transition handler\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/unexpected_event_handler.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/ch03s02.html#d0e471\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eDependency injection\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/dependency_injection.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://boost-ext.github.io/sml/examples.html#dependency-injection\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eSingle amalgamation header\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"include/hsm/gen/hsm.h\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://raw.githubusercontent.com/boost-ext/sml/master/include/boost/sml.hpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eCustom target state construction\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/custom_targets.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e✗\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eChain actions\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"test/integration/chain_actions.cpp\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://github.com/boost-ext/sml/blob/master/example/actions_guards.cpp\"\u003e✓\u003c/a\u003e\u003ccenter\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_63_0/libs/msm/doc/HTML/ch03s02.html\"\u003e✓\u003c/a\u003e\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e?\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e \n\n## Example ([Run](https://godbolt.org/z/1YYc9fo8a))\n```c++\n#include \"hsm/hsm.h\"\n\n#include \u003ciostream\u003e\n#include \u003ccassert\u003e\n\n// States\nstruct Locked {\n};\nstruct Unlocked {\n};\n\n// Events\nstruct Push {\n};\nstruct Coin {\n};\n\n// Guards\nconst auto noError = [](auto /*event*/, auto /*source*/, auto /*target*/) { return true; };\n\n// Actions\nconstexpr auto beep\n    = [](auto /*event*/, auto /*source*/, auto /*target*/) { std::cout \u003c\u003c \"beep!\" \u003c\u003c std::endl; };\nconstexpr auto blink = [](auto /*event*/, auto /*source*/, auto /*target*/) {\n    std::cout \u003c\u003c \"blink, blink, blink!\" \u003c\u003c std::endl;\n};\n\nstruct Turnstile {\n    static constexpr auto make_transition_table()\n    {\n        // clang-format off\n        return hsm::transition_table(\n            // Source              + Event            [Guard]   / Action = Target\n            // +-------------------+-----------------+---------+--------+----------------------+\n            * hsm::state\u003cLocked\u003e   + hsm::event\u003cPush\u003e           / beep   = hsm::state\u003cLocked\u003e  ,\n              hsm::state\u003cLocked\u003e   + hsm::event\u003cCoin\u003e [noError] / blink  = hsm::state\u003cUnlocked\u003e,\n            // +--------------------+---------------------+---------+--------+------------------------+\n              hsm::state\u003cUnlocked\u003e + hsm::event\u003cPush\u003e [noError]          = hsm::state\u003cLocked\u003e  ,\n              hsm::state\u003cUnlocked\u003e + hsm::event\u003cCoin\u003e           / blink  = hsm::state\u003cUnlocked\u003e\n            // +--------------------+---------------------+---------+--------+------------------------+                        \n            );\n        // clang-format on\n    }\n};\n\nauto main() -\u003e int\n{\n    hsm::sm\u003cTurnstile\u003e turnstileSm;\n\n    // The turnstile is initially locked\n    assert(turnstileSm.is(hsm::state\u003cLocked\u003e));\n\n    // Inserting a coin unlocks it\n    turnstileSm.process_event(Coin {});\n    assert(turnstileSm.is(hsm::state\u003cUnlocked\u003e));\n\n    // Entering the turnstile will lock it again\n    turnstileSm.process_event(Push {});\n    assert(turnstileSm.is(hsm::state\u003cLocked\u003e));\n\n    return 0;\n}\n```\n\n## Play with it Online\n* Follow the link to the compiler explorer: [https://godbolt.org/z/r9sTrMfqE](https://godbolt.org/z/r9sTrMfqE)\n\n\n## Runtime Benchmark Results\n\nThe benchmark result are taken from the [state machine benchmark repository](https://github.com/erikzenker/state-machine-benchmark).\n\n \u003ctable style=\"width:100%\"\u003e\n  \u003ctr\u003e\n    \u003cth\u003eBenchmark\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://github.com/erikzenker/hsm\"\u003eHsm\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://boost-experimental.github.io/sml/index.html\"\u003eSml\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/index.html\"\u003eMsm\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/index.html\"\u003eStatechart\u003c/a\u003e\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"benchmark/simple/\"\u003eSimple state machine\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e99 ms\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e17 ms\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e18 ms\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e443 ms\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"benchmark/complex/\"\u003eComplex state machine\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e818 ms\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e978 ms\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e881 ms\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e1374 ms\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e \n\n## Compiletime Benchmark Results\n\n \u003ctable style=\"width:100%\"\u003e\n  \u003ctr\u003e\n    \u003cth\u003eBenchmark\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://github.com/erikzenker/hsm\"\u003eHsm\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://boost-experimental.github.io/sml/index.html\"\u003eSml\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/index.html\"\u003eMsm\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/index.html\"\u003eStatechart\u003c/a\u003e\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"benchmark/simple/\"\u003eSimple state machine\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e6.41 s\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e0.62 s\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e5.17 s \u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e1.52 s\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"benchmark/complex/\"\u003eComplex state machine\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e41.99 s\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e3.01 s\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e25.54 s\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e4.27 s\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Compilememory Benchmark Results\n\n \u003ctable style=\"width:100%\"\u003e\n  \u003ctr\u003e\n    \u003cth\u003eBenchmark\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://github.com/erikzenker/hsm\"\u003eHsm\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://boost-experimental.github.io/sml/index.html\"\u003eSml\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/msm/doc/HTML/index.html\"\u003eMsm\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://www.boost.org/doc/libs/1_73_0/libs/statechart/doc/index.html\"\u003eStatechart\u003c/a\u003e\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"benchmark/simple/\"\u003eSimple state machine\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e174.649 MB\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e28.474 MB\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e404.621 MB\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e70.976 MB\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"benchmark/complex/\"\u003eComplex state machine\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e815.720 MB\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e188.333 MB\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e1323.477 MB\u003c/center\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccenter\u003e122.720 MB\u003c/center\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Dependencies\n* Boost 1.72\n* C++17\n* \\\u003e= g++-8\n* \\\u003e= clang-8\n* Cmake 3.14\n\n## Dev Dependencies\n* Gtest\n\n## Integration\n### Usage as Single Header\n* Download [amalgamation header](https://raw.githubusercontent.com/erikzenker/hsm/master/include/hsm/gen/hsm.h) and put it into your project src folder\n* Include amalgamation header:\n  ```c++\n  #include \"path/to/amalgamation/header/hsm.h\"\n  ```\n\n### CMake\nTo use this library from a CMake project, you can locate it directly with find_package() and use the namespaced imported target from the generated package configuration:\n\n```cmake\n# CMakeLists.txt\nfind_package(hsm 1.3.5 REQUIRED)\n...\nadd_library(foo ...)\n...\ntarget_link_libraries(foo PRIVATE hsm::hsm)\n```\n\nSince CMake v3.11, [FetchContent](https://cmake.org/cmake/help/v3.11/module/FetchContent.html) can be used to automatically download the repository as a dependency at configure time. You can follow this [example](integration/fetch_content) and \nimplement the following snippet:\n\n```cmake\ninclude(FetchContent)\n\nFetchContent_Declare(hsm\n  GIT_REPOSITORY https://github.com/erikzenker/hsm.git\n  GIT_TAG v1.4.7)\n\nFetchContent_GetProperties(hsm)\nif(NOT hsm_POPULATED)\n  FetchContent_Populate(hsm)\n  add_subdirectory(${hsm_SOURCE_DIR} ${hsm_BINARY_DIR} EXCLUDE_FROM_ALL)\nendif()\n\ntarget_link_libraries(foo PRIVATE hsm::hsm)\n```\n\nIf you are using [CPM.cmake](https://github.com/cpm-cmake/CPM.cmake), you can follow this [example](integration/cpm). Implement the following snippet:\n\n```cmake\ninclude(cmake/CPM.cmake)\n\nCPMAddPackage(\n    NAME hsm\n    GITHUB_REPOSITORY erikzenker/hsm\n    VERSION 1.4.7)\n\ntarget_link_libraries(foo PRIVATE hsm::hsm)\n```\n\n### Package Managers\n\nIf you are using [Conan](https://conan.io/) to manage your dependencies, merely add hsm/x.y.z to your `conanfile`'s requires, where `x.y.z` is the release version you want to use. Please file issues here if you experience problems with the packages.\n\n## Install \n\n### CMake\n``` bash\ncmake -S . -B build\ncmake --install build/ --prefix /tmp/\n```\n\n### Conan/Cmake\n``` bash\nmkdir -p build/dependencies/conan\nconan install . -if build/dependencies/conan -s compiler.libcxx=libstdc++11 --build missing\ncmake -S . -B build -DCMAKE_BUILD_TYPE=Release -D \"CMAKE_PREFIX_PATH=${PWD}/build/dependencies/conan\"\ncmake --install build/ --prefix /tmp/\n```\n### Conan [![Download](https://api.bintray.com/packages/erikzenker/conan-erikzenker/hsm%3Aerikzenker/images/download.svg) ](https://bintray.com/erikzenker/conan-erikzenker/hsm%3Aerikzenker/_latestVersion)\n``` bash\nconan remote add conan-erikzenker https://api.bintray.com/conan/erikzenker/conan-erikzenker\nconan install hsm/1.0@erikzenker/testing --build missing\n```\n\n### Install from Arch Linux AUR\n``` bash\npacaur -S hsm-git\n```\n\n## Compile and Run the Tests Using the Installed Library\n``` bash\ncmake -S test -B build\ncmake --build build/test\ncd build/test\nctest --output-on-failure\n```\n\n## Compile and Run the Tests Using Conan\n``` bash\nmkdir -p build/dependencies/conan\nconan install . -if build/dependencies/conan -s compiler.libcxx=libstdc++11 --build missing\ncmake -S test/ -B build/test -DCMAKE_BUILD_TYPE=Release -D \"CMAKE_PREFIX_PATH=${PWD}/build/dependencies/conan\"\ncmake --build build/test/\ncd build/test\nctest --output-on-failure\n```\n\n## Author\n* erikzenker(at)hotmail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferikzenker%2Fhsm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ferikzenker%2Fhsm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferikzenker%2Fhsm/lists"}