ROOT logo
#ifndef ALICODETIMER_H
#define ALICODETIMER_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* See cxx source for full Copyright notice                               */

// $Id$

///
/// A class to organize TStopwatch timers used to time our code
/// 
// Author Laurent Aphecetche

#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();

  /// Unique instance of this class, which is a singleton
  static AliCodeTimer* Instance();
  
  /// Continue timer(classname,methodname,message)
  void Continue(const char* classname, const char* methodname, const char* message="");

  /// Return the cpu time spent in timer(classname,methodname,message)
  Double_t CpuTime(const char* classname, const char* methodname, const char* message="") const;
  
  /// Print the list of timers we manage
  void Print(Option_t* opt="") const;
  
  /// Return the real time spent in timer(classname,methodname,message)
  Double_t RealTime(const char* classname, const char* methodname, const char* message="") const;
  
  /// Reset all our timers
  void Reset();
  
  /// Start timer(classname,methodname,message)
  void Start(const char* classname, const char* methodname, const char* message="");

  /// Stop timer(classname,methodname,message)
  void Stop(const char* classname, const char* methodname, const char* message="");
    
public:
  
  class AliPair : public TObject
  {
  public:
    AliPair() : TObject(),fName(0), fTimer(0) {}
    // ctor
    AliPair(TObjString* name, TStopwatch* timer) : TObject(), fName(name), fTimer(timer) {}
    virtual ~AliPair() { delete fName; }
    
    /// get name
    TString Name() const { return fName->String(); }
    /// get timer
    TStopwatch* Timer() const { return fTimer; }
    
    /// we are sortable (by name)
    virtual Bool_t IsSortable() const { return kTRUE; }
    /// compare the names
    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; // name of the timer
    TStopwatch* fTimer; // actual timer
    
    ClassDef(AliPair,1) // internal class to hold (string,TStopwatch*) AliPair
  };
    
  class AliAutoPtr
  {
    public:
      
    /// ctor
      AliAutoPtr(const char* classname, const char* methodname, const char* message="") 
      : fA(classname), fB(methodname), fC(message)
      { AliCodeTimer::Instance()->Start(classname,methodname,message); } 

    /// dtor
      ~AliAutoPtr() { AliCodeTimer::Instance()->Stop(fA.Data(),fB.Data(),fC.Data()); }
    
    private:
      TString fA; // first id
      TString fB; // second id
      TString fC; // third id
  };
  
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; //< unique instance
  
  TMap* fTimers; //< internal timers
  
  ClassDef(AliCodeTimer,1) // A timer holder
};

