# Program Listing for File TicToc.cc

↰ Return to documentation for file (`TicToc.cc`)

    /*--------------------------------------------------------------------------*\
     |                                                                          |
     |  Copyright (C) 2017                                                      |
     |                                                                          |
     |         , __                 , __                                        |
     |        /|/  \               /|/  \                                       |
     |         | __/ _   ,_         | __/ _   ,_                                |
     |         |   \|/  /  |  |   | |   \|/  /  |  |   |                        |
     |         |(__/|__/   |_/ \_/|/|(__/|__/   |_/ \_/|/                       |
     |                           /|                   /|                        |
     |                           \|                   \|                        |
     |                                                                          |
     |      Enrico Bertolazzi                                                   |
     |      Dipartimento di Ingegneria Industriale                              |
     |      Universita` degli Studi di Trento                                   |
     |      Via Sommarive 9, I-38123 Povo, Trento, Italy                        |
     |      email: enrico.bertolazzi@unitn.it                                   |
     |                                                                          |
    \*--------------------------------------------------------------------------*/

    #include "Utils.hh"

    #ifdef UTILS_OS_WINDOWS

    #include <windows.h>

    namespace Utils {

      #define TOINT64(A) (static_cast<int64_t>(A.HighPart) << 32) | A.LowPart

      TicToc::TicToc() : m_elapsed_time(0) {
        LARGE_INTEGER frequency;
        QueryPerformanceFrequency(&frequency);
        m_frequency = frequency.QuadPart;
        tic();
      }

      void
      TicToc::tic() {
        LARGE_INTEGER t1;
        QueryPerformanceCounter(&t1);
        m_t1 = t1.QuadPart;
      }

      void
      TicToc::toc() {
        LARGE_INTEGER t2;
        QueryPerformanceCounter(&t2);
        m_t2 = t2.QuadPart;
        m_elapsed_time = (m_t2 - m_t1) * 1000.0 / m_frequency;
        ;
      }

      void
      sleep_for_seconds( unsigned s ) {
        Sleep(DWORD(s) * 1000);
      }

      void
      sleep_for_milliseconds( unsigned ms ) {
        Sleep(DWORD(ms));
      }
    }

    #else

    namespace Utils {

      void
      TicToc::tic()
      { m_start_time = clock::now(); }

      void
      TicToc::toc() {
        m_stop_time    = clock::now();
        m_elapsed_time = std::chrono::duration_cast<elapsed_resolution>(m_stop_time - m_start_time);
      }

      typename TicToc::real_type
      TicToc::elapsed_s() const
      { return 1e-6*m_elapsed_time.count(); }

      typename TicToc::real_type
      TicToc::elapsed_ms() const
      { return 1e-3*m_elapsed_time.count(); }
    }

    #endif