_clock_gettimeofday.h

Go to the documentation of this file.
00001 
00025 /* === S T A R T =========================================================== */
00026 
00027 #ifndef __ETL__CLOCK_GETTIMEOFDAY_H
00028 #define __ETL__CLOCK_GETTIMEOFDAY_H
00029 
00030 /* === H E A D E R S ======================================================= */
00031 
00032 #include <sys/time.h>
00033 #include <cmath>
00034 
00035 /* === M A C R O S ========================================================= */
00036 
00037 /* === T Y P E D E F S ===================================================== */
00038 
00039 /* === C L A S S E S & S T R U C T S ======================================= */
00040 
00041 _ETL_BEGIN_NAMESPACE
00042 
00043 class clock_desc_gettimeofday
00044 {
00045 public:
00046     typedef double value_type;
00047 
00048     inline static bool realtime()
00049     { return true; }
00050 
00051     inline static bool proctime()
00052     { return false; }
00053 
00054     inline static value_type
00055     one_second()
00056     { return 1.0f; }
00057 
00058     inline static value_type precision()
00059     { return one_second()/(value_type)1000000.0f; }
00060 
00061     inline static const char *description()
00062     { return "UNIX gettimeofday()"; };
00063 
00064 protected:
00065     class timestamp : public timeval
00066     {
00067         timestamp(int sec, int usec)
00068         { tv_sec=sec; tv_usec=usec; }
00069         
00070         friend class clock_desc_gettimeofday; 
00071     public:
00072         timestamp() { }
00073         
00074         
00075         inline timestamp operator-(const timestamp &rhs)const
00076         {
00077             timestamp ret;
00078             ret.tv_usec=tv_usec-rhs.tv_usec;
00079             
00080             if(ret.tv_usec<0)
00081             {
00082                 ret.tv_sec=tv_sec-rhs.tv_sec-1;
00083                 ret.tv_usec+=1000000;
00084             }
00085             else
00086                 ret.tv_sec=tv_sec-rhs.tv_sec;
00087             return ret;
00088         }
00089 
00090         inline timestamp operator+(timestamp rhs)const
00091         {
00092             rhs.tv_usec+=tv_usec;
00093             
00094             if(rhs.tv_usec>1000000)
00095             {
00096                 rhs.tv_sec+=tv_sec+1;
00097                 rhs.tv_usec-=1000000;
00098             }
00099             else
00100                 rhs.tv_sec+=tv_sec;
00101             return rhs;
00102         }
00103         
00104         inline bool operator<(const timestamp &rhs)const
00105         { return tv_sec<rhs.tv_sec || tv_usec<rhs.tv_usec; }
00106 
00107         inline bool operator==(const timestamp &rhs)const
00108         { return tv_usec==rhs.tv_usec && tv_sec==rhs.tv_sec; }
00109 
00110         inline bool operator!=(const timestamp &rhs)const
00111         { return tv_usec!=rhs.tv_usec || tv_sec!=rhs.tv_sec; }
00112     };
00113     
00114     static void
00115     get_current_time(timestamp &x)
00116     { gettimeofday(&x,NULL);}
00117 
00118     static timestamp
00119     get_current_time()
00120     { timestamp ret; get_current_time(ret); return ret; }
00121     
00122     static value_type
00123     timestamp_to_seconds(const timestamp &x)
00124     { return (value_type)x.tv_sec + precision()*x.tv_usec; } 
00125 
00126     static timestamp
00127     seconds_to_timestamp(const value_type &x)
00128     { return timestamp((int)floor(x), (int)((x-floor(x))/precision()+0.5)); } 
00129 };
00130 
00131 _ETL_END_NAMESPACE
00132 
00133 /* === E N D =============================================================== */
00134 
00135 #endif
00136 

Generated on Thu Jan 12 22:17:43 2006 for ETL by  doxygen 1.4.6