00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#ifndef WFMATH_TIMESTAMP_H
00027
#define WFMATH_TIMESTAMP_H
00028
00029
#include <wfmath/const.h>
00030
#include <algorithm>
00031
00035
#ifdef _MSC_VER
00036
#include <sys/timeb.h>
00037
#else
00038
#include <sys/time.h>
00039
#endif
00040
00041
namespace WFMath {
00042
00043
class TimeStamp;
00044
00046
00051 class TimeDiff
00052 {
00053
TimeDiff(
long sec,
long usec,
bool is_valid);
00054
public:
00056 TimeDiff() : m_isvalid(false) {}
00058
TimeDiff(
long msec);
00059
00060
00062
00066
long milliseconds() const;
00068 std::pair<
long,
long> full_time()
const {
return std::make_pair(m_sec,m_usec);}
00069
00070
bool isValid()
const {
return m_isvalid;}
00071
00073
friend TimeDiff& operator+=(TimeDiff&,
const TimeDiff&);
00075
friend TimeDiff& operator-=(TimeDiff&,
const TimeDiff&);
00077 TimeDiff operator-()
const {
return TimeDiff(-m_sec, -m_usec, m_isvalid);}
00078
00080
friend TimeDiff operator+(
const TimeDiff &a,
const TimeDiff &b);
00082
friend TimeDiff operator-(
const TimeDiff &a,
const TimeDiff &b);
00083
00085
friend TimeStamp& operator+=(
TimeStamp&,
const TimeDiff&);
00087
friend TimeStamp& operator-=(
TimeStamp&,
const TimeDiff&);
00088
00090
friend TimeStamp operator+(
const TimeStamp &a,
const TimeDiff &msec);
00092
friend TimeStamp operator-(
const TimeStamp &a,
const TimeDiff &msec);
00093
00095
friend TimeDiff operator-(
const TimeStamp &a,
const TimeStamp &b);
00096
00097
friend bool operator<(
const TimeDiff&,
const TimeDiff&);
00098
friend bool operator==(
const TimeDiff&,
const TimeDiff&);
00099
00100
private:
00101
bool m_isvalid;
00102
long m_sec, m_usec;
00103 };
00104
00105
inline bool operator>(
const TimeDiff &a,
const TimeDiff &b) {
return b < a;}
00106
inline bool operator<=(
const TimeDiff &a,
const TimeDiff &b) {
return !(b < a);}
00107
inline bool operator>=(
const TimeDiff &a,
const TimeDiff &b) {
return !(a < b);}
00108
inline bool operator!=(
const TimeDiff &a,
const TimeDiff &b) {
return !(b == a);}
00109
00111
00116 class TimeStamp {
00117
private:
00118
#ifdef __WIN32__
00119
00120
struct {
00121
long tv_sec;
00122
long tv_usec;
00123 } _val;
00124
#else
00125
00126
struct timeval _val;
00127
#endif
00128
bool _isvalid;
00129
TimeStamp(
long sec,
long usec,
bool isvalid);
00130
public:
00132 TimeStamp() : _isvalid(false) {}
00133
00134
00135
friend bool operator<(
const TimeStamp &a,
const TimeStamp &b);
00136
friend bool operator==(
const TimeStamp &a,
const TimeStamp &b);
00137
00138
friend std::ostream& operator<<(std::ostream& os,
const TimeStamp&);
00139
friend std::istream& operator>>(std::istream& is,
TimeStamp&);
00140
00141
bool isValid()
const {
return _isvalid;}
00143
friend TimeStamp& operator+=(TimeStamp&,
const TimeDiff&);
00145
friend TimeStamp& operator-=(TimeStamp&,
const TimeDiff&);
00146
00148
friend TimeStamp operator+(
const TimeStamp &a,
const TimeDiff &msec);
00150
friend TimeStamp operator-(
const TimeStamp &a,
const TimeDiff &msec);
00151
00153
friend TimeDiff operator-(
const TimeStamp &a,
const TimeStamp &b);
00154
00156
static TimeStamp
now();
00158
static TimeStamp
epochStart();
00159 };
00160
00162
inline TimeStamp operator+(TimeDiff msec,
const TimeStamp &a) {
return a + msec;}
00163
00164
inline bool operator>(
const TimeStamp &a,
const TimeStamp &b) {
return b < a;}
00165
inline bool operator<=(
const TimeStamp &a,
const TimeStamp &b) {
return !(b < a);}
00166
inline bool operator>=(
const TimeStamp &a,
const TimeStamp &b) {
return !(a < b);}
00167
inline bool operator!=(
const TimeStamp &a,
const TimeStamp &b) {
return !(b == a);}
00168
00169 }
00170
00171
#endif // WFMATH_TIMESTAMP_H