]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Timer.hh
tcp socket disconnecting by remote
[chaz/yoink] / src / Moof / Timer.hh
index 340f79fa15b53b8d762ae730687eaca147315817..4cc848048c5655d38aabe2e89b47d9a9bc9669e4 100644 (file)
@@ -1,30 +1,13 @@
 
-/*******************************************************************************
-
- Copyright (c) 2009, Charles McGarvey
- All rights reserved.
- Redistribution   and   use  in  source  and  binary  forms,  with  or  without
- modification, are permitted provided that the following conditions are met:
-   * Redistributions  of  source  code  must retain the above copyright notice,
-     this list of conditions and the following disclaimer.
-   * Redistributions  in binary form must reproduce the above copyright notice,
-     this  list of conditions and the following disclaimer in the documentation
-     and/or other materials provided with the distribution.
- THIS  SOFTWARE  IS  PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND  ANY  EXPRESS  OR  IMPLIED  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED.  IN  NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR  ANY  DIRECT,  INDIRECT,  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES  (INCLUDING,  BUT  NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES;  LOSS  OF  USE,  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*******************************************************************************/
+/*]  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_
  * Functions for measuring time in a friendly unit.
  */
 
+#include <map>
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+
 #include <Moof/Math.hh>
 
 
 namespace Mf {
 
 
-/**
- * Get the number of seconds since a fixed, arbitrary point in the past.
- * @return Seconds.
- */
+class Timer
+{
+public:
 
-Scalar getTicks();
+       enum Mode
+       {
+               INVALID         = -1,
+               NORMAL          =  0,
+               ACTUAL          =  1,
+               REPEAT          =  2
+       };
 
+       typedef boost::function<void(Timer&,Scalar)> Function;
 
-/**
- * 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.
- */
 
-void sleep(Scalar seconds, bool absolute = false);
+       Timer() :
+               mMode(INVALID) {}
 
+       Timer(const Function& function, Scalar seconds, Mode mode = NORMAL)
+       {
+               init(function, seconds, mode);
+       }
 
-} // namespace Mf
+       ~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();
 
-#endif // _MOOF_TIMER_HH_
 
-/** vim: set ts=4 sw=4 tw=80: *************************************************/
+       /**
+        * 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<unsigned,Timer*>        gTimers;
+};
+
+
+} // namespace Mf
+
+#endif // _MOOF_TIMER_HH_
 
This page took 0.019301 seconds and 4 git commands to generate.