Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Time represents an absolute point in time, internally represented as
6 // microseconds (s/1,000,000) since a platform-dependent epoch. Each
7 // platform's epoch, along with other system-dependent clock interface
8 // routines, is defined in time_PLATFORM.cc.
9 //
10 // TimeDelta represents a duration of time, internally represented in
11 // microseconds.
12 //
13 // TimeTicks represents an abstract time that is always incrementing for use
14 // in measuring time durations. It is internally represented in microseconds.
15 // It can not be converted to a human-readable time, but is guaranteed not to
16 // decrease (if the user changes the computer clock, Time::Now() may actually
17 // decrease or jump).
18 //
19 // These classes are represented as only a 64-bit value, so they can be
20 // efficiently passed by value.
22 #ifndef BASE_TIME_H_
23 #define BASE_TIME_H_
25 #include <time.h>
27 #include "base/basictypes.h"
29 #if defined(OS_WIN)
30 // For FILETIME in FromFileTime, until it moves to a new converter class.
31 // See TODO(iyengar) below.
32 #include <windows.h>
33 #endif
35 namespace base {
37 class Time;
38 class TimeTicks;
40 // This unit test does a lot of manual time manipulation.
41 class PageLoadTrackerUnitTest;
43 // TimeDelta ------------------------------------------------------------------
45 class TimeDelta {
46 public:
47 TimeDelta() : delta_(0) {
48 }
50 // Converts units of time to TimeDeltas.
51 static TimeDelta FromDays(int64_t days);
52 static TimeDelta FromHours(int64_t hours);
53 static TimeDelta FromMinutes(int64_t minutes);
54 static TimeDelta FromSeconds(int64_t secs);
55 static TimeDelta FromMilliseconds(int64_t ms);
56 static TimeDelta FromMicroseconds(int64_t us);
58 // Returns the internal numeric value of the TimeDelta object. Please don't
59 // use this and do arithmetic on it, as it is more error prone than using the
60 // provided operators.
61 int64_t ToInternalValue() const {
62 return delta_;
63 }
65 // Returns the time delta in some unit. The F versions return a floating
66 // point value, the "regular" versions return a rounded-down value.
67 int InDays() const;
68 int InHours() const;
69 int InMinutes() const;
70 double InSecondsF() const;
71 int64_t InSeconds() const;
72 double InMillisecondsF() const;
73 int64_t InMilliseconds() const;
74 int64_t InMicroseconds() const;
76 TimeDelta& operator=(TimeDelta other) {
77 delta_ = other.delta_;
78 return *this;
79 }
81 // Computations with other deltas.
82 TimeDelta operator+(TimeDelta other) const {
83 return TimeDelta(delta_ + other.delta_);
84 }
85 TimeDelta operator-(TimeDelta other) const {
86 return TimeDelta(delta_ - other.delta_);
87 }
89 TimeDelta& operator+=(TimeDelta other) {
90 delta_ += other.delta_;
91 return *this;
92 }
93 TimeDelta& operator-=(TimeDelta other) {
94 delta_ -= other.delta_;
95 return *this;
96 }
97 TimeDelta operator-() const {
98 return TimeDelta(-delta_);
99 }
101 // Computations with ints, note that we only allow multiplicative operations
102 // with ints, and additive operations with other deltas.
103 TimeDelta operator*(int64_t a) const {
104 return TimeDelta(delta_ * a);
105 }
106 TimeDelta operator/(int64_t a) const {
107 return TimeDelta(delta_ / a);
108 }
109 TimeDelta& operator*=(int64_t a) {
110 delta_ *= a;
111 return *this;
112 }
113 TimeDelta& operator/=(int64_t a) {
114 delta_ /= a;
115 return *this;
116 }
117 int64_t operator/(TimeDelta a) const {
118 return delta_ / a.delta_;
119 }
121 // Defined below because it depends on the definition of the other classes.
122 Time operator+(Time t) const;
123 TimeTicks operator+(TimeTicks t) const;
125 // Comparison operators.
126 bool operator==(TimeDelta other) const {
127 return delta_ == other.delta_;
128 }
129 bool operator!=(TimeDelta other) const {
130 return delta_ != other.delta_;
131 }
132 bool operator<(TimeDelta other) const {
133 return delta_ < other.delta_;
134 }
135 bool operator<=(TimeDelta other) const {
136 return delta_ <= other.delta_;
137 }
138 bool operator>(TimeDelta other) const {
139 return delta_ > other.delta_;
140 }
141 bool operator>=(TimeDelta other) const {
142 return delta_ >= other.delta_;
143 }
145 private:
146 friend class Time;
147 friend class TimeTicks;
148 friend TimeDelta operator*(int64_t a, TimeDelta td);
150 // Constructs a delta given the duration in microseconds. This is private
151 // to avoid confusion by callers with an integer constructor. Use
152 // FromSeconds, FromMilliseconds, etc. instead.
153 explicit TimeDelta(int64_t delta_us) : delta_(delta_us) {
154 }
156 // Delta in microseconds.
157 int64_t delta_;
158 };
160 inline TimeDelta operator*(int64_t a, TimeDelta td) {
161 return TimeDelta(a * td.delta_);
162 }
164 // Time -----------------------------------------------------------------------
166 // Represents a wall clock time.
167 class Time {
168 public:
169 static const int64_t kMillisecondsPerSecond = 1000;
170 static const int64_t kMicrosecondsPerMillisecond = 1000;
171 static const int64_t kMicrosecondsPerSecond = kMicrosecondsPerMillisecond *
172 kMillisecondsPerSecond;
173 static const int64_t kMicrosecondsPerMinute = kMicrosecondsPerSecond * 60;
174 static const int64_t kMicrosecondsPerHour = kMicrosecondsPerMinute * 60;
175 static const int64_t kMicrosecondsPerDay = kMicrosecondsPerHour * 24;
176 static const int64_t kMicrosecondsPerWeek = kMicrosecondsPerDay * 7;
177 static const int64_t kNanosecondsPerMicrosecond = 1000;
178 static const int64_t kNanosecondsPerSecond = kNanosecondsPerMicrosecond *
179 kMicrosecondsPerSecond;
181 // Represents an exploded time that can be formatted nicely. This is kind of
182 // like the Win32 SYSTEMTIME structure or the Unix "struct tm" with a few
183 // additions and changes to prevent errors.
184 struct Exploded {
185 int year; // Four digit year "2007"
186 signed char month; // 1-based month (values 1 = January, etc.)
187 signed char day_of_week; // 0-based day of week (0 = Sunday, etc.)
188 signed char day_of_month; // 1-based day of month (1-31)
189 signed char hour; // Hour within the current day (0-23)
190 signed char minute; // Minute within the current hour (0-59)
191 signed char second; // Second within the current minute (0-59 plus
192 // leap seconds which may take it up to 60).
193 int millisecond; // Milliseconds within the current second (0-999)
194 };
196 // Contains the NULL time. Use Time::Now() to get the current time.
197 explicit Time() : us_(0) {
198 }
200 // Returns true if the time object has not been initialized.
201 bool is_null() const {
202 return us_ == 0;
203 }
205 // Returns the current time. Watch out, the system might adjust its clock
206 // in which case time will actually go backwards. We don't guarantee that
207 // times are increasing, or that two calls to Now() won't be the same.
208 static Time Now();
210 // Returns the current time. Same as Now() except that this function always
211 // uses system time so that there are no discrepancies between the returned
212 // time and system time even on virtual environments including our test bot.
213 // For timing sensitive unittests, this function should be used.
214 static Time NowFromSystemTime();
216 // Converts to/from time_t in UTC and a Time class.
217 // TODO(brettw) this should be removed once everybody starts using the |Time|
218 // class.
219 static Time FromTimeT(time_t tt);
220 time_t ToTimeT() const;
222 // Converts time to/from a double which is the number of seconds since epoch
223 // (Jan 1, 1970). Webkit uses this format to represent time.
224 static Time FromDoubleT(double dt);
225 double ToDoubleT() const;
228 #if defined(OS_WIN)
229 static Time FromFileTime(FILETIME ft);
230 FILETIME ToFileTime() const;
231 #endif
233 // Converts an exploded structure representing either the local time or UTC
234 // into a Time class.
235 static Time FromUTCExploded(const Exploded& exploded) {
236 return FromExploded(false, exploded);
237 }
238 static Time FromLocalExploded(const Exploded& exploded) {
239 return FromExploded(true, exploded);
240 }
242 // Converts an integer value representing Time to a class. This is used
243 // when deserializing a |Time| structure, using a value known to be
244 // compatible. It is not provided as a constructor because the integer type
245 // may be unclear from the perspective of a caller.
246 static Time FromInternalValue(int64_t us) {
247 return Time(us);
248 }
250 // Converts a string representation of time to a Time object.
251 // An example of a time string which is converted is as below:-
252 // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified
253 // in the input string, we assume local time.
254 // TODO(iyengar) Move the FromString/FromTimeT/ToTimeT/FromFileTime to
255 // a new time converter class.
256 static bool FromString(const wchar_t* time_string, Time* parsed_time);
258 // For serializing, use FromInternalValue to reconstitute. Please don't use
259 // this and do arithmetic on it, as it is more error prone than using the
260 // provided operators.
261 int64_t ToInternalValue() const {
262 return us_;
263 }
265 // Fills the given exploded structure with either the local time or UTC from
266 // this time structure (containing UTC).
267 void UTCExplode(Exploded* exploded) const {
268 return Explode(false, exploded);
269 }
270 void LocalExplode(Exploded* exploded) const {
271 return Explode(true, exploded);
272 }
274 // Rounds this time down to the nearest day in local time. It will represent
275 // midnight on that day.
276 Time LocalMidnight() const;
278 Time& operator=(Time other) {
279 us_ = other.us_;
280 return *this;
281 }
283 // Compute the difference between two times.
284 TimeDelta operator-(Time other) const {
285 return TimeDelta(us_ - other.us_);
286 }
288 // Modify by some time delta.
289 Time& operator+=(TimeDelta delta) {
290 us_ += delta.delta_;
291 return *this;
292 }
293 Time& operator-=(TimeDelta delta) {
294 us_ -= delta.delta_;
295 return *this;
296 }
298 // Return a new time modified by some delta.
299 Time operator+(TimeDelta delta) const {
300 return us_ + delta.delta_;
301 }
302 Time operator-(TimeDelta delta) const {
303 return us_ - delta.delta_;
304 }
306 // Comparison operators
307 bool operator==(Time other) const {
308 return us_ == other.us_;
309 }
310 bool operator!=(Time other) const {
311 return us_ != other.us_;
312 }
313 bool operator<(Time other) const {
314 return us_ < other.us_;
315 }
316 bool operator<=(Time other) const {
317 return us_ <= other.us_;
318 }
319 bool operator>(Time other) const {
320 return us_ > other.us_;
321 }
322 bool operator>=(Time other) const {
323 return us_ >= other.us_;
324 }
326 private:
327 friend class TimeDelta;
329 // Explodes the given time to either local time |is_local = true| or UTC
330 // |is_local = false|.
331 void Explode(bool is_local, Exploded* exploded) const;
333 // Unexplodes a given time assuming the source is either local time
334 // |is_local = true| or UTC |is_local = false|.
335 static Time FromExploded(bool is_local, const Exploded& exploded);
337 Time(int64_t us) : us_(us) {
338 }
340 // The representation of Jan 1, 1970 UTC in microseconds since the
341 // platform-dependent epoch.
342 static const int64_t kTimeTToMicrosecondsOffset;
344 // Time in microseconds in UTC.
345 int64_t us_;
346 };
348 inline Time TimeDelta::operator+(Time t) const {
349 return Time(t.us_ + delta_);
350 }
352 // Inline the TimeDelta factory methods, for fast TimeDelta construction.
354 // static
355 inline TimeDelta TimeDelta::FromDays(int64_t days) {
356 return TimeDelta(days * Time::kMicrosecondsPerDay);
357 }
359 // static
360 inline TimeDelta TimeDelta::FromHours(int64_t hours) {
361 return TimeDelta(hours * Time::kMicrosecondsPerHour);
362 }
364 // static
365 inline TimeDelta TimeDelta::FromMinutes(int64_t minutes) {
366 return TimeDelta(minutes * Time::kMicrosecondsPerMinute);
367 }
369 // static
370 inline TimeDelta TimeDelta::FromSeconds(int64_t secs) {
371 return TimeDelta(secs * Time::kMicrosecondsPerSecond);
372 }
374 // static
375 inline TimeDelta TimeDelta::FromMilliseconds(int64_t ms) {
376 return TimeDelta(ms * Time::kMicrosecondsPerMillisecond);
377 }
379 // static
380 inline TimeDelta TimeDelta::FromMicroseconds(int64_t us) {
381 return TimeDelta(us);
382 }
384 // TimeTicks ------------------------------------------------------------------
386 class TimeTicks {
387 public:
388 TimeTicks() : ticks_(0) {
389 }
391 // Platform-dependent tick count representing "right now."
392 // The resolution of this clock is ~1-15ms. Resolution varies depending
393 // on hardware/operating system configuration.
394 static TimeTicks Now();
396 // Returns a platform-dependent high-resolution tick count. Implementation
397 // is hardware dependent and may or may not return sub-millisecond
398 // resolution. THIS CALL IS GENERALLY MUCH MORE EXPENSIVE THAN Now() AND
399 // SHOULD ONLY BE USED WHEN IT IS REALLY NEEDED.
400 static TimeTicks HighResNow();
402 // Returns true if this object has not been initialized.
403 bool is_null() const {
404 return ticks_ == 0;
405 }
407 // Returns the internal numeric value of the TimeTicks object.
408 int64_t ToInternalValue() const {
409 return ticks_;
410 }
412 TimeTicks& operator=(TimeTicks other) {
413 ticks_ = other.ticks_;
414 return *this;
415 }
417 // Compute the difference between two times.
418 TimeDelta operator-(TimeTicks other) const {
419 return TimeDelta(ticks_ - other.ticks_);
420 }
422 // Modify by some time delta.
423 TimeTicks& operator+=(TimeDelta delta) {
424 ticks_ += delta.delta_;
425 return *this;
426 }
427 TimeTicks& operator-=(TimeDelta delta) {
428 ticks_ -= delta.delta_;
429 return *this;
430 }
432 // Return a new TimeTicks modified by some delta.
433 TimeTicks operator+(TimeDelta delta) const {
434 return TimeTicks(ticks_ + delta.delta_);
435 }
436 TimeTicks operator-(TimeDelta delta) const {
437 return TimeTicks(ticks_ - delta.delta_);
438 }
440 // Comparison operators
441 bool operator==(TimeTicks other) const {
442 return ticks_ == other.ticks_;
443 }
444 bool operator!=(TimeTicks other) const {
445 return ticks_ != other.ticks_;
446 }
447 bool operator<(TimeTicks other) const {
448 return ticks_ < other.ticks_;
449 }
450 bool operator<=(TimeTicks other) const {
451 return ticks_ <= other.ticks_;
452 }
453 bool operator>(TimeTicks other) const {
454 return ticks_ > other.ticks_;
455 }
456 bool operator>=(TimeTicks other) const {
457 return ticks_ >= other.ticks_;
458 }
460 protected:
461 friend class TimeDelta;
462 friend class PageLoadTrackerUnitTest;
464 // Please use Now() to create a new object. This is for internal use
465 // and testing. Ticks is in microseconds.
466 explicit TimeTicks(int64_t ticks) : ticks_(ticks) {
467 }
469 // Tick count in microseconds.
470 int64_t ticks_;
472 #if defined(OS_WIN)
473 typedef DWORD (*TickFunctionType)(void);
474 static TickFunctionType SetMockTickFunction(TickFunctionType ticker);
475 #endif
476 };
478 inline TimeTicks TimeDelta::operator+(TimeTicks t) const {
479 return TimeTicks(t.ticks_ + delta_);
480 }
482 } // namespace base
484 #endif // BASE_TIME_H_