/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id: RooFunctor.h 28259 2009-04-16 16:21:16Z wouter $
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
 *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
 *                                                                           *
 * Copyright (c) 2000-2005, Regents of the University of California          *
 *                          and Stanford University. All rights reserved.    *
 *                                                                           *
 * Redistribution and use in source and binary forms,                        *
 * with or without modification, are permitted according to the terms        *
 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
 *****************************************************************************/
#ifndef ROO_FUNCTOR
#define ROO_FUNCTOR

#include "RooArgSet.h"
#include "RooAbsReal.h"

class RooAbsFunc ;
class RooAbsPdf ;

class RooFunctor {

public:
  RooFunctor(const RooAbsFunc& func) ;
  RooFunctor(const RooAbsReal& func, const RooArgList& observables, const RooArgList& parameters) ;
  RooFunctor(const RooAbsReal& func, const RooArgList& observables, const RooArgList& parameters, const RooArgSet& nset) ;
  RooFunctor(const RooFunctor&) ;
  virtual ~RooFunctor() ;

  Int_t nObs() const { 
    // Number of observables
    return _nobs ; 
  }
  Int_t nPar() const { 
    // Number of parameters;
    return _npar ;
  }

  //Int_t numCall() const { return _binding->numCall() ; }
  //void resetNumCall() const { _binding->resetNumCall() ; }

  
  Double_t operator()(Double_t x) const { return eval(x) ; }
  Double_t operator()(const Double_t* x, const Double_t* p) const { return eval(x,p) ; }
  Double_t operator()(const Double_t* x) const { return eval(x) ; }

  Double_t eval(const Double_t* /*x*/, const Double_t* /*p*/) const ;
  Double_t eval(const Double_t* /*x*/) const ;
  Double_t eval(Double_t  /*x*/) const ;
  
  RooAbsFunc& binding() { return *_binding ; }

protected:

  Bool_t          _ownBinding ; // Do we own the binding function 
  RooArgSet       _nset ; // Normalization observables
  RooAbsFunc*     _binding ; // Function binding
  Double_t*       _x ; //! Transfer array ;
  Int_t           _npar ; //! Number of parameters ;
  Int_t           _nobs ; //! Number of observables ;

  ClassDef(RooFunctor,0) // Export RooAbsReal as functor
};

#endif