timeval.h
上传用户:psq1974
上传日期:2007-01-06
资源大小:1195k
文件大小:5k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /* Copyright (C) 1998, 1999 State University of New York at Stony Brook
  2.    Author: Andrew V. Shuvalov ( andrew@ecsl.cs.sunysb.edu )
  3.    Software license is located in file "COPYING"
  4. */
  5. #ifndef _timeval_h_
  6. #define _timeval_h_
  7. //! author="Andrew V. Shuvalov"
  8. #ifdef _WIN32
  9. # include <winbase.h>
  10. #endif
  11. #ifdef _WIN32
  12. # define STD std:: 
  13. #else
  14. # define STD /* */
  15. #endif
  16. /** hides all operations with struct timeval
  17.  */
  18. class Timeval {
  19.   struct timeval value;
  20. public:
  21.   Timeval() {}
  22.   Timeval( const Timeval &t ) 
  23.     {
  24.       *this = t;
  25.     }
  26.   Timeval( const struct timeval &tv ) : value( tv ) {}
  27.   Timeval( long s, long us ) { value.tv_sec = s; value.tv_usec = us; }
  28.   operator const struct timeval &() const { return value; }
  29.   operator const struct timeval *() const { return &value; }
  30.   struct timeval &val() { return value; }
  31.   
  32.   bool operator <( const Timeval &tv ) const 
  33.     {
  34.       if( value.tv_sec == tv.value.tv_sec ) {
  35. if( value.tv_usec < tv.value.tv_usec )
  36.   return true;
  37. else 
  38.   return false;
  39.       }
  40.       if( value.tv_sec < tv.value.tv_sec ) 
  41. return true;
  42.       else 
  43. return false;
  44.     }    
  45.   bool operator <( const struct timeval &tv ) const 
  46.     {
  47.       if( value.tv_sec == tv.tv_sec ) {
  48. if( value.tv_usec < tv.tv_usec )
  49.   return true;
  50. else 
  51.   return false;
  52.       }
  53.       if( value.tv_sec < tv.tv_sec ) 
  54. return true;
  55.       else 
  56. return false;
  57.     } 
  58.   /** compare with now */
  59.   bool reached() {
  60.     Timeval now;
  61.     now.now();
  62.     return *this < now;
  63.   }
  64.   const Timeval &operator =( const struct timeval &tv ) {
  65.     value = tv;
  66.     return *this;
  67.   }
  68.   const Timeval &operator =( const Timeval &tv ) {
  69.     if( this != &tv ) 
  70.       value = tv;
  71.     return *this;
  72.   }
  73.   void normalize()
  74.     {
  75.       if( value.tv_usec > 0 )
  76. {
  77.   value.tv_sec = value.tv_sec + value.tv_usec / 1000000;
  78.   value.tv_usec = value.tv_usec % 1000000;
  79. }
  80.       else
  81. {
  82.   value.tv_sec = value.tv_sec + value.tv_usec / 1000000;
  83.   value.tv_usec = 1000000 - ( -value.tv_usec % 1000000 );
  84. }
  85.     }
  86.   // if result is negative, it is not garanteed to be normalized; usec
  87.   // is garanteed to be positive
  88.   // !!! In Linux 2.2 tv_sec is time_t, may not be negative !!!
  89.   Timeval operator -( const Timeval &tv ) const {
  90.     Timeval result;
  91.     result.value.tv_sec = value.tv_sec - tv.value.tv_sec;
  92.     result.value.tv_usec = value.tv_usec - tv.value.tv_usec;
  93.     while( result.value.tv_usec > 1000000 ) {
  94.       result.value.tv_usec -= 1000000;
  95.       result.value.tv_sec ++;
  96.     }
  97.     while( result.value.tv_usec < 0 ) {
  98.       result.value.tv_usec += 1000000;
  99.       result.value.tv_sec --;
  100.     }
  101.     return result;
  102.   }
  103.   Timeval operator +( const Timeval &tv ) const {
  104.     Timeval result;
  105.     result.value.tv_sec = value.tv_sec + tv.value.tv_sec;
  106.     result.value.tv_usec = value.tv_usec + tv.value.tv_usec;
  107.     while( result.value.tv_usec > 1000000 ) {
  108.       result.value.tv_usec -= 1000000;
  109.       result.value.tv_sec ++;
  110.     }
  111.     return result;
  112.   }
  113.   // multiply time offset by float koeff, 0 <= k
  114.   const Timeval &operator *=( float k ) 
  115.     {
  116.       value.tv_usec = ( long )( value.tv_sec * k * 1000000 +
  117. value.tv_usec * k );
  118.       value.tv_sec = value.tv_usec / 1000000;
  119.       value.tv_usec = value.tv_usec % 1000000;
  120.       return *this;
  121.     }
  122.   // multiply time offset by int koeff, k > 1
  123.   const Timeval &operator *=( unsigned int k ) 
  124.     {
  125.       value.tv_usec = ( long )( value.tv_sec * k * 1000000 +
  126. value.tv_usec * k );
  127.       value.tv_sec = value.tv_usec / 1000000;
  128.       value.tv_usec = value.tv_usec % 1000000;
  129.       return *this;
  130.     }
  131.   long int &tv_sec() { return value.tv_sec; }
  132.   const long int &tv_sec() const { return value.tv_sec; }
  133.   long int &tv_usec() { return value.tv_usec; }
  134.   const long int &tv_usec() const { return value.tv_usec; }
  135.   Timeval &now() 
  136.     {
  137. #     ifndef _WIN32  // is how normal people do it:
  138.       gettimeofday( &value, NULL );
  139. #     else
  140.       FILETIME ft;
  141.       GetSystemTimeAsFileTime( &ft );
  142.       // measured in 1/10 millisecond
  143.       // 31536000 sec per year
  144.       unsigned _int64 tim = 
  145. ((unsigned _int64)ft.dwHighDateTime << 32 ) | ft.dwLowDateTime;
  146.       value.tv_sec = tim / 10000000 - 12531803899; // some adjustement
  147.       value.tv_usec = tim % 10000000;
  148. #     endif
  149.       return *this;
  150.     }
  151.   /** describe itself ( for debug ) */
  152.   const STD string get_description() const 
  153.     {
  154.       static char buf[100];
  155. #     ifndef _WIN32  // is how normal people do it:
  156.         snprintf
  157. #     else
  158.         _snprintf
  159. #     endif
  160.         ( buf, sizeof( buf ), "%d sec, %d usec ", value.tv_sec, 
  161.   value.tv_usec );
  162. return STD string( buf );
  163.     }
  164. };
  165. //: prints itself
  166. inline ostream &operator <<( ostream &os, const Timeval &t )
  167. {
  168.   char buf[100];
  169. # ifndef _WIN32  // is how normal people do it:
  170.   snprintf
  171. # else
  172.   _snprintf
  173. # endif
  174.    ( buf, sizeof( buf ), "%d sec, %d usec ", t.tv_sec(), t.tv_usec() );
  175.   os << buf;
  176.   return os;
  177. }
  178. #endif  //  _timeval_h_