// Matrix Construct // // Copyright (C) Matrix Construct Developers, Authors & Contributors // Copyright (C) 2016-2018 Jason Volk // // 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 is present in all copies. The // full license for this software is available in the LICENSE file. #pragma once #define HAVE_IRCD_UTIL_TIMER_H namespace ircd::util { struct timer; } struct ircd::util::timer { IRCD_OVERLOAD(nostart) using clock = std::chrono::steady_clock; nanoseconds accumulator; clock::time_point start; bool stopped() const; template duration get() const; template duration at() const; void cont(); void stop(); timer(const std::function &); timer(nostart_t); timer(); }; /// Default construction will start the timer. inline ircd::util::timer::timer() :accumulator{0ns} ,start{clock::now()} { } /// timer(timer::nostart) inline ircd::util::timer::timer(nostart_t) :accumulator{0ns} ,start{clock::time_point::min()} { } inline ircd::util::timer::timer(const std::function &func) :timer{} { func(); stop(); } inline void ircd::util::timer::stop() { if(stopped()) return; const auto now(clock::now()); accumulator += std::chrono::duration_cast(now - start); start = clock::time_point::min(); } inline void ircd::util::timer::cont() { if(!stopped()) { const auto now(clock::now()); accumulator += std::chrono::duration_cast(now - start); } start = clock::now(); } template duration ircd::util::timer::at() const { const auto now(clock::now()); return duration_cast(now - start); } template duration ircd::util::timer::get() const { return std::chrono::duration_cast(accumulator); } inline bool ircd::util::timer::stopped() const { return start == clock::time_point::min(); }