Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.49 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. // NOTHING
  4. struct Nothing { };
  5.  
  6. // define states
  7. struct UndefinedState { };
  8.  
  9. // define actions
  10. struct UndefinedAction { };
  11.  
  12. // define base fsm transitioner
  13. template <typename State, typename Action>
  14. struct FSMTransitioner
  15. {
  16.     typedef UndefinedState Next;
  17. };
  18.  
  19. // define cons cells
  20. template <typename Car_, typename Cdr_>
  21. struct Cons {
  22.     typedef Car_ Car;
  23.     typedef Cdr_ Cdr;
  24. };
  25.  
  26. // define dog st--SQUIRREL!--uff
  27. struct PantingState { };
  28. struct BarkingState { };
  29.  
  30. struct SquirrelAction { };
  31. struct PetAction { };
  32.  
  33. // the fsm transitioner
  34. template <typename State, typename Action>
  35. struct DogFSMTransitioner : public FSMTransitioner <State, Action> { };
  36.  
  37. template <>
  38. struct DogFSMTransitioner <PantingState, SquirrelAction>
  39. {
  40.     typedef BarkingState Next;
  41. };
  42.  
  43. template <>
  44. struct DogFSMTransitioner <PantingState, PetAction>
  45. {
  46.     typedef PantingState Next;
  47. };
  48.  
  49. template <>
  50. struct DogFSMTransitioner <BarkingState, SquirrelAction>
  51. {
  52.     typedef BarkingState Next;
  53. };
  54.  
  55. template <>
  56. struct DogFSMTransitioner <BarkingState, PetAction>
  57. {
  58.     typedef PantingState Next;
  59. };
  60.  
  61. // define some steps in a linked list
  62. typedef Cons <PantingState, Nothing> dogFSMCons1;
  63. typedef Cons <DogFSMTransitioner <dogFSMCons1::Car, SquirrelAction>::Next, dogFSMCons1> dogFSMCons2;
  64. typedef Cons <DogFSMTransitioner <dogFSMCons2::Car, PetAction>::Next, dogFSMCons2> dogFSMCons3;
  65. typedef Cons <DogFSMTransitioner <dogFSMCons3::Car, PetAction>::Next, dogFSMCons3> dogFSMCons4;
  66. typedef Cons <DogFSMTransitioner <dogFSMCons4::Car, PetAction>::Next, dogFSMCons4> dogFSMLinkedList;
  67.  
  68. // define reprs
  69. template <typename State>
  70. struct DogFSMStateRepr
  71. {
  72.     static const char *repr()
  73.     {
  74.         return "in an undefined state";
  75.     }
  76. };
  77.  
  78. template <>
  79. struct DogFSMStateRepr <BarkingState>
  80. {
  81.     static const char *repr()
  82.     {
  83.         return "barking";
  84.     }
  85. };
  86.  
  87. template <>
  88. struct DogFSMStateRepr <PantingState>
  89. {
  90.     static const char *repr()
  91.     {
  92.         return "panting";
  93.     }
  94. };
  95.  
  96. // define FSM iterator
  97. template <typename Cons_>
  98. struct DogFSMIterator
  99. {
  100.     typedef DogFSMIterator <typename Cons_::Cdr> Next;
  101.     typedef DogFSMStateRepr <typename Cons_::Car> Repr;
  102.  
  103.     static void execute()
  104.     {
  105.         Next::execute();
  106.         std::cout << "Dog is currently: " << Repr::repr() << std::endl;
  107.     }
  108. };
  109.  
  110. template <>
  111. struct DogFSMIterator <Nothing>
  112. {
  113.     static void execute()
  114.     {
  115.     }
  116. };
  117.  
  118. typedef DogFSMIterator<dogFSMLinkedList> dogFSMIterator;
  119.  
  120. int main()
  121. {
  122.     dogFSMIterator::Next::execute();
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement