time.h revision 58537e28ecd584eab876aee8be7156509866d23a
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Time represents an absolute point in time, internally represented as
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// microseconds (s/1,000,000) since the Windows epoch (1601-01-01 00:00:00 UTC)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (See http://crbug.com/14734).  System-dependent clock interface routines are
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// defined in time_PLATFORM.cc.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TimeDelta represents a duration of time, internally represented in
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// microseconds.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TimeTicks represents an abstract time that is most of the time incrementing
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for use in measuring time durations. It is internally represented in
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// microseconds.  It can not be converted to a human-readable time, but is
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// guaranteed not to decrease (if the user changes the computer clock,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Time::Now() may actually decrease or jump).  But note that TimeTicks may
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "stand still", for example if the computer suspended.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These classes are represented as only a 64-bit value, so they can be
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// efficiently passed by value.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef BASE_TIME_TIME_H_
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define BASE_TIME_TIME_H_
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <time.h>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "build/build_config.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <CoreFoundation/CoreFoundation.h>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Avoid Mac system header macro leak.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef TYPE_BOOL
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <unistd.h>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/time.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For FILETIME in FromFileTime, until it moves to a new converter class.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See TODO(iyengar) below.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits>
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Time;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TimeTicks;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TimeDelta ------------------------------------------------------------------
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT TimeDelta {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta() : delta_(0) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts units of time to TimeDeltas.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeDelta FromDays(int64 days);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeDelta FromHours(int64 hours);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeDelta FromMinutes(int64 minutes);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeDelta FromSeconds(int64 secs);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeDelta FromMilliseconds(int64 ms);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeDelta FromMicroseconds(int64 us);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeDelta FromQPCValue(LONGLONG qpc_value);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts an integer value representing TimeDelta to a class. This is used
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when deserializing a |TimeDelta| structure, using a value known to be
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // compatible. It is not provided as a constructor because the integer type
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may be unclear from the perspective of a caller.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeDelta FromInternalValue(int64 delta) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeDelta(delta);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the internal numeric value of the TimeDelta object. Please don't
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use this and do arithmetic on it, as it is more error prone than using the
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // provided operators.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For serializing, use FromInternalValue to reconstitute.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 ToInternalValue() const {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delta_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct timespec ToTimeSpec() const;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the time delta in some unit. The F versions return a floating
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // point value, the "regular" versions return a rounded-down value.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InMillisecondsRoundedUp() instead returns an integer that is rounded up
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the next full millisecond.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int InDays() const;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int InHours() const;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int InMinutes() const;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double InSecondsF() const;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 InSeconds() const;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double InMillisecondsF() const;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 InMilliseconds() const;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 InMillisecondsRoundedUp() const;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 InMicroseconds() const;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta& operator=(TimeDelta other) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delta_ = other.delta_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Computations with other deltas.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta operator+(TimeDelta other) const {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeDelta(delta_ + other.delta_);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta operator-(TimeDelta other) const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeDelta(delta_ - other.delta_);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta& operator+=(TimeDelta other) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delta_ += other.delta_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta& operator-=(TimeDelta other) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delta_ -= other.delta_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta operator-() const {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeDelta(-delta_);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Computations with ints, note that we only allow multiplicative operations
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with ints, and additive operations with other deltas.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta operator*(int64 a) const {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeDelta(delta_ * a);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta operator/(int64 a) const {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeDelta(delta_ / a);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta& operator*=(int64 a) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delta_ *= a;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta& operator/=(int64 a) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delta_ /= a;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 operator/(TimeDelta a) const {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delta_ / a.delta_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Defined below because it depends on the definition of the other classes.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time operator+(Time t) const;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks operator+(TimeTicks t) const;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Comparison operators.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(TimeDelta other) const {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delta_ == other.delta_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator!=(TimeDelta other) const {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delta_ != other.delta_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator<(TimeDelta other) const {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delta_ < other.delta_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator<=(TimeDelta other) const {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delta_ <= other.delta_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator>(TimeDelta other) const {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delta_ > other.delta_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator>=(TimeDelta other) const {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delta_ >= other.delta_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class Time;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class TimeTicks;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend TimeDelta operator*(int64 a, TimeDelta td);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a delta given the duration in microseconds. This is private
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to avoid confusion by callers with an integer constructor. Use
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FromSeconds, FromMilliseconds, etc. instead.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TimeDelta(int64 delta_us) : delta_(delta_us) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delta in microseconds.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 delta_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta operator*(int64 a, TimeDelta td) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeDelta(a * td.delta_);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Time -----------------------------------------------------------------------
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents a wall clock time.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT Time {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kMillisecondsPerSecond = 1000;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kMicrosecondsPerMillisecond = 1000;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kMicrosecondsPerSecond = kMicrosecondsPerMillisecond *
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              kMillisecondsPerSecond;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kMicrosecondsPerMinute = kMicrosecondsPerSecond * 60;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kMicrosecondsPerHour = kMicrosecondsPerMinute * 60;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kMicrosecondsPerDay = kMicrosecondsPerHour * 24;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kMicrosecondsPerWeek = kMicrosecondsPerDay * 7;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kNanosecondsPerMicrosecond = 1000;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kNanosecondsPerSecond = kNanosecondsPerMicrosecond *
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             kMicrosecondsPerSecond;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Mac & Linux, this value is the delta from the Windows epoch of 1601 to
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the Posix delta of 1970. This is used for migrating between the old
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1970-based epochs to the new 1601-based ones. It should be removed from
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this global header and put in the platform-specific ones when we remove the
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // migration code.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kWindowsEpochDeltaMicroseconds;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Represents an exploded time that can be formatted nicely. This is kind of
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // like the Win32 SYSTEMTIME structure or the Unix "struct tm" with a few
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // additions and changes to prevent errors.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct BASE_EXPORT Exploded {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int year;          // Four digit year "2007"
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int month;         // 1-based month (values 1 = January, etc.)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int day_of_week;   // 0-based day of week (0 = Sunday, etc.)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int day_of_month;  // 1-based day of month (1-31)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int hour;          // Hour within the current day (0-23)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int minute;        // Minute within the current hour (0-59)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int second;        // Second within the current minute (0-59 plus leap
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       //   seconds which may take it up to 60).
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int millisecond;   // Milliseconds within the current second (0-999)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A cursory test for whether the data members are within their
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // respective ranges. A 'true' return value does not guarantee the
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Exploded value can be successfully converted to a Time value.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool HasValidValues() const;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains the NULL time. Use Time::Now() to get the current time.
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Time() : us_(0) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the time object has not been initialized.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_null() const {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return us_ == 0;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the time object is the maximum time.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_max() const {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return us_ == std::numeric_limits<int64>::max();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the time for epoch in Unix-like system (Jan 1, 1970).
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time UnixEpoch();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the current time. Watch out, the system might adjust its clock
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in which case time will actually go backwards. We don't guarantee that
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // times are increasing, or that two calls to Now() won't be the same.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time Now();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maximum time, which should be greater than any reasonable time
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with which we might compare it.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time Max();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the current time. Same as Now() except that this function always
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // uses system time so that there are no discrepancies between the returned
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time and system time even on virtual environments including our test bot.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For timing sensitive unittests, this function should be used.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time NowFromSystemTime();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts to/from time_t in UTC and a Time class.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw) this should be removed once everybody starts using the |Time|
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time FromTimeT(time_t tt);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  time_t ToTimeT() const;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts time to/from a double which is the number of seconds since epoch
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (Jan 1, 1970).  Webkit uses this format to represent time.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Because WebKit initializes double time value to 0 to indicate "not
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // initialized", we map it to empty Time object that also means "not
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // initialized".
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time FromDoubleT(double dt);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double ToDoubleT() const;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_POSIX)
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Converts the timespec structure to time. MacOS X 10.8.3 (and tentatively,
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // earlier versions) will have the |ts|'s tv_nsec component zeroed out,
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // having a 1 second resolution, which agrees with
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // https://developer.apple.com/legacy/library/#technotes/tn/tn1150.html#HFSPlusDates.
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static Time FromTimeSpec(const timespec& ts);
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts to/from the Javascript convention for times, a number of
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // milliseconds since the epoch:
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/getTime.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time FromJsTime(double ms_since_epoch);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double ToJsTime() const;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time FromTimeVal(struct timeval t);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct timeval ToTimeVal() const;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time FromCFAbsoluteTime(CFAbsoluteTime t);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CFAbsoluteTime ToCFAbsoluteTime() const;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time FromFileTime(FILETIME ft);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FILETIME ToFileTime() const;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The minimum time of a low resolution timer.  This is basically a windows
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // constant of ~15.6ms.  While it does vary on some older OS versions, we'll
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // treat it as static across all windows versions.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kMinLowResolutionThresholdMs = 16;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable or disable Windows high resolution timer. If the high resolution
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // timer is not enabled, calls to ActivateHighResolutionTimer will fail.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When disabling the high resolution timer, this function will not cause
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the high resolution timer to be deactivated, but will prevent future
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // activations.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must be called from the main thread.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For more details see comments in time_win.cc.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void EnableHighResolutionTimer(bool enable);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Activates or deactivates the high resolution timer based on the |activate|
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // flag.  If the HighResolutionTimer is not Enabled (see
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EnableHighResolutionTimer), this function will return false.  Otherwise
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns true.  Each successful activate call must be paired with a
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // subsequent deactivate call.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All callers to activate the high resolution timer must eventually call
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this function to deactivate the high resolution timer.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool ActivateHighResolutionTimer(bool activate);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the high resolution timer is both enabled and activated.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is provided for testing only, and is not tracked in a thread-safe
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // way.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsHighResolutionTimerInUse();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts an exploded structure representing either the local time or UTC
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // into a Time class.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time FromUTCExploded(const Exploded& exploded) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return FromExploded(false, exploded);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time FromLocalExploded(const Exploded& exploded) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return FromExploded(true, exploded);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts an integer value representing Time to a class. This is used
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when deserializing a |Time| structure, using a value known to be
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // compatible. It is not provided as a constructor because the integer type
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may be unclear from the perspective of a caller.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time FromInternalValue(int64 us) {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Time(us);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts a string representation of time to a Time object.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An example of a time string which is converted is as below:-
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the input string, FromString assumes local time and FromUTCString
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // assumes UTC. A timezone that cannot be parsed (e.g. "UTC" which is not
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified in RFC822) is treated as if the timezone is not specified.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(iyengar) Move the FromString/FromTimeT/ToTimeT/FromFileTime to
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a new time converter class.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool FromString(const char* time_string, Time* parsed_time) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return FromStringInternal(time_string, true, parsed_time);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool FromUTCString(const char* time_string, Time* parsed_time) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return FromStringInternal(time_string, false, parsed_time);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For serializing, use FromInternalValue to reconstitute. Please don't use
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this and do arithmetic on it, as it is more error prone than using the
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // provided operators.
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 ToInternalValue() const {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return us_;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills the given exploded structure with either the local time or UTC from
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this time structure (containing UTC).
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UTCExplode(Exploded* exploded) const {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Explode(false, exploded);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LocalExplode(Exploded* exploded) const {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Explode(true, exploded);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rounds this time down to the nearest day in local time. It will represent
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // midnight on that day.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time LocalMidnight() const;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time& operator=(Time other) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us_ = other.us_;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compute the difference between two times.
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta operator-(Time other) const {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeDelta(us_ - other.us_);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Modify by some time delta.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time& operator+=(TimeDelta delta) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us_ += delta.delta_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time& operator-=(TimeDelta delta) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    us_ -= delta.delta_;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return a new time modified by some delta.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time operator+(TimeDelta delta) const {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Time(us_ + delta.delta_);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time operator-(TimeDelta delta) const {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Time(us_ - delta.delta_);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Comparison operators
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(Time other) const {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return us_ == other.us_;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator!=(Time other) const {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return us_ != other.us_;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator<(Time other) const {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return us_ < other.us_;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator<=(Time other) const {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return us_ <= other.us_;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator>(Time other) const {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return us_ > other.us_;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator>=(Time other) const {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return us_ >= other.us_;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class TimeDelta;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Time(int64 us) : us_(us) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Explodes the given time to either local time |is_local = true| or UTC
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |is_local = false|.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Explode(bool is_local, Exploded* exploded) const;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unexplodes a given time assuming the source is either local time
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |is_local = true| or UTC |is_local = false|.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Time FromExploded(bool is_local, const Exploded& exploded);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts a string representation of time to a Time object.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An example of a time string which is converted is as below:-
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the input string, local time |is_local = true| or
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UTC |is_local = false| is assumed. A timezone that cannot be parsed
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (e.g. "UTC" which is not specified in RFC822) is treated as if the
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // timezone is not specified.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool FromStringInternal(const char* time_string,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool is_local,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Time* parsed_time);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The representation of Jan 1, 1970 UTC in microseconds since the
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platform-dependent epoch.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kTimeTToMicrosecondsOffset;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates whether fast timers are usable right now.  For instance,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when using battery power, we might elect to prevent high speed timers
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which would draw more power.
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool high_resolution_timer_enabled_;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Count of activations on the high resolution timer.  Only use in tests
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which are single threaded.
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int high_resolution_timer_activated_;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Time in microseconds in UTC.
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 us_;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Inline the TimeDelta factory methods, for fast TimeDelta construction.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromDays(int64 days) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeDelta(days * Time::kMicrosecondsPerDay);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromHours(int64 hours) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeDelta(hours * Time::kMicrosecondsPerHour);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromMinutes(int64 minutes) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeDelta(minutes * Time::kMicrosecondsPerMinute);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromSeconds(int64 secs) {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeDelta(secs * Time::kMicrosecondsPerSecond);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromMilliseconds(int64 ms) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeDelta(ms * Time::kMicrosecondsPerMillisecond);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeDelta TimeDelta::FromMicroseconds(int64 us) {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeDelta(us);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Time TimeDelta::operator+(Time t) const {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Time(t.us_ + delta_);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TimeTicks ------------------------------------------------------------------
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT TimeTicks {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks() : ticks_(0) {
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Platform-dependent tick count representing "right now."
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The resolution of this clock is ~1-15ms.  Resolution varies depending
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on hardware/operating system configuration.
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeTicks Now();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a platform-dependent high-resolution tick count. Implementation
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is hardware dependent and may or may not return sub-millisecond
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resolution.  THIS CALL IS GENERALLY MUCH MORE EXPENSIVE THAN Now() AND
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SHOULD ONLY BE USED WHEN IT IS REALLY NEEDED.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeTicks HighResNow();
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
543a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Returns true if ThreadNow() is supported on this system.
544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static bool IsThreadNowSupported() {
545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)
546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return true;
547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else
548a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Returns thread-specific CPU-time on systems that support this feature.
553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Needs to be guarded with a call to IsThreadNowSupported(). Use this timer
554a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // to (approximately) measure how much time the calling thread spent doing
555a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // actual work vs. being de-scheduled. May return bogus results if the thread
556a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // migrates to another CPU between two calls.
557a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static TimeTicks ThreadNow();
558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the current system trace time or, if none is defined, the current
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // high-res time (i.e. HighResNow()). On systems where a global trace clock
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is defined, timestamping TraceEvents's with this value guarantees
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // synchronization between events collected inside chrome and events
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // collected outside (e.g. kernel, X server).
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeTicks NowFromSystemTraceTime();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the absolute value of QPC time drift. For testing.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int64 GetQPCDriftMicroseconds();
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeTicks FromQPCValue(LONGLONG qpc_value);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the high resolution clock is working on this system.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is only for testing.
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsHighResClockWorking();
57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Enable high resolution time for TimeTicks::Now(). This function will
57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // test for the availability of a working implementation of
57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // QueryPerformanceCounter(). If one is not available, this function does
57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // nothing and the resolution of Now() remains 1ms. Otherwise, all future
58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // calls to TimeTicks::Now() will have the higher resolution provided by QPC.
58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Returns true if high resolution time was successfully enabled.
58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static bool SetNowIsHighResNowIfSupported();
58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Returns a time value that is NOT rollover protected.
58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static TimeTicks UnprotectedNow();
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if this object has not been initialized.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_null() const {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ticks_ == 0;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts an integer value representing TimeTicks to a class. This is used
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when deserializing a |TimeTicks| structure, using a value known to be
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // compatible. It is not provided as a constructor because the integer type
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may be unclear from the perspective of a caller.
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TimeTicks FromInternalValue(int64 ticks) {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeTicks(ticks);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the internal numeric value of the TimeTicks object.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For serializing, use FromInternalValue to reconstitute.
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 ToInternalValue() const {
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ticks_;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks& operator=(TimeTicks other) {
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ticks_ = other.ticks_;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compute the difference between two times.
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta operator-(TimeTicks other) const {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeDelta(ticks_ - other.ticks_);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Modify by some time delta.
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks& operator+=(TimeDelta delta) {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ticks_ += delta.delta_;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks& operator-=(TimeDelta delta) {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ticks_ -= delta.delta_;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return a new TimeTicks modified by some delta.
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks operator+(TimeDelta delta) const {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeTicks(ticks_ + delta.delta_);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeTicks operator-(TimeDelta delta) const {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TimeTicks(ticks_ - delta.delta_);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Comparison operators
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(TimeTicks other) const {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ticks_ == other.ticks_;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator!=(TimeTicks other) const {
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ticks_ != other.ticks_;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator<(TimeTicks other) const {
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ticks_ < other.ticks_;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator<=(TimeTicks other) const {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ticks_ <= other.ticks_;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator>(TimeTicks other) const {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ticks_ > other.ticks_;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator>=(TimeTicks other) const {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ticks_ >= other.ticks_;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class TimeDelta;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Please use Now() to create a new object. This is for internal use
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and testing. Ticks is in microseconds.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TimeTicks(int64 ticks) : ticks_(ticks) {
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tick count in microseconds.
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 ticks_;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef DWORD (*TickFunctionType)(void);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TickFunctionType SetMockTickFunction(TickFunctionType ticker);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline TimeTicks TimeDelta::operator+(TimeTicks t) const {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TimeTicks(t.ticks_ + delta_);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // BASE_TIME_TIME_H_
679