/*] Copyright (c) 2009-2010, Charles McGarvey [************************** **] All rights reserved. * * vi:ts=4 sw=4 tw=75 * * Distributable under the terms and conditions of the 2-clause BSD license; * see the file COPYING for a complete text of the license. * **************************************************************************/ #ifndef _MOOF_TIMER_HH_ #define _MOOF_TIMER_HH_ /** * @file Timer.hh * Functions for measuring time in a friendly unit. */ #include #include #include #include namespace Mf { class Timer { public: enum Mode { INVALID = -1, NORMAL = 0, ACTUAL = 1, REPEAT = 2 }; typedef boost::function Function; Timer() : mMode(INVALID) {} Timer(const Function& function, Scalar seconds, Mode mode = NORMAL) { init(function, seconds, mode); } ~Timer() { invalidate(); } void init(const Function& function, Scalar seconds, Mode mode = NORMAL); bool isValid() const; void invalidate(); void fire(); Scalar getSecondsRemaining() const; bool isExpired() const; bool isRepeating() const; /** * Get the number of seconds since a fixed, arbitrary point in the * past. * @return Seconds. */ static Scalar getTicks(); /** * Put the thread to sleep for a certain period of time. If absolute * is true, then it will sleep until seconds after the fixed time in * the past. If absolute is false, it will sleep for seconds starting * now. Unlike system sleep functions, this one automatically resumes * sleep if sleep was interrupted by a signal. Therefore, calling this * function is guaranteed to sleep for the requested amount of time * (and maybe longer). */ static void sleep(Scalar seconds, Mode mode = NORMAL); static Scalar getNextFire() { return gNextFire; } static void fireIfExpired(); static void fireIfExpired(Scalar t); private: static unsigned getNewID(); static Scalar findNextFire(); Function mFunction; Mode mMode; Scalar mAbsolute; Scalar mInterval; unsigned mId; static Scalar gNextFire; static std::map gTimers; }; } // namespace Mf #endif // _MOOF_TIMER_HH_