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)
00023 : m_timerUnit(unit), m_stuckAtZero(stuckAtZero), m_started(false)
00024 , m_start(0), m_last(0) {}
00025
00026 virtual TimerWord GetCurrentTimerValue() =0;
00027 virtual TimerWord TicksPerSecond() =0;
00028
00029 void StartTimer();
00030 double ElapsedTimeAsDouble();
00031 unsigned long ElapsedTime();
00032
00033 private:
00034 double ConvertTo(TimerWord t, Unit unit);
00035
00036 Unit m_timerUnit;
00037 bool m_stuckAtZero, m_started;
00038 TimerWord m_start, m_last;
00039 };
00040
00041
00042
00043
00044 class ThreadUserTimer : public TimerBase
00045 {
00046 public:
00047 ThreadUserTimer(Unit unit = TimerBase::SECONDS, bool stuckAtZero = false) : TimerBase(unit, stuckAtZero) {}
00048 TimerWord GetCurrentTimerValue();
00049 TimerWord TicksPerSecond();
00050 };
00051
00052
00053 class CRYPTOPP_DLL Timer : public TimerBase
00054 {
00055 public:
00056 Timer(Unit unit = TimerBase::SECONDS, bool stuckAtZero = false) : TimerBase(unit, stuckAtZero) {}
00057 TimerWord GetCurrentTimerValue();
00058 TimerWord TicksPerSecond();
00059 };
00060
00061 NAMESPACE_END
00062
00063 #endif