#ifndef ALICODETIMER_H
#define ALICODETIMER_H
#ifndef ROOT_TString
# include "TString.h"
#endif
#ifndef ROOT_TObjString
# include "TObjString.h"
#endif
#ifndef ALILOG_H
# include "AliLog.h"
#endif
class TStopwatch;
class TMap;
class AliCodeTimer : public TObject
{
public:
AliCodeTimer();
virtual ~AliCodeTimer();
static AliCodeTimer* Instance();
void Continue(const char* classname, const char* methodname, const char* message="");
Double_t CpuTime(const char* classname, const char* methodname, const char* message="") const;
void Print(Option_t* opt="") const;
Double_t RealTime(const char* classname, const char* methodname, const char* message="") const;
void Reset();
void Start(const char* classname, const char* methodname, const char* message="");
void Stop(const char* classname, const char* methodname, const char* message="");
public:
class AliPair : public TObject
{
public:
AliPair() : TObject(),fName(0), fTimer(0) {}
AliPair(TObjString* name, TStopwatch* timer) : TObject(), fName(name), fTimer(timer) {}
virtual ~AliPair() { delete fName; }
TString Name() const { return fName->String(); }
TStopwatch* Timer() const { return fTimer; }
virtual Bool_t IsSortable() const { return kTRUE; }
virtual Int_t Compare(const TObject* object) const
{ return fName->Compare(((const AliPair*)(object))->fName); }
virtual void Print(Option_t* opt="") const;
private:
AliPair(const AliPair&);
AliPair& operator=(const AliPair&);
TObjString* fName;
TStopwatch* fTimer;
ClassDef(AliPair,1)
};
class AliAutoPtr
{
public:
AliAutoPtr(const char* classname, const char* methodname, const char* message="")
: fA(classname), fB(methodname), fC(message)
{ AliCodeTimer::Instance()->Start(classname,methodname,message); }
~AliAutoPtr() { AliCodeTimer::Instance()->Stop(fA.Data(),fB.Data(),fC.Data()); }
private:
TString fA;
TString fB;
TString fC;
};
private:
TMap* MethodMap(const char* classname) const;
TObjArray* MessageArray(const char* classname, const char* methodname) const;
TStopwatch* Stopwatch(const char* classname, const char* methodname, const char* message="") const;
void PrintClass(const char* classname) const;
void PrintMethod(const char* classname, const char* methodname) const;
private:
AliCodeTimer(const AliCodeTimer& rhs);
AliCodeTimer& operator=(const AliCodeTimer& rhs);
static AliCodeTimer* fgInstance;
TMap* fTimers;
ClassDef(AliCodeTimer,1)
};
#ifndef LOG_NO_DEBUG
#define AliCodeTimerStartClass(message) AliCodeTimer::Instance()->Start(Class()->GetName(),FUNCTIONNAME(),message);
#define AliCodeTimerStopClass(message) AliCodeTimer::Instance()->Stop(Class()->GetName(),FUNCTIONNAME(),message);
#define AliCodeTimerAutoClass(message,counter) AliCodeTimer::AliAutoPtr aliCodeTimerAliAutoPtrVariable##counter(Class()->GetName(),FUNCTIONNAME(),message);
#define AliCodeTimerStart(message) AliCodeTimer::Instance()->Start(ClassName(),FUNCTIONNAME(),message);
#define AliCodeTimerStop(message) AliCodeTimer::Instance()->Stop(ClassName(),FUNCTIONNAME(),message);
#define AliCodeTimerAuto(message,counter) AliCodeTimer::AliAutoPtr aliCodeTimerAliAutoPtrVariable##counter(ClassName(),FUNCTIONNAME(),message);
#define AliCodeTimerStartGeneral(message) AliCodeTimer::Instance()->Start("General",FUNCTIONNAME(),message);
#define AliCodeTimerStopGeneral(message) AliCodeTimer::Instance()->Stop("General",FUNCTIONNAME(),message);
#define AliCodeTimerAutoGeneral(message,counter) AliCodeTimer::AliAutoPtr aliCodeTimerAliAutoPtrVariable##counter("General",FUNCTIONNAME(),message);
#else
#define AliCodeTimerStartClass(message)
#define AliCodeTimerStopClass(message)
#define AliCodeTimerAutoClass(message,counter)
#define AliCodeTimerStart(message)
#define AliCodeTimerStop(message)
#define AliCodeTimerAuto(message,counter)
#define AliCodeTimerStartGeneral(message)
#define AliCodeTimerStopGeneral(message)
#define AliCodeTimerAutoGeneral(message,counter)
#endif
#endif