#ifndef INCLUDE_NASTBENCHMARK_H
#define INCLUDE_NASTBENCHMARK_H
//-----------------------------------------------------------------------------
// NastBenchmark.h
//-----------------------------------------------------------------------------
//
//  Copyright (C) 1998 Technische Universitaet Muenchen, Germany
//                   written by Bernhard Brueck
//
//  This file is part of Nast++
//
//-----------------------------------------------------------------------------
//  CNastBenchmark ermoeglicht die Messung von Resourcenbedarf.
//  Vorerst ist nur eine Zeitmessung implementiert. Man kann die Klasse
//  aber ohne Probleme z.B. auf Speicherbedarf erweitern.
//
//  Start() startet die Messung
//  Stop()  endet die Messung 
//          danach kann wieder Start() aufgerufen werden,
//          um die Werte zu summieren
//  Reset() setzt alle Werte auf Null zurueck
//
//  timeUser(), timeSystem(), timeReal()
//          liefert nach der Messung die verbraucht Zeit getrennt nach Zeit
//          im Usermodus, in Systemaufrufen und der echt vergangenen Zeit.
//
//  Unix:
//     fuer die User- und die Systemzeit wird times(...) verwendet.
//     fuer die reale Zeit wird getttimeofday(...)
//
//  NT:
//     Unter NT ist es sehr aufwendig genaue Werte zu bekommen.
//     Man muss ueber die Registry die Performancecounter abfragen.
//     Es gibt ein Beispiel dafuer in den MSVC 4.0 samples     
//     samples/sdk/sdktools/winnt/pviewer
//     Hier wurde die ungenaue Variante gewaehlt, indem die Userzeit
//     ueber clock() erfragt wird , die Systemzeit immer auf 0 gesetzt ist
//     und die reale Zeit ueber _ftime erfragt wird.
//-----------------------------------------------------------------------------
//  Aenderungen:
//     

#include "NastConfig.h"
#include "NastObject.h"

class CNastBenchmark : public CNastObject
{
public:
    //-------------------------------------------------------------------------
    //                         Konstruktor + Destruktor
    //-------------------------------------------------------------------------

    CNastBenchmark();
    virtual ~CNastBenchmark();			                 //  Destruktor

    //-------------------------------------------------------------------------
    //  Memberfunktionen
    //-------------------------------------------------------------------------

    void start();		// startet die Messung
    void stop();		// beendet die Messung
    void reset();		// alle Werte zuruecksetzen

    double timeUser()   const;	// verbrauchte CPU-Zeit im Usermodus
    double timeSystem() const;	// verbrauchte CPU-Zeit in Systemaufrufen
    double timeReal()   const;	// insgesamt verbraucht Zeit

    //-------------------------------------------------------------------------
    //                                  Debug
    //-------------------------------------------------------------------------
    //  debugInfo    gibt Information ueber den Zustand des Objekts aus
    //  assertValid  testet das Objekt auf Integritaet
    //
    virtual void debugDump( CNastDumpContext &dumpContext ) const;
    virtual void assertValid() const;


private:
    CNastBenchmark( const CNastBenchmark & o);	                //  nicht impl.
    const CNastBenchmark& operator=( const CNastBenchmark &o ); //  nicht impl.

    //-------------------------------------------------------------------------
    //                            Membervariablen
    //-------------------------------------------------------------------------
    
    //  Zeitpunkt des letzten start()
    double m_stampUser;	     // in 1/CLOCKS_PER_SEC
    double m_stampSystem;    // in 1/CLOCKS_PER_SEC
    double m_stampReal;      // in Sekunden

    //  aufsummierte Werte in 1/CLOCKS_PER_SEC
    double m_sumUser;	    // in 1/CLOCKS_PER_SEC
    double m_sumSystem;	    // in 1/CLOCKS_PER_SEC
    double m_sumReal;	    // Sekunden

    bool m_bIsActive;  // true falls gerade eine Messung gemacht wird
};
#endif // INCLUDE_NASTBENCHMARK_H

