⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 state.h

📁 MARS加密解密
💻 H
字号:
// State.h: interface for the CState class.
//
//	本程序是《疯狂的火星虫—面向对象状态机实践指南》的演示程序
//
//	版权所有 (C) 2004 王咏武
//	http://www.contextfree.net/wangyw/
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_STATE_H__14FA61D4_5DB9_4683_9895_336EC8BF24D2__INCLUDED_)
#define AFX_STATE_H__14FA61D4_5DB9_4683_9895_336EC8BF24D2__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifdef ON_EVENT
#undef ON_EVENT
#endif

#ifndef NULL
#define NULL    0
#endif

typedef unsigned char   BYTE;
typedef unsigned short  WORD;
typedef unsigned long   DWORD;

#define STATE_CLASS_NAME(state_name)                                            \
    CFSM_STATE_CLASS_##state_name

#define DEFINE_STATE_CLASS(state_name)                                          \
    class STATE_CLASS_NAME(state_name) : public CState                          \
    {                                                                           \
    public:                                                                     \
        STATE_CLASS_NAME(state_name)(CFSM * pFSM, const char * lpName,          \
            const char * lpParent) : CState(pFSM, lpName, lpParent) {}          \
                                                                                \
        bool OnEvent(CFSM * pFSM, WORD wEvent, WORD wPAram, DWORD lParam);      \
    };

#define INIT_ROOT_STATE(state_name)                                             \
    m_States.empty();                                                           \
    m_States.push_back(new STATE_CLASS_NAME(state_name)(this,                   \
                                                        #state_name, NULL));

#define INIT_STATE(parent_state, state_name)                                    \
    m_States.push_back(new STATE_CLASS_NAME(state_name)(this, #state_name,      \
                                                        #parent_state));

#define BEGIN_STATE_TRANSITION(state_name)                                      \
    bool STATE_CLASS_NAME(state_name)::OnEvent(CFSM * pFSM, WORD wEvent,        \
                                               WORD wParam, DWORD lParam)       \
    {                                                                           \
        CLASS_NAME * pClass = dynamic_cast<CLASS_NAME *>(pFSM);

#define ON_ENTRY(action_name)                                                   \
        if (wEvent == EVENT_ENTRY)                                              \
            return pClass->action_name(wParam, lParam);

#define ON_EXIT(action_name)                                                    \
        if (wEvent == EVENT_EXIT)                                               \
            return pClass->action_name(wParam, lParam);

#define ON_EVENT_TRANSITION(event, guard_name, action_name, target_state)       \
        if (wEvent == event)                                                    \
            if (pClass->guard_name(wParam, lParam))                             \
            {                                                                   \
                bool ret = pClass->action_name(wParam, lParam);                 \
                pClass->TransitTo(#target_state);                               \
                return ret;                                                     \
            }

#define ON_EVENT_INTERNAL(event, guard_name, action_name)                       \
        if (wEvent == event)                                                    \
            if (pClass->guard_name(wParam, lParam))                             \
                return pClass->action_name(wParam, lParam);

#define ON_ALL_EVENT_TRANSITION(guard_name, action_name, target_state)          \
        if (wEvent != EVENT_ENTRY && wEvent != EVENT_EXIT)                      \
            if (pClass->guard_name(wParam, lParam))                             \
            {                                                                   \
                bool ret = pClass->action_name(wParam, lParam);                 \
                pClass->TransitTo(#target_state);                               \
                return ret;                                                     \
            }

#define ON_ALL_EVENT_INTERNAL(guard_name, action_name)                          \
        if (wEvent != EVENT_ENTRY && wEvent != EVENT_EXIT)                      \
            if (pClass->guard_name(wParam, lParam))                             \
                return pClass->action_name(wParam, lParam);

#define END_STATE_TRANSITION                                                    \
        return false;                                                           \
    }

class CFSM;

class CState  
{
protected:
    // 进入和离开动作的事件ID
    enum
    {
        EVENT_ENTRY = 0xfffe,
        EVENT_EXIT
    } ENUM_EVENT_PRESERVE;
    
public:
	CState(CFSM * pFSM, const char * pName, const char * pParent);
    virtual ~CState() {}

    CState * GetParent() const { return m_pParent; }

    bool SendEvent(CFSM * pFSM, WORD wEvent, WORD wParam, DWORD lParam);
    virtual bool OnEvent(CFSM * pFSM, WORD wEvent, WORD wPAram, DWORD lParam) = 0;

    void ActiveDefaultChild(CFSM * pFSM);
    void Active(CFSM * pFSM, CState * pStop);
    void Deactive(CFSM * pFSM);

    const char * GetActiveLeaf();
    bool IsActive();
    const char * GetName() const { return m_pName; }

protected:
    CState *    m_pParent;          // 父状态
    CState *    m_pDefault;         // 缺省子状态
    CState *    m_pActive;          // 当前的活动子状态

    const char * m_pName;           // 状态的名字
};

#endif // !defined(AFX_STATE_H__14FA61D4_5DB9_4683_9895_336EC8BF24D2__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -