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 start();
00077 return val;
00078 }
00079
00084 void
00085 resume()
00086 {
00087 assertion(status_ == e_stopped);
00088 status_ = e_running;
00089 start_time_ = clock();
00090 }
00091
00096 float
00097 stop()
00098 {
00099 assertion(status_ == e_running);
00100 stop_time_ = clock();
00101 total_time_ += (stop_time_ - start_time_);
00102 status_ = e_stopped;
00103 return total_time();
00104 }
00105
00107 float
00108 last_time() const
00109 {
00110 assertion(status_ != e_unknown);
00111 return
00112 status_ == e_stopped ?
00113 float(stop_time_ - start_time_) / CLOCKS_PER_SEC :
00114 float((clock() - start_time_)) / CLOCKS_PER_SEC;
00115 }
00116
00118 float
00119 total_time() const
00120 {
00121 assertion(status_ != e_unknown);
00122 return
00123 status_ == e_stopped ?
00124 float(total_time_) / CLOCKS_PER_SEC :
00125 float(total_time_ + (clock() - start_time_)) / CLOCKS_PER_SEC;
00126 }
00127
00128 private:
00129 bool stopped_;
00130 enum {
00131 e_unknown,
00132 e_stopped,
00133 e_running
00134 } status_;
00135 clock_t total_time_;
00136 clock_t start_time_;
00137 clock_t stop_time_;
00138 };
00139
00140 }
00141
00142 }
00143
00144 #endif // ! OLENA_UTILS_TIMER_HH