SpFSMTest.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "SpHelper.h"
  2. #include "SpFSM.h"
  3. #include<gtest/gtest.h>
  4. class DemoFSM : public FSMImpl<DemoFSM>
  5. {
  6. enum { s0, s1 = 0, s2 = 1 };
  7. public:
  8. typedef FSMStateEntryT<DemoFSM> FSMStateEntry;
  9. typedef DemoFSM FSM;
  10. private:
  11. FSMStateEntry* __EntryTable(int* iNum)
  12. {
  13. static FSMStateEntry tables[] = {
  14. {s0, "Idle", NULL, &FSM::s0_on_entry, &FSM::s0_on_exit, &FSM::s0_on_event}
  15. };
  16. static int sorted = 0;
  17. if (!sorted) {
  18. int n = sizeof(tables) / sizeof(tables[0]);
  19. for (int i = 0; i < n - 1; ++i) {
  20. FSMStateEntry* t = &tables[i];
  21. if (t->id != i) {
  22. int j;
  23. for (j = i + 1; j < n; ++j) {
  24. FSMStateEntry* tt = &tables[j];
  25. if (tt->id == i)
  26. break;
  27. }
  28. assert(j < n);
  29. FSMStateEntry tentry;
  30. memcpy(&tentry, t, sizeof(FSMStateEntry));
  31. memcpy(t, &tables[j], sizeof(FSMStateEntry));
  32. memcpy(&tables[j], &tentry, sizeof(FSMStateEntry));
  33. }
  34. }
  35. sorted++;
  36. }
  37. if (iNum)
  38. *iNum = sizeof(tables) / sizeof(tables[0]);
  39. return &tables[0];
  40. }
  41. public:
  42. FSMStateEntry* GetCurrState()
  43. {
  44. return GetState(m_iState);
  45. }
  46. FSMStateEntry* GetState(int iState)
  47. {
  48. int num;
  49. FSMStateEntry* t = __EntryTable(&num);
  50. assert(iState < num);
  51. return t + iState;
  52. }
  53. int GetStateCount()
  54. {
  55. int num;
  56. __EntryTable(&num);
  57. return num;
  58. }
  59. public:
  60. virtual int GetInitState() { return s0; }
  61. private:
  62. FSMRuleEntry* __RuleTable(int* iNum)
  63. {
  64. static struct FSMRuleEntry table[] = {
  65. {s1, s2, EVT_USER+1, 0, 0},
  66. {s1, s2, EVT_USER +2, 0, (unsigned int)-1}
  67. };
  68. if (iNum)
  69. *iNum = sizeof(table) / sizeof(table[0]);
  70. return &table[0];
  71. }
  72. public:
  73. FSMRuleEntry* GetRule(int iRule)
  74. {
  75. int num;
  76. FSMRuleEntry* t = __RuleTable(&num);
  77. assert(iRule < num);
  78. return t + iRule;
  79. }
  80. int GetRuleCount()
  81. {
  82. int num;
  83. __RuleTable(&num);
  84. return num;
  85. }
  86. void s0_on_entry() {}
  87. void s0_on_exit() {}
  88. unsigned int s0_on_event(FSMEvent* event) {}
  89. };