#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
 AliCodeTimer.h:1
 AliCodeTimer.h:2
 AliCodeTimer.h:3
 AliCodeTimer.h:4
 AliCodeTimer.h:5
 AliCodeTimer.h:6
 AliCodeTimer.h:7
 AliCodeTimer.h:8
 AliCodeTimer.h:9
 AliCodeTimer.h:10
 AliCodeTimer.h:11
 AliCodeTimer.h:12
 AliCodeTimer.h:13
 AliCodeTimer.h:14
 AliCodeTimer.h:15
 AliCodeTimer.h:16
 AliCodeTimer.h:17
 AliCodeTimer.h:18
 AliCodeTimer.h:19
 AliCodeTimer.h:20
 AliCodeTimer.h:21
 AliCodeTimer.h:22
 AliCodeTimer.h:23
 AliCodeTimer.h:24
 AliCodeTimer.h:25
 AliCodeTimer.h:26
 AliCodeTimer.h:27
 AliCodeTimer.h:28
 AliCodeTimer.h:29
 AliCodeTimer.h:30
 AliCodeTimer.h:31
 AliCodeTimer.h:32
 AliCodeTimer.h:33
 AliCodeTimer.h:34
 AliCodeTimer.h:35
 AliCodeTimer.h:36
 AliCodeTimer.h:37
 AliCodeTimer.h:38
 AliCodeTimer.h:39
 AliCodeTimer.h:40
 AliCodeTimer.h:41
 AliCodeTimer.h:42
 AliCodeTimer.h:43
 AliCodeTimer.h:44
 AliCodeTimer.h:45
 AliCodeTimer.h:46
 AliCodeTimer.h:47
 AliCodeTimer.h:48
 AliCodeTimer.h:49
 AliCodeTimer.h:50
 AliCodeTimer.h:51
 AliCodeTimer.h:52
 AliCodeTimer.h:53
 AliCodeTimer.h:54
 AliCodeTimer.h:55
 AliCodeTimer.h:56
 AliCodeTimer.h:57
 AliCodeTimer.h:58
 AliCodeTimer.h:59
 AliCodeTimer.h:60
 AliCodeTimer.h:61
 AliCodeTimer.h:62
 AliCodeTimer.h:63
 AliCodeTimer.h:64
 AliCodeTimer.h:65
 AliCodeTimer.h:66
 AliCodeTimer.h:67
 AliCodeTimer.h:68
 AliCodeTimer.h:69
 AliCodeTimer.h:70
 AliCodeTimer.h:71
 AliCodeTimer.h:72
 AliCodeTimer.h:73
 AliCodeTimer.h:74
 AliCodeTimer.h:75
 AliCodeTimer.h:76
 AliCodeTimer.h:77
 AliCodeTimer.h:78
 AliCodeTimer.h:79
 AliCodeTimer.h:80
 AliCodeTimer.h:81
 AliCodeTimer.h:82
 AliCodeTimer.h:83
 AliCodeTimer.h:84
 AliCodeTimer.h:85
 AliCodeTimer.h:86
 AliCodeTimer.h:87
 AliCodeTimer.h:88
 AliCodeTimer.h:89
 AliCodeTimer.h:90
 AliCodeTimer.h:91
 AliCodeTimer.h:92
 AliCodeTimer.h:93
 AliCodeTimer.h:94
 AliCodeTimer.h:95
 AliCodeTimer.h:96
 AliCodeTimer.h:97
 AliCodeTimer.h:98
 AliCodeTimer.h:99
 AliCodeTimer.h:100
 AliCodeTimer.h:101
 AliCodeTimer.h:102
 AliCodeTimer.h:103
 AliCodeTimer.h:104
 AliCodeTimer.h:105
 AliCodeTimer.h:106
 AliCodeTimer.h:107
 AliCodeTimer.h:108
 AliCodeTimer.h:109
 AliCodeTimer.h:110
 AliCodeTimer.h:111
 AliCodeTimer.h:112
 AliCodeTimer.h:113
 AliCodeTimer.h:114
 AliCodeTimer.h:115
 AliCodeTimer.h:116
 AliCodeTimer.h:117
 AliCodeTimer.h:118
 AliCodeTimer.h:119
 AliCodeTimer.h:120
 AliCodeTimer.h:121
 AliCodeTimer.h:122
 AliCodeTimer.h:123
 AliCodeTimer.h:124
 AliCodeTimer.h:125
 AliCodeTimer.h:126
 AliCodeTimer.h:127
 AliCodeTimer.h:128
 AliCodeTimer.h:129
 AliCodeTimer.h:130
 AliCodeTimer.h:131
 AliCodeTimer.h:132
 AliCodeTimer.h:133
 AliCodeTimer.h:134
 AliCodeTimer.h:135
 AliCodeTimer.h:136
 AliCodeTimer.h:137
 AliCodeTimer.h:138
 AliCodeTimer.h:139
 AliCodeTimer.h:140
 AliCodeTimer.h:141
 AliCodeTimer.h:142
 AliCodeTimer.h:143
 AliCodeTimer.h:144
 AliCodeTimer.h:145
 AliCodeTimer.h:146
 AliCodeTimer.h:147
 AliCodeTimer.h:148
 AliCodeTimer.h:149
 AliCodeTimer.h:150
 AliCodeTimer.h:151
 AliCodeTimer.h:152
 AliCodeTimer.h:153
 AliCodeTimer.h:154
 AliCodeTimer.h:155
 AliCodeTimer.h:156
 AliCodeTimer.h:157
 AliCodeTimer.h:158
 AliCodeTimer.h:159