00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef FAUDES_LPEXECUTOR_H
00014 #define FAUDES_LPEXECUTOR_H
00015
00016
00017 #include "corefaudes.h"
00018 #include "tp_include.h"
00019 #include "sp_pexecutor.h"
00020 #include "sp_simconditionset.h"
00021
00022
00023 namespace faudes {
00024
00071 class LoggingExecutor : public ParallelExecutor {
00072
00073 public:
00074
00075
00076
00077
00078
00079
00087 LoggingExecutor(void);
00088
00102 LoggingExecutor(const std::string& rFileName);
00103
00104
00108 virtual ~LoggingExecutor(void);
00109
00112
00113
00114
00115
00116
00125 virtual void Clear(void);
00126
00131 virtual void Reset(void);
00132
00142 virtual bool Valid(void) const {return true;};
00143
00154 virtual bool ExecuteTime(tpTime::Type duration);
00155
00167 virtual bool ExecuteEvent(Idx event);
00168
00169
00174 tpTime::Type CurrentTime(void) const { return ParallelExecutor::CurrentTime();} ;
00175
00185 void CurrentTime(tpTime::Type time);
00186
00191 int CurrentStep(void) const { return ParallelExecutor::CurrentStep();};
00192
00205 void CurrentStep(int step);
00206
00217 bool CurrentParallelTimedState(const ParallelTimedState& ptstate);
00218
00226 const ParallelTimedState& CurrentParallelTimedState(void) const
00227 { return ParallelExecutor::CurrentParallelTimedState();};
00228
00231
00232
00233
00234
00235
00240 const SimConditionSet& Conditions(void) const;
00241
00243 void Conditions(const SimConditionSet&);
00244
00246 const SimConditionAttribute& Condition(const std::string& rName) const;
00247
00249 const SimConditionAttribute& Condition(Idx cond) const;
00250
00252 Idx SetCondition(const std::string& rName, const SimConditionAttribute& rCondition);
00253
00255 void SetCondition(Idx cond, const SimConditionAttribute& rCondition);
00256
00258 void ClrCondition(const std::string& rName);
00259
00261 void ClrCondition(Idx cond);
00262
00264 void ConditionsWrite(TokenWriter& rTw, const std::string& rLabel="SimConditions") const;
00265
00267 void ConditionsRead(TokenReader& rTr, const std::string& rLabel="SimConditions");
00268
00270 typedef SimConditionSet::Iterator ConditionIterator;
00271
00273 ConditionIterator ConditionsBegin(void) const;
00274
00276 ConditionIterator ConditionsEnd(void) const;
00277
00279 bool BreakCondition(void) const {return mBreakCondition;};
00280
00283
00284
00285
00286
00287
00292 typedef enum { Statistics=0x01, States=0x02, Events=0x04, Time=0x08} LogMode;
00293
00295 void LogOpen(TokenWriter& rTw, int mode);
00296
00298 void LogOpen(const std::string& rFileName, int logmode, std::ios::openmode openmode = std::ios::out|std::ios::trunc);
00299
00301 void LogClose(void);
00302
00305
00306
00307
00308
00309
00319 void TraceClear(int length=-2);
00320
00322 typedef struct {
00323 ParallelTimedState mState;
00324 Idx mStep;
00325 tpTime::Type mTime;
00326 tpTime::Type mDuration;
00327 Idx mEvent;
00328 } TraceSample;
00329
00331 int TraceLength(void) const;
00332
00334 typedef std::deque<TraceSample>::const_iterator TraceIterator;
00335
00337 TraceIterator TraceBegin(void) const;
00338
00340 TraceIterator TraceEnd(void) const;
00341
00343 const TraceSample* TraceAtTime(tpTime::Type time) const;
00344
00346 const TraceSample* TraceAtStep(int step) const;
00347
00349 const TraceSample* TraceRecent(void) const;
00350
00352 const TraceSample* TraceCurrent(void) const;
00353
00355 void TraceWrite(TokenWriter& rTw, const TraceSample& sample) const;
00356
00358 void TraceWrite(const TraceSample& sample) const;
00359
00361 std::string TraceToString(const TraceSample& sample) const;
00362
00364 void TraceWrite(void) const;
00365
00367 virtual bool RevertToStep(Idx step);
00368
00369
00372 protected:
00373
00375 virtual void Compile();
00376
00377 private:
00378
00379
00381 SimConditionSet mConditions;
00382
00384 std::vector<SimConditionAttribute*> mEnabledConditions;
00385
00387 bool mBreakCondition;
00388
00390 void CompileConditions(void);
00391
00393 void ConditionsReset(void);
00394
00396 void ConditionsProcess(void);
00397
00399 TokenWriter* pLogTokenWriter;
00400
00402 std::string mLogFile;
00403
00405 int mLogMode;
00406
00408 void LogWriteStatistics(void);
00409
00411 void LogWriteState(void);
00412
00414 void LogWriteEvent(void);
00415
00417 void LogWriteTime(void);
00418
00420 void LogWritePause(void);
00421
00423 void LogWriteResume(void);
00424
00426 int mTraceMax;
00427
00429 int mTraceFirstStep;
00430
00432 std::deque<TraceSample> mTraceBuffer;
00433
00435 std::map<tpTime::Type,int> mTraceTimeToStep;
00436
00438 void TraceAddSample(void);
00439
00441 void TraceUpdateTime(void);
00442
00444 void TraceUpdateTransition(Idx event);
00445
00461 virtual void DoRead(TokenReader& rTr, const std::string& rLabel = "", const Type* pContext=0);
00462
00476 virtual void DoWrite(TokenWriter& rTw, const std::string& rLabel="", const Type* pContext=0) const;
00477
00478
00479
00480 };
00481
00482
00483
00484 }
00485
00486
00487 #endif
00488