C++库用户手册

Step 1. 下载仓库,将仓库中的src_cpp/SMLite/SMLite.hpp文件拷贝进自己的解决方案项目,并引用

#include "SMLite.hpp"

Step 2. 定义两个强枚举类,分别代表所有的状态与所有的触发器

enum class MyState { Rest, Ready, Reading, Writing };
enum class MyTrigger { Run, Close, Read, FinishRead, Write, FinishWrite };

Step 3. 定义状态机生成器,模板为两个强枚举类

Fawdlstty::SMLiteBuilder<MyState, MyTrigger> _smb {};

Step 4. 定义状态机的规则,指定具体的某个状态允许触发什么事件

// 如果当状态机的当前状态是 MyState::Rest
_smb.Configure (MyState::Rest)

    // 如果状态由其他状态变成 MyState::Rest 状态,那么触发此方法,初始化状态机时指定的初始值不触发此方法
    ->OnEntry ([] () { std::cout << "entry Rest\n"; })

    // 如果状态由 MyState::Rest 状态变成其他状态,那么触发此方法
    ->OnLeave ([] () { std::cout << "leave Rest\n"; })

    // 如果触发 MyTrigger::Run,则将状态改为 MyState::Ready
    ->WhenChangeTo (MyTrigger::Run, MyState::Ready)

    // 如果触发 MyTrigger::Close,忽略
    ->WhenIgnore (MyTrigger::Close)

    // 如果触发 MyTrigger::Read,则调用回调函数,并将状态调整为返回值
    ->WhenFunc (MyTrigger::Read, std::function ([] (MyState _state, MyTrigger _trigger) -> MyState {
    std::cout << "call WhenFunc callback\n";
        return MyState::Ready;
    }))

    // 如果触发 MyTrigger::FinishRead,则调用回调函数,并将状态调整为返回值
    // 需注意,触发时候需传入参数,数量与类型必须完全匹配,否则抛异常
    ->WhenFunc (MyTrigger::FinishRead, std::function ([] (MyState _state, MyTrigger _trigger, std::string _param) -> MyState {
        std::cout << "call WhenFunc callback with param [" << _param << "]\n";
        return MyState::Ready;
    }))

    // 如果触发 MyTrigger::Write,则调用回调函数(触发此方法回调不调整返回值)
    ->WhenAction (MyTrigger::Write, std::function ([] (MyState _state, MyTrigger _trigger) {
        std::cout << "call WhenAction callback\n";
    }))

    // 如果触发 MyTrigger::FinishWrite,则调用回调函数(触发此方法回调不调整返回值)
    // 需注意,触发时候需传入参数,数量与类型必须完全匹配,否则抛异常
    ->WhenAction (MyTrigger::FinishWrite, std::function ([] (MyState _state, MyTrigger _trigger, std::string _param) {
        std::cout << "call WhenAction callback with param [" << _param << "]\n";
    }));

同一个状态下,如果遇到同样的触发器,最多只允许定义一种处理方式,上面代码对定义的触发事件有详细解释。如果不定义触发事件但遇到触发,那么抛异常。

Step 5. 下面开始真正使用到状态机

// 生成状态机
auto _sm = _smb.Build (MyState::Rest);

// 获取当前状态
assert (_sm->GetState () == MyState::Rest);

// 判断是否允许触发某一个事件
_sm->AllowTriggering (MyTrigger::Run);

// 触发一个事件
_sm->Triggering (MyTrigger::Run);

// 触发一个事件,并传入指定参数
_sm->Triggering (MyTrigger::Run, std::string ("hello"));

// 强行修改当前状态,此操作将不会触发OnEntry、OnLeave事件
_sm->SetState (MyState::Ready);

results matching ""

    No results matching ""