//
// $Id: ctimer.cc,v 1.1.1.1 1999-11-26 16:37:21 ansari Exp $
//

#include "machdefs.h"
#include "ctimer.h"

//++
// Class	Timer
// Lib  	Outils++
// include	ctimer.h
//
//	Chronométrage de programmes. Le constructeur mémorise l'heure et
//      le temps CPU, ainsi qu'un message éventuel.
//
//	Split affiche le temps partiel.
//
//	Le destructeur affiche le temps total (CPU, et écoulé).
//    
//      Des macros permettent une utilisation simplifiée :
//      * TIMEF   crée un objet de type Timer, avec le nom de la function 
//	courante comme message. Le temps écoulé sera affiché à la sortie 
//	de la function.
//      * SPLITTIME affiche le temps partiel du compteur crée par TIMEF
//      * TIMEN(nom) permet de donner un autre nom que le nom de la fonction.
//--


//++
// Titre	Constructeurs
//--

//++
// Timer::Timer(const char* name)
//	Crée un objet qui mémorise l'heure et le temps CPU du process courant.
//	Le destructeur affiche les temps écoulé et CPU utilisé.
//--

Timer::Timer(const char* name)
: timerName(name)
{
  cpu0 = cpuSplit = clock();
  elapse0 = elapseSplit = time(0);
}

//++
// Titre	Méthodes
//--

//++
// Timer::Split(const char* comm)
//	Affiche le temps partiel.
//--


void Timer::Split(const char* comm)
{
  time_t elapse = time(0);
  clock_t cpu   = clock();

  float cpuSecT = ((float)cpu - (float)cpu0) / (float)(CLOCKS_PER_SEC);
  float cpuSecP = ((float)cpu - (float)cpuSplit) / (float)(CLOCKS_PER_SEC);
  
  int etm  = elapse - elapseSplit;
  int etmt = elapse - elapse0;

  cout << "***Timing " << (comm ? comm : timerName) << endl;

// Pour des formats comme ca, la syntaxe printf est plus agreable.
// Pour ne pas melanger stdio/iostream (pb de desynchronisation sur
// autres C++ que GNU), on fait un cout << chaine.

  char out[200];
  sprintf(out,"CPU     Time: Total= %g (Partial= %g) Sec.",
	  cpuSecT, cpuSecP);
  cout << out << endl;

  sprintf(out,"Elapsed Time: Total= %02d:%02d:%02d (Partial=%02d:%02d:%02d)",
	  etmt/3600, (etmt%3600)/60, etmt%60, 
	  etm/3600,  (etm%3600)/60,  etm%60);

  cout << out << endl;

  elapseSplit = elapse;
  cpuSplit    = cpu;
}

Timer::~Timer()
{
  Split();
}
