summaryrefslogtreecommitdiff
path: root/libs/cassowary/cassowary/timer.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/cassowary/cassowary/timer.h')
-rw-r--r--libs/cassowary/cassowary/timer.h176
1 files changed, 176 insertions, 0 deletions
diff --git a/libs/cassowary/cassowary/timer.h b/libs/cassowary/cassowary/timer.h
new file mode 100644
index 0000000000..6bad1a6fef
--- /dev/null
+++ b/libs/cassowary/cassowary/timer.h
@@ -0,0 +1,176 @@
+/* $Id$ */
+#ifndef _TIMER_H_
+#define _TIMER_H_
+
+// Programmer: John P. Russo
+// --------------------------
+// John Russo has given permission to any of my students to use his
+// "timer" class.
+//
+// Please give full credit to him any time you wish to use this class.
+// Hossein Hakimzadeh 11/5/96
+
+/************************** timer.cpp **********************************
+
+ A simple example that shows how C++ classes can be used to implement
+ a "Timer" object, which mimics the familiar actions of a stopwatch.
+
+ The code relies heavily on the clock() function defined in the time
+ library. The clock() function returns the number of "ticks" that have
+ elapsed since a program starts. The size of a "tick" is compiler
+ dependent, but for PC compilers is about 1/18 second.
+
+ The problem with the clock function is that it is not convenient to
+ use for typical timing operations. The timer class, defined below, by
+ contrast, shows that an object-oriented approach to modules can
+ provide tools that are natural and easy to use.
+
+= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
+#include <time.h>
+
+class Timer
+{
+ //==================== public section ================================
+
+ // The functions and/or data in the public section of a class are
+ // accessible to anyone who uses the Timer class.
+
+public:
+ Timer(); // Constructor, used to declare Timer objects
+ void Start(); // Starts a timer object
+ void Stop(); // Stop a timer object
+ void Reset(); // Reset timer object
+ int IsRunning(); // Is the timer object running?
+ double ElapsedTime(); // How much time has been recorded?
+ double Resolution(); // Shortest measurable amount of time
+
+ //-------------------- private section -------------------------------
+
+ // The functions and/or data in the private section of a class are NOT
+ // accessible to those who use the Timer class. They are accessible by
+ // member functions of the class. This allows access to the data to be
+ // carefully controlled.
+
+private:
+ long StartReading; // Number of ticks when timer object last started.
+ long ElapsedTicks; // Number of ticks on timer object.
+ int TimerIsRunning; // 1 if and only if timer object is running.
+ double TicksPerSecond() // This inline function is used to convert
+// {return 18.206481;} // "ticks" (returned by clock() ) to seconds.
+ {return CLOCKS_PER_SEC;} // "ticks" (returned by clock() ) to seconds.
+ // In most UNIX systems this is 1000000
+};
+
+/**************************** Start ************************************
+
+ If the declaration "Timer StopWatch;" has been made, the the call,
+ "StopWatch.Start();" is like push the start button of a real stopwatch.
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+void Timer::Start()
+{
+ TimerIsRunning = 1; // Stopwatch is now running
+ StartReading = clock(); // Look at internal clock and remember reading
+}
+
+/**************************** Stop ************************************
+
+ Looks at the PC's internal clock and computes the number of ticks that
+ have elapsed since the timer was started.
+
+ Note that if a timer is not reset, it can be used to time several events
+ and return the elapsed time for the enter set of events.
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+void Timer::Stop()
+{
+ TimerIsRunning = 0; // Stop timer object.
+ ElapsedTicks += clock() - StartReading; // Add elapsed time to the
+} // previous time.
+
+/**************************** Reset ************************************
+
+ Clears a Timer of previous elapsed times, so that a new event can be
+ timed.
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+void Timer::Reset()
+{
+ TimerIsRunning = 0; // Start not yet called.
+ ElapsedTicks = 0; // No time on timer object yet.
+}
+
+/************************** IsRunning ************************************
+
+ The data member, "TimerIsRunning" is used to keep track of whether a
+ timer is active, i.e. whether an event is being timed. While we want
+ those using the timer class to know when a timer is active, we do NOT
+ want them to directly access the TimerIsRunning variable. We solve this
+ problem, by making TimerIsRunning private and providing the public
+ "access function" below.
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+int Timer::IsRunning()
+{
+ return TimerIsRunning;
+}
+
+/************************* ElapsedTime ***********************************
+
+ This function allows a client to determine the amount of time that has
+ elapsed on a timer object. Note that there are two possibilities:
+
+ 1) A timer object has been started and stopped. We can detect this
+ case, because the variable "TimerIsRunning" is false.
+
+ 2) A timer object is "running", i.e. is still in the process of timing
+ an event. It is not expected that this case will occur as frequently
+ as case 1).
+
+ In either case, this function converts ticks to seconds. Note that
+ since the function TicksPerSecond() returns a value of type double,
+ an implicit type conversion takes place before doing the division
+ required in either case.
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+double Timer::ElapsedTime()
+{
+ if ( !TimerIsRunning ) // Normal case
+ return ElapsedTicks/TicksPerSecond();
+
+ else
+ return (ElapsedTicks + clock() - StartReading)/TicksPerSecond();
+}
+
+/************************** Resolution ***********************************
+
+ Althould we have no way of knowing how accurate the internal clock is,
+ we can predict its resolution, which is the shortest event that can be
+ measured by the clock.
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+double Timer::Resolution()
+{
+ return 1/TicksPerSecond(); // Note 1 is coverted to 1.0 before division
+}
+
+/******************** Timer (constructor) *******************************
+
+ A "constructor" is a special class member function, one which has the
+ same name as the class. The "default constructor" is a constructor that
+ has no parameters. A constructor is called automatically when an
+ instance of a class is declared. For example, the constructor defined
+ below is called when the declaration "Timer T;" is executed.
+
+ If the programmer does not write a default constructor, then the
+ compiler will generate one automatically. However, by writing the
+ constructor below, we provide automatic initialization of timer objects.
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+Timer::Timer()
+{
+ TimerIsRunning = 0; // Start not yet called.
+ ElapsedTicks = 0; // No time on timer object yet.
+}
+
+#endif /* _TIMER_H_ */