// @(#)root/proof:$Name:  $:$Id: TEventIter.h,v 1.6 2003/05/01 17:51:42 rdm Exp $
// Author: Maarten Ballintijn   07/01/02

/*************************************************************************
 * Copyright (C) 1995-2001, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TEventIter
#define ROOT_TEventIter

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TEventIter                                                           //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TObject
#include "TObject.h"
#endif
#ifndef ROOT_TString
#include "TString.h"
#endif


class TDSet;
class TDSetElement;
class TFile;
class TDirectory;
class TSelector;
class TList;
class TIter;
class TTree;


//------------------------------------------------------------------------

class TEventIter : public TObject {

protected:
   TDSet         *fDSet;      // data set over which to iterate

   TDSetElement  *fElem;      // Current Element

   TString        fFilename;  // Name of the current file
   TFile         *fFile;      // Current file
   TString        fPath;      // Path to current TDirectory
   TDirectory    *fDir;       // directory containing the objects or the TTree
   Long64_t       fElemFirst; // first entry to process for this element
   Long64_t       fElemNum;   // number of entries to process for this element
   Long64_t       fElemCur;   // current entry for this element

   TSelector     *fSel;       // selector to be used
   Long64_t       fFirst;     // first entry to process
   Long64_t       fNum;       // number of entries to process
   Long64_t       fCur;       // current entry
   Bool_t         fStop;      // termination of run requested

   Int_t    LoadDir();        // Load the directory pointed to by fElem

public:
   TEventIter();
   TEventIter(TDSet *dset, TSelector *sel, Long64_t first, Long64_t num);
   virtual ~TEventIter();

   virtual Long64_t  GetNextEvent() = 0;
   virtual void      StopProcess(Bool_t abort);

   static TEventIter *Create(TDSet *dset, TSelector *sel, Long64_t first, Long64_t num);

   ClassDef(TEventIter,0)  // Event iterator used by TProofPlayer's
};


//------------------------------------------------------------------------

class TEventIterObj : public TEventIter {

private:
   TString  fClassName;    // class name of objects to iterate over
   TList   *fKeys;         // list of keys
   TIter   *fNextKey;      // next key in directory
   TObject *fObj;          // object found

public:
   TEventIterObj();
   TEventIterObj(TDSet *dset, TSelector *sel, Long64_t first, Long64_t num);
   ~TEventIterObj();

   Long64_t GetNextEvent();

   ClassDef(TEventIterObj,0)  // Event iterator for objects
};


//------------------------------------------------------------------------

class TEventIterTree : public TEventIter {

private:
   TString  fTreeName;  // name of the tree object to iterate over
   TTree   *fTree;      // tree we are iterating over

public:
   TEventIterTree();
   TEventIterTree(TDSet *dset, TSelector *sel, Long64_t first, Long64_t num);
   ~TEventIterTree();

   Long64_t GetNextEvent();

   ClassDef(TEventIterTree,0)  // Event iterator for Trees
};

#endif
