106 lines
3.9 KiB
Plaintext
106 lines
3.9 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Copyright (c) 2012-2015, Jan de Graaf (jan@jlib.nl) //
|
|
// //
|
|
// Permission to use, copy, modify, and/or distribute this software for any purpose with or //
|
|
// without fee is hereby granted, provided that the above copyright notice and this permission //
|
|
// notice appear in all copies. //
|
|
// //
|
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS //
|
|
// SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL //
|
|
// THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES //
|
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE //
|
|
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _JLIB_HEADER_TIMER
|
|
#define _JLIB_HEADER_TIMER
|
|
|
|
/*
|
|
|
|
Template chrono timer class
|
|
|
|
Wraps std chrono basic time functions in a timer object.
|
|
|
|
*/
|
|
|
|
#include <chrono>
|
|
|
|
namespace jlib
|
|
{
|
|
class timer
|
|
{
|
|
public:
|
|
// Constructors
|
|
timer() : m_start(std::chrono::high_resolution_clock::now()) {}
|
|
template<typename rep, typename period> timer(std::chrono::duration<rep, period> duration) : m_start(std::chrono::high_resolution_clock::now())
|
|
{
|
|
m_start -= duration;
|
|
}
|
|
template<typename rep, typename period> timer& operator=(std::chrono::duration<rep, period> duration)
|
|
{
|
|
restart();
|
|
m_start -= duration;
|
|
return *this;
|
|
}
|
|
|
|
inline void restart()
|
|
{
|
|
m_start = std::chrono::high_resolution_clock::now();
|
|
}
|
|
|
|
template<typename dur> inline dur duration() const
|
|
{
|
|
return std::chrono::duration_cast<dur>(std::chrono::high_resolution_clock::now() - m_start);
|
|
}
|
|
|
|
// Simplified get functions
|
|
inline std::chrono::nanoseconds::rep nanoseconds() const
|
|
{
|
|
return duration<std::chrono::nanoseconds>().count();
|
|
}
|
|
inline std::chrono::microseconds::rep microseconds() const
|
|
{
|
|
return duration<std::chrono::microseconds>().count();
|
|
}
|
|
inline std::chrono::milliseconds::rep milliseconds() const
|
|
{
|
|
return duration<std::chrono::milliseconds>().count();
|
|
}
|
|
inline std::chrono::seconds::rep seconds() const
|
|
{
|
|
return duration<std::chrono::seconds>().count();
|
|
}
|
|
inline std::chrono::minutes::rep minutes() const
|
|
{
|
|
return duration<std::chrono::minutes>().count();
|
|
}
|
|
inline std::chrono::hours::rep hours() const
|
|
{
|
|
return duration<std::chrono::hours>().count();
|
|
}
|
|
inline float seconds_float() const
|
|
{
|
|
return duration<std::chrono::duration<float>>().count();
|
|
}
|
|
|
|
// Addition or substraction
|
|
// Allows to add or substract time periods from the timer
|
|
template<typename rep, typename period> inline timer& operator+=(std::chrono::duration<rep, period> duration)
|
|
{
|
|
m_start -= duration;
|
|
return *this;
|
|
}
|
|
template<typename rep, typename period> inline timer& operator-=(std::chrono::duration<rep, period> duration)
|
|
{
|
|
m_start += duration;
|
|
return *this;
|
|
}
|
|
|
|
private:
|
|
std::chrono::high_resolution_clock::time_point m_start;
|
|
};
|
|
}
|
|
|
|
#endif |