00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OLENA_UTILS_TIMER_HH
00029 # define OLENA_UTILS_TIMER_HH
00030
00031 # include <mlc/contract.hh>
00032 # include <time.h>
00033
00034 namespace oln {
00035
00036 namespace utils {
00039 class timer
00040 {
00041 public:
00047 timer()
00048 {
00049 status_ = e_unknown;
00050 total_time_ = 0;
00051 start_time_ = clock();
00052 }
00053
00058 void
00059 start()
00060 {
00061 assertion(status_ != e_running);
00062 total_time_ = 0;
00063 stop_time_ = 0;
00064 status_ = e_running;
00065 start_time_ = clock();
00066 }
00071 float
00072 restart()
00073 {
00074 assertion(status_ != e_unknown);
00075 float val = total_time();
00076 status_ = e_stopped;
00077 start();
00078 return val;
00079 }
00080
00085 void
00086 resume()
00087 {
00088 assertion(status_ == e_stopped);
00089 status_ = e_running;
00090 start_time_ = clock();
00091 }
00092
00097 float
00098 stop()
00099 {
00100 assertion(status_ == e_running);
00101 stop_time_ = clock();
00102 total_time_ += (stop_time_ - start_time_);
00103 status_ = e_stopped;
00104 return total_time();
00105 }
00106
00108 float
00109 last_time() const
00110 {
00111 assertion(status_ != e_unknown);
00112 return
00113 status_ == e_stopped ?
00114 float(stop_time_ - start_time_) / CLOCKS_PER_SEC :
00115 float((clock() - start_time_)) / CLOCKS_PER_SEC;
00116 }
00117
00119 float
00120 total_time() const
00121 {
00122 assertion(status_ != e_unknown);
00123 return
00124 status_ == e_stopped ?
00125 float(total_time_) / CLOCKS_PER_SEC :
00126 float(total_time_ + (clock() - start_time_)) / CLOCKS_PER_SEC;
00127 }
00128
00129 private:
00130 bool stopped_;
00131 enum {
00132 e_unknown,
00133 e_stopped,
00134 e_running
00135 } status_;
00136 clock_t total_time_;
00137 clock_t start_time_;
00138 clock_t stop_time_;
00139 };
00140
00141 }
00142
00143 }
00144
00145 #endif // ! OLENA_UTILS_TIMER_HH