// @(#)root/tree:$Id$
// Author: Rene Brun   05/02/97

/*************************************************************************
 * Copyright (C) 1995-2000, 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_TSelectorCint
#define ROOT_TSelectorCint


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TSelectorCint                                                        //
//                                                                      //
// A utility class for Trees selections.  (via interpreter)             //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


#ifndef ROOT_TSelector
#include "TSelector.h"
#endif
#ifndef ROOT_TInterpreter
#include "TInterpreter.h"
#endif

class TSelectorCint : public TSelector {

private:
   void SetFuncProto(CallFunc_t *cf, ClassInfo_t *cl, const char* fname,
                     const char* argtype, Bool_t required = kTRUE);

protected:
   ClassInfo_t  *fClass;          //!
   CallFunc_t   *fFuncVersion;    //!
   CallFunc_t   *fFuncInit;       //!
   CallFunc_t   *fFuncBegin;      //!
   CallFunc_t   *fFuncSlBegin;    //!
   CallFunc_t   *fFuncNotif;      //!
   CallFunc_t   *fFuncSlTerm;     //!
   CallFunc_t   *fFuncTerm;       //!
   CallFunc_t   *fFuncCut;        //!
   CallFunc_t   *fFuncFill;       //!
   CallFunc_t   *fFuncProc;       //!
   CallFunc_t   *fFuncOption;     //!
   CallFunc_t   *fFuncObj;        //!
   CallFunc_t   *fFuncInp;        //!
   CallFunc_t   *fFuncOut;        //!
   CallFunc_t   *fFuncAbort;      //!
   CallFunc_t   *fFuncGetAbort;   //!
   CallFunc_t   *fFuncResetAbort; //!
   CallFunc_t   *fFuncGetStat;    //!
   TSelector    *fIntSelector;    //Pointer to interpreted selector (if interpreted)
   Bool_t        fIsOwner;        //True if fIntSelector shoudl be deleted when the this object is deleted.

public:
   TSelectorCint();
   virtual            ~TSelectorCint();
   virtual void        Build(TSelector *iselector, ClassInfo_t *cl, Bool_t isowner = kTRUE);
   virtual int         Version() const;
   virtual void        Init(TTree *);
   virtual void        Begin(TTree *tree);
   virtual void        SlaveBegin(TTree *);
   virtual Bool_t      Notify();
   virtual Bool_t      ProcessCut(Long64_t entry);
   virtual void        ProcessFill(Long64_t entry);
   virtual Bool_t      Process(Long64_t entry);
   virtual void        SetOption(const char *option);
   virtual void        SetObject(TObject *obj);
   virtual void        SetInputList(TList *input);
   virtual TList      *GetOutputList() const;
   virtual void        SlaveTerminate();
   virtual void        Terminate();
   virtual void        Abort(const char *why, EAbort what = kAbortProcess);
   virtual EAbort      GetAbort() const;
   virtual void        ResetAbort();
   virtual Long64_t    GetStatus() const;
   virtual TClass     *GetInterpretedClass() const;
   virtual TSelector  *GetInterpretedSelector() const { return fIntSelector; }

   ClassDef(TSelectorCint,0)  //A utility class for tree and object processing (interpreted version)
};

#endif

