// Copyright 2020 Siemens Digital Industries Software
// ==================================================
// Copyright 2015
// Siemens Product Lifecycle Management Software Inc.
// All Rights Reserved.
// ==================================================
// Copyright 2020 Siemens Digital Industries Software

/** 
    @file

    Measures the CPU time, real time and the SQL call resources.
*/

#ifndef TEAMCENTER__RESOURCES_HXX
#define TEAMCENTER__RESOURCES_HXX

#include <fclasses/libfclasses_exports.h>

namespace Teamcenter
{
/**
   Measures the CPU time, real time and the SQL call resources.
   
   @code
   Resouces resources;
   resources.start(); // Clear resource accumulators and start timing
   
   // Perform activity to be measured.
   
   resources.stop();   // Stop timing and accumulate resources used
   
   lprintf( "real_time=%08.6f     cpu_time=%08.6f      SQL_count=%d.\n", 
   resources.realTime(), resources.cpuTime(), resources.sqlCount() );
   @endcode
   
   Timing of an activity can be suspended by bracketing untimed steps with
   stop/restart calls. The restart call resumes timing without clearing the
   resource accumulators.
*/
class FCLASSES_API Resources
{
public:
    /**
       Constructor.
    */
    Resources();

    /**
       Destructor.
    */
    ~Resources();

    /**
       Starts the resource measurement process and resets all existing usage measurements to 0.
       <br/>The accumulated usage measurements are acquired as soon as the stop() method is called.
       
       @note The start() method can be called several times.
    */
     void start();

    /**
       Restarts timing without clearing the previous resource usage measurements.
       <br/>The new usage measurements are acquired as soon as the stop() method is called.

       @note The start() method can be called several times.
    */
     void restart();

    /** 
        Stops timing and computes the resource usage measurements.  
    */
     void stop();

    /** 
        Retrieves the accumulated CPU time usage. 
    */
     double cpuTime();

    /**
       Retrieves the accumulated real time usage.
    */
     double realTime();

    /**
       Retrieves the accumulated SQL call usage count.
    */
    int sqlCount();
    
private:
    Resources( const Resources& );
    Resources& operator = ( const Resources& );

    double m_cpu_start;
    double m_cpu_usage;

    double m_real_start;
    double m_real_usage;

    int m_sql_start;
    int m_sql_usage;
};
}
#include <fclasses/libfclasses_undef.h>
#endif
