12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #include "SpHelper.h"
- #include "SpFSM.h"
- #include<gtest/gtest.h>
- class DemoFSM : public FSMImpl<DemoFSM>
- {
- enum { s0, s1 = 0, s2 = 1 };
- public:
- typedef FSMStateEntryT<DemoFSM> FSMStateEntry;
- typedef DemoFSM FSM;
- private:
- FSMStateEntry* __EntryTable(int* iNum)
- {
- static FSMStateEntry tables[] = {
- {s0, "Idle", NULL, &FSM::s0_on_entry, &FSM::s0_on_exit, &FSM::s0_on_event}
- };
- static int sorted = 0;
- if (!sorted) {
- int n = sizeof(tables) / sizeof(tables[0]);
- for (int i = 0; i < n - 1; ++i) {
- FSMStateEntry* t = &tables[i];
- if (t->id != i) {
- int j;
- for (j = i + 1; j < n; ++j) {
- FSMStateEntry* tt = &tables[j];
- if (tt->id == i)
- break;
- }
- assert(j < n);
- FSMStateEntry tentry;
- memcpy(&tentry, t, sizeof(FSMStateEntry));
- memcpy(t, &tables[j], sizeof(FSMStateEntry));
- memcpy(&tables[j], &tentry, sizeof(FSMStateEntry));
- }
- }
- sorted++;
- }
- if (iNum)
- *iNum = sizeof(tables) / sizeof(tables[0]);
- return &tables[0];
- }
- public:
- FSMStateEntry* GetCurrState()
- {
- return GetState(m_iState);
- }
- FSMStateEntry* GetState(int iState)
- {
- int num;
- FSMStateEntry* t = __EntryTable(&num);
- assert(iState < num);
- return t + iState;
- }
- int GetStateCount()
- {
- int num;
- __EntryTable(&num);
- return num;
- }
- public:
- virtual int GetInitState() { return s0; }
- private:
- FSMRuleEntry* __RuleTable(int* iNum)
- {
- static struct FSMRuleEntry table[] = {
- {s1, s2, EVT_USER+1, 0, 0},
- {s1, s2, EVT_USER +2, 0, (unsigned int)-1}
- };
- if (iNum)
- *iNum = sizeof(table) / sizeof(table[0]);
- return &table[0];
- }
- public:
- FSMRuleEntry* GetRule(int iRule)
- {
- int num;
- FSMRuleEntry* t = __RuleTable(&num);
- assert(iRule < num);
- return t + iRule;
- }
- int GetRuleCount()
- {
- int num;
- __RuleTable(&num);
- return num;
- }
- void s0_on_entry() {}
- void s0_on_exit() {}
- unsigned int s0_on_event(FSMEvent* event) {}
- };
|