当前位置: 首页 > news >正文

状态机之tinyfsm

简介

tinyfsm实现了简单的状态机功能,只有一个头文件。采用了CRTP技术

结构

状态和状态机合二为一

Fsm<State>
State
Event

State:继承Fsm<State>,其需要包含entry,exit和react方法
Fsm<State>:包含了状态过渡方法(无动作的,有动作的,带有条件动作的)

源码

/** TinyFSM - Tiny Finite State Machine Processor** Copyright (c) 2012-2022 Axel Burri** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated documentation files (the "Software"), to deal* in the Software without restriction, including without limitation the rights* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell* copies of the Software, and to permit persons to whom the Software is* furnished to do so, subject to the following conditions:** The above copyright notice and this permission notice shall be included in* all copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN* THE SOFTWARE.*//* ---------------------------------------------------------------------* Version: 0.3.3** API documentation: see "../doc/50-API.md"** The official TinyFSM website is located at:* https://digint.ch/tinyfsm/** Author:* Axel Burri <axel@tty0.ch>* ---------------------------------------------------------------------*/#ifndef TINYFSM_HPP_INCLUDED
#define TINYFSM_HPP_INCLUDED#ifndef TINYFSM_NOSTDLIB
#include <type_traits>
#endif// #include <iostream>
// #define DBG(str) do { std::cerr << str << std::endl; } while( false )
// DBG("*** dbg_example *** " << __PRETTY_FUNCTION__);namespace tinyfsm
{// --------------------------------------------------------------------------struct Event { };// --------------------------------------------------------------------------#ifdef TINYFSM_NOSTDLIB// remove dependency on standard library (silent fail!).// useful in conjunction with -nostdlib option, e.g. if your compiler// does not provide a standard library.// NOTE: this silently disables all static_assert() calls below!template<typename F, typename S>struct is_same_fsm { static constexpr bool value = true; };
#else// check if both fsm and state class share same fsmtypetemplate<typename F, typename S>struct is_same_fsm : std::is_same< typename F::fsmtype, typename S::fsmtype > { };
#endiftemplate<typename S>struct _state_instance{using value_type = S;using type = _state_instance<S>;static S value;};template<typename S>typename _state_instance<S>::value_type _state_instance<S>::value;// --------------------------------------------------------------------------template<typename F>class Fsm{public:using fsmtype = Fsm<F>;using state_ptr_t = F *;static state_ptr_t current_state_ptr;// public, leaving ability to access state instance (e.g. on reset)template<typename S>static constexpr S & state(void) {static_assert(is_same_fsm<F, S>::value, "accessing state of different state machine");return _state_instance<S>::value;}template<typename S>static constexpr bool is_in_state(void) {static_assert(is_same_fsm<F, S>::value, "accessing state of different state machine");return current_state_ptr == &_state_instance<S>::value;}/// state machine functionspublic:// explicitely specialized in FSM_INITIAL_STATE macrostatic void set_initial_state();static void reset() { };static void enter() {current_state_ptr->entry();}static void start() {set_initial_state();enter();}template<typename E>static void dispatch(E const & event) {current_state_ptr->react(event);}/// state transition functionsprotected:template<typename S>void transit(void) {static_assert(is_same_fsm<F, S>::value, "transit to different state machine");current_state_ptr->exit();current_state_ptr = &_state_instance<S>::value;current_state_ptr->entry();}template<typename S, typename ActionFunction>void transit(ActionFunction action_function) {static_assert(is_same_fsm<F, S>::value, "transit to different state machine");current_state_ptr->exit();// NOTE: do not send events in action_function definisions.action_function();current_state_ptr = &_state_instance<S>::value;current_state_ptr->entry();}template<typename S, typename ActionFunction, typename ConditionFunction>void transit(ActionFunction action_function, ConditionFunction condition_function) {if(condition_function()) {transit<S>(action_function);}}};template<typename F>typename Fsm<F>::state_ptr_t Fsm<F>::current_state_ptr;// --------------------------------------------------------------------------template<typename... FF>struct FsmList;template<> struct FsmList<> {static void set_initial_state() { }static void reset() { }static void enter() { }template<typename E>static void dispatch(E const &) { }};template<typename F, typename... FF>struct FsmList<F, FF...>{using fsmtype = Fsm<F>;static void set_initial_state() {fsmtype::set_initial_state();FsmList<FF...>::set_initial_state();}static void reset() {F::reset();FsmList<FF...>::reset();}static void enter() {fsmtype::enter();FsmList<FF...>::enter();}static void start() {set_initial_state();enter();}template<typename E>static void dispatch(E const & event) {fsmtype::template dispatch<E>(event);FsmList<FF...>::template dispatch<E>(event);}};// --------------------------------------------------------------------------template<typename... SS> struct StateList;template<> struct StateList<> {static void reset() { }};template<typename S, typename... SS>struct StateList<S, SS...>{static void reset() {_state_instance<S>::value = S();StateList<SS...>::reset();}};// --------------------------------------------------------------------------template<typename F>struct MooreMachine : tinyfsm::Fsm<F>{virtual void entry(void) { };  /* entry actions in some states */void exit(void) { };           /* no exit actions */};template<typename F>struct MealyMachine : tinyfsm::Fsm<F>{// input actions are modeled in react():// - conditional dependent of event type or payload// - transit<>(ActionFunction)void entry(void) { };  /* no entry actions */void exit(void) { };   /* no exit actions */};} /* namespace tinyfsm */#define FSM_INITIAL_STATE(_FSM, _STATE)                               \
namespace tinyfsm {                                                   \template<> void Fsm< _FSM >::set_initial_state(void) {              \current_state_ptr = &_state_instance< _STATE >::value;            \}                                                                   \
}#endif /* TINYFSM_HPP_INCLUDED */
http://www.dtcms.com/a/521538.html

相关文章:

  • Spring中@Configuration注解的proxyBeanMethods属性详解
  • RSI超买信号与仓位递减结合的ETF止盈策略实现与验证
  • 浙江企业网站建设上海cms建站系统
  • 太原做app网站建设上海网站建设seo公司哪家好
  • windows 安装 nginx
  • 十六、Linux网络配置
  • wordpress多站点支付插件企业网页建设公司咨询电话
  • Linux安装nvm教程(脚本与解压缩两种方式)
  • 无锡网站制作哪家便宜遵义网站建设制作公司
  • 制作网站流程湖南易图科技发展有限公司
  • 1.1、开篇:AI如何重塑网络安全攻防格局?
  • 福州 哈尔滨网站建设 网络服务连云港市网站建设
  • 电商智能客服机器人:客服的服务革新之路
  • 网站建设及推广方案桂林两江四湖象山景区简介
  • (3)Kafka生产者分区策略、ISR、ACK、一致性语义
  • 做盗链网站上国外网站用什么dns
  • 平面设计创意网站建设嵌入式软件开发招聘
  • TraceId如何在Spring-Cloud微服务的REST调用中传递
  • 网站关键词符号怎么样提高网站点击率
  • 【经典书籍】《编写可读代码的艺术》精华
  • 网站推广专业术语代表性设计制作作品图片
  • 小游戏网站欣赏wordpress 在线报名系统
  • 传奇手游大型网站seo计费怎么刷关键词的
  • 启东网站建设什么是网络营销竞争的利器之一
  • 网站申请微信登录wordpress双站 中英文
  • 2510rs,rust,1.87
  • 阮一峰《TypeScript 教程》学习笔记——类
  • 建设网站的企业费用金融行业做网站需要什么
  • 拌合楼软件开发(33)多品牌车牌识别摄像头引入
  • 使用postman玩转接口测试