ETL  0.04.19
_clock_gettimeofday.h
Go to the documentation of this file.
1 
25 /* === S T A R T =========================================================== */
26 
27 #ifndef __ETL__CLOCK_GETTIMEOFDAY_H
28 #define __ETL__CLOCK_GETTIMEOFDAY_H
29 
30 /* === H E A D E R S ======================================================= */
31 
32 #include <sys/time.h>
33 #include <cmath>
34 
35 /* === M A C R O S ========================================================= */
36 
37 /* === T Y P E D E F S ===================================================== */
38 
39 /* === C L A S S E S & S T R U C T S ======================================= */
40 
42 
44 {
45 public:
46  typedef double value_type;
47 
48  inline static bool realtime()
49  { return true; }
50 
51  inline static bool proctime()
52  { return false; }
53 
54  inline static value_type
56  { return 1.0f; }
57 
58  inline static value_type precision()
59  { return one_second()/(value_type)1000000.0f; }
60 
61  inline static const char *description()
62  { return "UNIX gettimeofday()"; };
63 
64 protected:
65  class timestamp : public timeval
66  {
67  timestamp(int sec, int usec)
68  { tv_sec=sec; tv_usec=usec; }
69 
71  public:
72  timestamp() { }
73 
74 
75  inline timestamp operator-(const timestamp &rhs)const
76  {
77  timestamp ret;
78  ret.tv_usec=tv_usec-rhs.tv_usec;
79 
80  if(ret.tv_usec<0)
81  {
82  ret.tv_sec=tv_sec-rhs.tv_sec-1;
83  ret.tv_usec+=1000000;
84  }
85  else
86  ret.tv_sec=tv_sec-rhs.tv_sec;
87  return ret;
88  }
89 
90  inline timestamp operator+(timestamp rhs)const
91  {
92  rhs.tv_usec+=tv_usec;
93 
94  if(rhs.tv_usec>1000000)
95  {
96  rhs.tv_sec+=tv_sec+1;
97  rhs.tv_usec-=1000000;
98  }
99  else
100  rhs.tv_sec+=tv_sec;
101  return rhs;
102  }
103 
104  inline bool operator<(const timestamp &rhs)const
105  { return tv_sec<rhs.tv_sec || tv_usec<rhs.tv_usec; }
106 
107  inline bool operator==(const timestamp &rhs)const
108  { return tv_usec==rhs.tv_usec && tv_sec==rhs.tv_sec; }
109 
110  inline bool operator!=(const timestamp &rhs)const
111  { return tv_usec!=rhs.tv_usec || tv_sec!=rhs.tv_sec; }
112  };
113 
114  static void
116  { gettimeofday(&x,NULL);}
117 
118  static timestamp
120  { timestamp ret; get_current_time(ret); return ret; }
121 
122  static value_type
124  { return (value_type)x.tv_sec + precision()*x.tv_usec; }
125 
126  static timestamp
128  { return timestamp((int)floor(x), (int)((x-floor(x))/precision()+0.5)); }
129 };
130 
132 
133 /* === E N D =============================================================== */
134 
135 #endif
136