text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose:
  //
  // $Workfile:     $
  // $Date:         $
  // $NoKeywords: $
  //=============================================================================//
  #if !defined( MEASURE_SECTION_H )
  #define MEASURE_SECTION_H
  #ifdef _WIN32
  #pragma once
  #endif
  
  
  #include "tier0/fasttimer.h"
  #include "convar.h"
  
  
  // This is the macro to use in your code to measure until the code goes
  //  out of scope
  #if defined( _DEBUG ) || defined( FORCE_MEASURE )
  #define MEASURECODE( description ) \
      static CMeasureSection  _xxx_ms( description ); \
      CMeasureSectionInstance _xxx_ms_inst( &_xxx_ms );
  #else
  #define MEASURECODE( description )
  #endif
  
  
  // ------------------------------------------------------------------------------------ //
  // These things must exist in the executable for the CMeasureSection code to work.
  // ------------------------------------------------------------------------------------ //
  float GetRealTime();    // Get the clock's time.
  
  extern ConVar   game_speeds;
  extern ConVar   measure_resort;
  // ------------------------------------------------------------------------------------ //
  
  
  
  // Called once per frame to allow any necessary measurements to latch
  void ResetTimeMeasurements( void );
  
  //-----------------------------------------------------------------------------
  // Purpose: Accumulates time for the named section
  //-----------------------------------------------------------------------------
  class CMeasureSection
  {
  public:
      // Allows for measuring named section
                          CMeasureSection( const char *name );
      virtual             ~CMeasureSection( void );
  
  
      // Update max value hit
      void                UpdateMax( void );
      // Reset totals
      void                Reset( void );
      // Reset sortable totals
      void                SortReset( void );
      // Get static name of section
      const char          *GetName( void );
  
      // Get accumulated time
      CCycleCount const&  GetTotalTime( void );
  
      CCycleCount const&  GetTime();
  
      CCycleCount const&  GetMaxTime();
  
      // Add in some time
      void                AddTime( CCycleCount const &rCount );
  
      // Get next section in chain
      CMeasureSection     *GetNext( void );
  
      // Get head of list of all sections
      static CMeasureSection *GetList( void );
      // Sort all sections by most time consuming
      static void         SortSections( void );
  
  public:
      // Time when list should be sorted again
      static double       m_dNextResort;
  
  private:
      // Accumulated time for section
      CCycleCount         m_dAccumulatedTime;
  
      // Max time for section
      CCycleCount         m_dMaxTime;
  
      // Elapsed time for section
      CCycleCount         m_dTotalTime;
  
      // Name of section
      const char          *m_pszName;
      // Next section in chain
      CMeasureSection     *m_pNext;
      // Head of section list
      static CMeasureSection *s_pSections;
      // Quick total for doing sorts faster
      static int          s_nCount;
  };
  
  //-----------------------------------------------------------------------------
  // Purpose: On construction marks time and on destruction adds time to
  //  parent CMeasureSection object
  //-----------------------------------------------------------------------------
  class CMeasureSectionInstance
  {
  public:
      // Constructor:  Points to object to accumulate time into
                          CMeasureSectionInstance( CMeasureSection *ms );
      // Destructor:  Latches accumulated time
      virtual             ~CMeasureSectionInstance( void );
  
  private:
      // Time of construction
      CFastTimer          m_Timer;
  
      // Where to place elapsed time
      CMeasureSection     *m_pMS;
  };
  
  #endif // MEASURE_SECTION_H
  