00001 #ifndef __TIME_ACCUMULATOR_H__
00002 #define __TIME_ACCUMULATOR_H__
00003
00004
00005
00006
00007
00008 class Time_Accumulator
00009 {
00010 public:
00011 Time_Accumulator();
00012 ~Time_Accumulator();
00013
00014 void Start();
00015 void Stop();
00016 void Reset();
00017 void Set(const Time_Span & in);
00018
00019 Time_Span Report();
00020 private:
00021
00022 Time_Span _total_time;
00023 Time_Clock *_accum_start;
00024 };
00025
00026
00027
00028
00029 inline void Time_Accumulator::Set(const Time_Span & in)
00030 {
00031 _total_time = in;
00032
00033
00034
00035
00036
00037
00038
00039 if(_accum_start != NULL)
00040 {
00041 Stop();
00042 Start();
00043 }
00044 }
00045
00046
00047
00048
00049 inline Time_Accumulator::Time_Accumulator() : _total_time(0,0,0,0,0), _accum_start(NULL)
00050 {
00051 }
00052
00053
00054
00055
00056 inline Time_Accumulator::~Time_Accumulator()
00057 {
00058 if(_accum_start != NULL)
00059 delete _accum_start;
00060 }
00061
00062
00063
00064
00065 inline void Time_Accumulator::Start()
00066 {
00067 if(_accum_start == NULL)
00068 _accum_start = new Time_Clock();
00069 }
00070
00071
00072
00073
00074 inline void Time_Accumulator::Stop()
00075 {
00076 if(_accum_start != NULL)
00077 {
00078 Time_Span work1(Time_Clock::GetCurrentTime() - *_accum_start);
00079 _total_time += work1;
00080 delete _accum_start;
00081 _accum_start = NULL;
00082 }
00083 }
00084
00085
00086
00087
00088 void Time_Accumulator::Reset()
00089 {
00090 if(_accum_start != NULL)
00091 {
00092 delete _accum_start;
00093 _accum_start = NULL;
00094 }
00095 _total_time.Set(0,0,0,0,0);
00096 }
00097
00098
00099
00100
00101 inline Time_Span Time_Accumulator::Report()
00102 {
00103 Time_Span answer(_total_time);
00104 if(_accum_start != NULL)
00105 {
00106 Time_Span ww(Time_Clock::GetCurrentTime() - *_accum_start);
00107 answer += ww;
00108 }
00109 return answer;
00110 }
00111
00112 #endif //__TIME_ACCUMULATOR_H__
00113