TimeValue.cpp
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* TimeValue - Encapsulates a time value */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01b,17dec01,nel  Add include symbol for TimeValue.
  7. 01a,08Jul99,aim  created
  8. */
  9. #include "TimeValue.h"
  10. /* Include symbol for diab */
  11. extern "C" int include_vxdcom_TimeValue (void)
  12.     {
  13.     return 0;
  14.     }
  15. TimeValue::~TimeValue ()
  16.     {}
  17. TimeValue::TimeValue ()
  18.     {
  19.     set (0, 0);
  20.     }
  21. TimeValue::TimeValue
  22.     (
  23.     const timeval& tv
  24.     )
  25.     {
  26.     set (tv);
  27.     }
  28. TimeValue::TimeValue
  29.     (
  30.     long seconds,
  31.     long useconds
  32.     )
  33.     {
  34.     set (seconds, useconds);
  35.     }
  36. void
  37. TimeValue::set
  38.     (
  39.     const timeval& tv
  40.     )
  41.     {
  42.     m_tv.tv_sec = tv.tv_sec;
  43.     m_tv.tv_usec = tv.tv_usec;
  44.     normalize ();
  45.     }
  46. void
  47. TimeValue::set
  48.     (
  49.     int sec,
  50.     int usec
  51.     )
  52.     {
  53.     m_tv.tv_sec = sec;
  54.     m_tv.tv_usec = usec;
  55.     normalize ();
  56.     }
  57. int
  58. operator >
  59.     (
  60.     const TimeValue& tv1,
  61.     const TimeValue& tv2
  62.     )
  63.     {
  64.     if (tv1.sec () > tv2.sec ())
  65. return 1;
  66.     else if (tv1.sec () == tv2.sec () && tv1.usec () > tv2.usec ())
  67. return 1;
  68.     else
  69. return 0;
  70.     }
  71. int
  72. operator <
  73.     (
  74.     const TimeValue& tv1,
  75.     const TimeValue& tv2
  76.     )
  77.     {
  78.     return tv2 > tv1;
  79.     }
  80. int
  81. operator <=
  82.     (
  83.     const TimeValue& tv1,
  84.     const TimeValue& tv2
  85.     )
  86.     {
  87.     return tv2 >= tv1;
  88.     }
  89. int
  90. operator >=
  91.     (
  92.     const TimeValue& tv1,
  93.     const TimeValue& tv2
  94.     )
  95.     {
  96.     if (tv1.sec () > tv2.sec ())
  97. return 1;
  98.     else if (tv1.sec () == tv2.sec () && tv1.usec () >= tv2.usec ())
  99. return 1;
  100.     else
  101. return 0;
  102.     }
  103. int
  104. operator ==
  105.     (
  106.     const TimeValue& tv1,
  107.     const TimeValue& tv2
  108.     )
  109.     {
  110.     return (tv1.sec () == tv2.sec () && tv1.usec () == tv2.usec ());
  111.     }
  112. int
  113. operator !=
  114.     (
  115.     const TimeValue& tv1,
  116.     const TimeValue& tv2
  117.     )
  118.     {
  119.     return !(tv1 == tv2);
  120.     }
  121. TimeValue&
  122. TimeValue::operator += (const TimeValue& rhs)
  123.     {
  124.     m_tv.tv_sec += rhs.sec ();
  125.     m_tv.tv_usec += rhs.usec ();
  126.     normalize ();
  127.     return *this;
  128.     }
  129. TimeValue&
  130. TimeValue::operator -= (const TimeValue& rhs)
  131.     {
  132.     m_tv.tv_sec -= rhs.sec ();
  133.     m_tv.tv_usec -= rhs.usec ();
  134.     normalize ();
  135.     return *this;
  136.     }
  137. const TimeValue
  138. operator +
  139.     (
  140.     const TimeValue &lhs,
  141.     const TimeValue &rhs
  142.     )
  143.     {
  144.     return TimeValue (lhs) += rhs;
  145.     }
  146. const TimeValue
  147. operator -
  148.     (
  149.     const TimeValue &lhs,
  150.     const TimeValue &rhs
  151.     )
  152.     {
  153.     return TimeValue (lhs) -= rhs;
  154.     }
  155. void
  156. TimeValue::normalize ()
  157.     {
  158.     static const long ONE_SECOND_IN_USECS = 1000000L;
  159.     if (m_tv.tv_usec >= ONE_SECOND_IN_USECS)
  160. {
  161. do
  162.     {
  163.     m_tv.tv_sec++;
  164.     m_tv.tv_usec -= ONE_SECOND_IN_USECS;
  165.     }
  166. while (m_tv.tv_usec >= ONE_SECOND_IN_USECS);
  167. }
  168.     else if (m_tv.tv_usec <= -ONE_SECOND_IN_USECS)
  169. {
  170. do
  171.     {
  172.     m_tv.tv_sec--;
  173.     m_tv.tv_usec += ONE_SECOND_IN_USECS;
  174.     }
  175. while (m_tv.tv_usec <= -ONE_SECOND_IN_USECS);
  176. }
  177.     if (m_tv.tv_sec >= 1 && m_tv.tv_usec < 0)
  178. {
  179. m_tv.tv_sec--;
  180. m_tv.tv_usec += ONE_SECOND_IN_USECS;
  181. }
  182.     else if (m_tv.tv_sec < 0 && m_tv.tv_usec > 0)
  183. {
  184. m_tv.tv_sec++;
  185. m_tv.tv_usec -= ONE_SECOND_IN_USECS;
  186. }
  187.     }
  188. TimeValue::operator timeval () const
  189.     {
  190.     return m_tv;
  191.     }
  192. TimeValue::operator const timeval* () const
  193.     {
  194.     return reinterpret_cast<const timeval*> (&m_tv);
  195.     }
  196. TimeValue::operator timeval* ()
  197.     {
  198.     return &m_tv;
  199.     }
  200. const TimeValue
  201. TimeValue::now ()
  202.     {
  203.     TimeValue now;
  204.     // XXX no return value checks here??
  205. #ifdef VXDCOM_PLATFORM_VXWORKS
  206.     struct timespec ts;
  207.     ::clock_gettime (CLOCK_REALTIME, &ts);
  208.     now.m_tv.tv_sec = ts.tv_sec;
  209.     now.m_tv.tv_usec = ts.tv_nsec / 1000L; // timespec has nsec, but timeval has usec
  210. #else
  211.     ::gettimeofday (now, 0);
  212. #endif
  213.     return now;
  214.     }
  215. const TimeValue&
  216. TimeValue::zero ()
  217.     {
  218.     static TimeValue zero (0, 0);
  219.     return zero;
  220.     }
  221. long
  222. TimeValue::sec () const
  223.     {
  224.     return m_tv.tv_sec;
  225.     }
  226. long
  227. TimeValue::usec () const
  228.     {
  229.     return m_tv.tv_usec;
  230.     }
  231. static int 
  232. tv_abs (int d)
  233.     { 
  234.     return d > 0 ? d : -d;
  235.     }
  236. ostream&
  237. operator<< (ostream &os, const TimeValue &tv)
  238.     {
  239.     if (tv.usec () < 0 || tv.sec () < 0)
  240. os << "-";
  241.     os << tv_abs (int (tv.sec ()))
  242.        << "."
  243.        << tv_abs (int (tv.usec ()));
  244.     return os;
  245.     }