Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- // NOTHING
- struct Nothing { };
- // define states
- struct UndefinedState { };
- // define actions
- struct UndefinedAction { };
- // define base fsm transitioner
- template <typename State, typename Action>
- struct FSMTransitioner
- {
- typedef UndefinedState Next;
- };
- // define cons cells
- template <typename Car_, typename Cdr_>
- struct Cons {
- typedef Car_ Car;
- typedef Cdr_ Cdr;
- };
- // define dog st--SQUIRREL!--uff
- struct PantingState { };
- struct BarkingState { };
- struct SquirrelAction { };
- struct PetAction { };
- // the fsm transitioner
- template <typename State, typename Action>
- struct DogFSMTransitioner : public FSMTransitioner <State, Action> { };
- template <>
- struct DogFSMTransitioner <PantingState, SquirrelAction>
- {
- typedef BarkingState Next;
- };
- template <>
- struct DogFSMTransitioner <PantingState, PetAction>
- {
- typedef PantingState Next;
- };
- template <>
- struct DogFSMTransitioner <BarkingState, SquirrelAction>
- {
- typedef BarkingState Next;
- };
- template <>
- struct DogFSMTransitioner <BarkingState, PetAction>
- {
- typedef PantingState Next;
- };
- // define some steps in a linked list
- typedef Cons <PantingState, Nothing> dogFSMCons1;
- typedef Cons <DogFSMTransitioner <dogFSMCons1::Car, SquirrelAction>::Next, dogFSMCons1> dogFSMCons2;
- typedef Cons <DogFSMTransitioner <dogFSMCons2::Car, PetAction>::Next, dogFSMCons2> dogFSMCons3;
- typedef Cons <DogFSMTransitioner <dogFSMCons3::Car, PetAction>::Next, dogFSMCons3> dogFSMCons4;
- typedef Cons <DogFSMTransitioner <dogFSMCons4::Car, PetAction>::Next, dogFSMCons4> dogFSMLinkedList;
- // define reprs
- template <typename State>
- struct DogFSMStateRepr
- {
- static const char *repr()
- {
- return "in an undefined state";
- }
- };
- template <>
- struct DogFSMStateRepr <BarkingState>
- {
- static const char *repr()
- {
- return "barking";
- }
- };
- template <>
- struct DogFSMStateRepr <PantingState>
- {
- static const char *repr()
- {
- return "panting";
- }
- };
- // define FSM iterator
- template <typename Cons_>
- struct DogFSMIterator
- {
- typedef DogFSMIterator <typename Cons_::Cdr> Next;
- typedef DogFSMStateRepr <typename Cons_::Car> Repr;
- static void execute()
- {
- Next::execute();
- std::cout << "Dog is currently: " << Repr::repr() << std::endl;
- }
- };
- template <>
- struct DogFSMIterator <Nothing>
- {
- static void execute()
- {
- }
- };
- typedef DogFSMIterator<dogFSMLinkedList> dogFSMIterator;
- int main()
- {
- dogFSMIterator::Next::execute();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement