///////////////////////////////////////////////////////////////////
//
// A logical group of processors to be executed sequentially, if the
// conditional processor returns OKTRUE. This block continually executes
// its processor list DSEvent IFF the conditional processor returns
// OKTRUE. Note the BeginOfRun and EndOfRun methods are executed for all
// processors including the conditional.
//
// Author: P G Jones <p.g.jones@qmul.ac.uk>
//
// REVISION HISTORY:
//     2013-10-11 : P G Jones - New File.
//
///////////////////////////////////////////////////////////////////

#ifndef __RAT_WhileProcBlock__
#define __RAT_WhileProcBlock__

#include <RAT/ProcBlock.hh>
#include <RAT/Profiler.hh>

namespace RAT
{

class WhileProcBlock : public ProcBlock
{
public:
  // Construct the WhileProcBlock
  //
  // proc: the conditional processor
  WhileProcBlock( Processor* const proc );

  // Destroy the WhileProcBlock
  virtual ~WhileProcBlock();

  // Close the the current ProcBlock
  //
  // Will close this ProcBlock if no nested ProcBlocks are open
  //
  // type: Identifies the command used, block will Log::Die if incorrect command applied.
  virtual void EndCommand( const EEndCommand type );

  // Called at the beginning of a run
  //
  // Each processor is called in turn (no conditional aspect)
  //
  // run: Data structure for the run
  virtual void BeginOfRun( DS::Run& run );

  // Called for each event
  //
  // Firstly the conditional processor is evaluated, if the result is OKTRUE then
  // each processor is called in turn if the result is anything else then
  // no processors are called.
  //
  // run: Data structure for the run
  // ds: Data structure for the event
  //
  // Returns a Is the net condition for all processors in the list, will be OK, FAIL or ABORT
  virtual Processor::Result DSEvent( DS::Run& run, DS::Entry& ds );

  // Called at the end of a run.
  //
  // Each processor is called in turn (no conditional aspect)
  //
  // run: Data structure for the run
  virtual void EndOfRun( DS::Run& run );
protected:
  Processor* fConditionalProcessor; // The processor to conditional while upon
  Profiler fConditionalBeginProfiler; // Profiler details (total time, calls) for the BeginOfRun call
  Profiler fConditionalEventProfiler; // Profiler details (total time, calls) for the conditional DSEvent call
  Profiler fConditionalEndProfiler; // Profiler details (total time, calls) for the EndOfRun call
};


} // namespace RAT

#endif