All Classes Namespaces Files Functions Variables Enumerations Enumerator
libs/system/StopWatch.cpp
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 }