00001 #ifndef CRYPTOPP_HRTIMER_H
00002 #define CRYPTOPP_HRTIMER_H
00003
00004 #include "config.h"
00005 #ifndef HIGHRES_TIMER_AVAILABLE
00006 #include <time.h>
00007 #endif
00008
00009 NAMESPACE_BEGIN(CryptoPP)
00010
00011 #ifdef HIGHRES_TIMER_AVAILABLE
00012 typedef word64 TimerWord;
00013 #else
00014 typedef clock_t TimerWord;
00015 #endif
00016
00017
00018 class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE TimerBase
00019 {
00020 public:
00021 enum Unit {SECONDS = 0, MILLISECONDS, MICROSECONDS, NANOSECONDS};
00022 TimerBase(Unit unit, bool stuckAtZero) : m_timerUnit(unit), m_stuckAtZero(stuckAtZero), m_started(false) {}
00023
00024 virtual TimerWord GetCurrentTimerValue() =0;
00025 virtual TimerWord TicksPerSecond() =0;
00026
00027 void StartTimer();
00028 double ElapsedTimeAsDouble();
00029 unsigned long ElapsedTime();
00030
00031 private:
00032 double ConvertTo(TimerWord t, Unit unit);
00033
00034 Unit m_timerUnit;
00035 bool m_stuckAtZero, m_started;
00036 TimerWord m_start, m_last;
00037 };
00038
00039
00040
00041
00042 class ThreadUserTimer : public TimerBase
00043 {
00044 public:
00045 ThreadUserTimer(Unit unit = TimerBase::SECONDS, bool stuckAtZero = false) : TimerBase(unit, stuckAtZero) {}
00046 TimerWord GetCurrentTimerValue();
00047 TimerWord TicksPerSecond();
00048 };
00049
00050
00051 class CRYPTOPP_DLL Timer : public TimerBase
00052 {
00053 public:
00054 Timer(Unit unit = TimerBase::SECONDS, bool stuckAtZero = false) : TimerBase(unit, stuckAtZero) {}
00055 TimerWord GetCurrentTimerValue();
00056 TimerWord TicksPerSecond();
00057 };
00058
00059 NAMESPACE_END
00060
00061 #endif