Guest User

Untitled

a guest
May 25th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.47 KB | None | 0 0
  1. struct VisiAPI   // Plugin -> Framework
  2. {
  3.     virtual void registerTerminationEvent(TerminationCondition* condition, TerminationEventAction* action) = 0;
  4. };
  5.  
  6. class CorePlugin
  7. {
  8. private:
  9.     VisiAPI* api;
  10.  
  11. protected:
  12.     void registerTerminationEvent(TerminationCondition* condition, TerminationEventAction* action)
  13.     {
  14.         api->registerTerminationEvent(condition, action);
  15.     }
  16. public:
  17.     virtual void initialize() = 0;
  18. };
  19.  
  20. class MoP : private VisiAPI //implements API privately
  21. {
  22. private:
  23.     CorePlugin* plugin;
  24.     TerminationChecker checker;    
  25.     State* state;
  26.     Simulator simulator;
  27.  
  28.     void registerTerminationEvent(TerminationCondition* condition, TerminationEventAction* action )
  29.     {
  30.         checker.registerTerminationEvent( condition, action );
  31.     }
  32.  
  33.     void simulate()
  34.     {
  35.         simulator(state, checker);
  36.     }
  37. };
  38.  
  39. class TerminationChecker
  40. {
  41.     struct ConditionAction
  42.     {
  43.         TerminationCondition* condition;
  44.         TerminationEventAction* action;
  45.     };
  46.  
  47.     list<ConditionAction> conditions;
  48. public:
  49.     void registerTerminationEvent(TerminationCondition* condition, TerminationEventAction* action )
  50.     {
  51.         conditions.push_back( ConditionAction( condition, action ) );
  52.     }
  53.  
  54.     TerminationEventAction* checkTerminationConditions(State* state, CorePlugin* plugin)
  55.     {
  56.         list<ConditionAction>::iterator cond = conditions.begin();
  57.         TerminationEventAction* actionToDo = NULL;
  58.  
  59.         while ( cond != conditions.end() && actionToDo == NULL )
  60.         {
  61.              if ( cond->condition->applies( state ) )
  62.                  actionToDo = cond->action;
  63.              ++cond;
  64.         }
  65.  
  66.         conditions.clear();
  67.  
  68.         /* TO BE DONE IN THE MoP::simulate()
  69.         if (actionToDo != NULL)
  70.         {
  71.             actionToDo->raiseEvent();
  72.         }
  73.     */
  74.     return actionToDo;
  75.     }
  76. };
  77.  
  78.  
  79. // Meanwhile, somewhere in PluginCity...
  80. class MyPrettyPlugin : public CorePlugin
  81. {
  82. private:
  83.     void someBizarreEvent() { doSomething... }
  84.     void moreBizarreEvent() { doSomething... }
  85.     void bizarrestEvent()   { breakTheWorld; }
  86.  
  87.  
  88.     class CallSomeBizarreEvent : public TerminationEventAction
  89.     {
  90.         MyPrettyPlugin* parent;
  91.  
  92.         virtual void raiseEvent()
  93.         {
  94.             parent->someBizarreEvent();
  95.         }
  96.  
  97.     public:
  98.         CallSomeBizarreEvent(MyPrettyPlugin* parent);
  99.     };
  100.  
  101.     class CallMoreBizarreEvent : public TerminationEventAction
  102.     {
  103.         MyPrettyPlugin* parent;
  104.  
  105.         virtual void raiseEvent()
  106.         {
  107.             parent->moreBizarreEvent();
  108.         }
  109.  
  110.     public:
  111.         CallMoreBizarreEvent(MyPrettyPlugin* parent);
  112.     };
  113.  
  114.     class CallBizarrestEvent : public TerminationEventAction
  115.     {
  116.         MyPrettyPlugin* parent;
  117.  
  118.         virtual void raiseEvent()
  119.         {
  120.             parent->bizarrestEvent();
  121.         }
  122.  
  123.     public:
  124.         CallBizarrestEvent(MyPrettyPlugin* parent);
  125.     };
  126.  
  127.     class BizarreCondition : public TerminationCondition
  128.     {
  129.         virtual bool applies(State* state)
  130.         {
  131.             return false; // never occurs!
  132.         }
  133.     };
  134.  
  135.     virtual void initialize()
  136.     {
  137.         registerTerminationEvent( new Cd4sTraspassEvent(34.5, Down), new CallSomeBizarreEvent(this) );
  138.  
  139.         registerTerminationEvent( new ViremiaTraspassEvent(34.5, Down), new CallMoreBizarreEvent(this) );
  140.  
  141.         registerTerminationEvent( new BizarreCondition(), new CallBizarrestEvent(this) );
  142.     }
  143. };
Add Comment
Please, Sign In to add comment