Go to the documentation of this file.00001
00013 #include "StopWatch.h"
00014 #include "ticks.h"
00015
00016 using namespace qrk;
00017
00018
00019 struct StopWatch::pImpl
00020 {
00021 enum {
00022 InvalidTicks = -1,
00023 };
00024
00025 int start_ticks_;
00026 int pause_ticks_;
00027
00028
00029 pImpl(void)
00030 {
00031 initialize();
00032 }
00033
00034
00035 void initialize(void)
00036 {
00037 start_ticks_ = InvalidTicks;
00038 pause_ticks_ = InvalidTicks;
00039 }
00040 };
00041
00042
00043 StopWatch::StopWatch(void) : pimpl(new pImpl)
00044 {
00045 }
00046
00047
00048 StopWatch::~StopWatch(void)
00049 {
00050 }
00051
00052
00053 void StopWatch::start(void)
00054 {
00055 if (pimpl->pause_ticks_ != pImpl::InvalidTicks) {
00056
00057 resume();
00058 return;
00059
00060 } else if (pimpl->start_ticks_ != pImpl::InvalidTicks) {
00061
00062 return;
00063
00064 } else {
00065
00066 pimpl->start_ticks_ = qrk::ticks();
00067 }
00068 }
00069
00070
00071 void StopWatch::stop(void)
00072 {
00073 pimpl->initialize();
00074 }
00075
00076
00077 void StopWatch::pause(void)
00078 {
00079 if ((pimpl->pause_ticks_ != pImpl::InvalidTicks) ||
00080 (pimpl->start_ticks_ == pImpl::InvalidTicks)) {
00081
00082 return;
00083 }
00084
00085 pimpl->pause_ticks_ = qrk::ticks();
00086 }
00087
00088
00089 void StopWatch::resume(void)
00090 {
00091
00092 if (pimpl->pause_ticks_ == pImpl::InvalidTicks) {
00093 return;
00094 }
00095
00096 int paused_msec = qrk::ticks() - pimpl->pause_ticks_;
00097 pimpl->start_ticks_ += paused_msec;
00098 pimpl->pause_ticks_ = pImpl::InvalidTicks;
00099 }
00100
00101
00102 int StopWatch::ticks(void)
00103 {
00104 if (pimpl->start_ticks_ == pImpl::InvalidTicks) {
00105
00106 return 0;
00107
00108 } else if (pimpl->pause_ticks_ != pImpl::InvalidTicks) {
00109
00110 return pimpl->pause_ticks_ - pimpl->start_ticks_;
00111
00112 } else {
00113
00114 return qrk::ticks() - pimpl->start_ticks_;
00115 }
00116 }
00117
00118
00119 bool StopWatch::isPause(void)
00120 {
00121 return (pimpl->pause_ticks_ != pImpl::InvalidTicks) ? true : false;
00122 }