Chromium Code Reviews| Index: base/time/time.h |
| diff --git a/base/time/time.h b/base/time/time.h |
| index 40566b92317a3c94ff183994a22c0029122fceb0..69a132431d6597514e44191a04db8bf461fb2c40 100644 |
| --- a/base/time/time.h |
| +++ b/base/time/time.h |
| @@ -61,9 +61,9 @@ class BASE_EXPORT TimeDelta { |
| } |
| // Converts units of time to TimeDeltas. |
| - static TimeDelta FromDays(int64 days); |
| - static TimeDelta FromHours(int64 hours); |
| - static TimeDelta FromMinutes(int64 minutes); |
| + static TimeDelta FromDays(int days); |
|
gavinp
2014/02/13 17:50:07
This sort of scares me. What if these max values i
|
| + static TimeDelta FromHours(int hours); |
| + static TimeDelta FromMinutes(int minutes); |
| static TimeDelta FromSeconds(int64 secs); |
| static TimeDelta FromMilliseconds(int64 ms); |
| static TimeDelta FromMicroseconds(int64 us); |
| @@ -79,6 +79,11 @@ class BASE_EXPORT TimeDelta { |
| return TimeDelta(delta); |
| } |
| + // Returns the maximum time delta, which should be greater than any reasonable |
| + // time delta we might compare it to. Adding or subtracting the maximum time |
| + // delta to a time or another time delta has an undefined result. |
| + static TimeDelta Max(); |
| + |
| // Returns the internal numeric value of the TimeDelta object. Please don't |
| // use this and do arithmetic on it, as it is more error prone than using the |
| // provided operators. |
| @@ -87,6 +92,11 @@ class BASE_EXPORT TimeDelta { |
| return delta_; |
| } |
| + // Returns true if the time delta is the maximum time delta. |
| + bool is_max() const { |
| + return delta_ == std::numeric_limits<int64>::max(); |
| + } |
| + |
| #if defined(OS_POSIX) |
| struct timespec ToTimeSpec() const; |
| #endif |
| @@ -493,32 +503,50 @@ class BASE_EXPORT Time { |
| // Inline the TimeDelta factory methods, for fast TimeDelta construction. |
| // static |
| -inline TimeDelta TimeDelta::FromDays(int64 days) { |
| +inline TimeDelta TimeDelta::FromDays(int days) { |
|
gavinp
2014/02/13 17:50:07
Should these still be inlined?
|
| + // Preserve max to prevent overflow. |
| + if (days == std::numeric_limits<int>::max()) |
| + return Max(); |
| return TimeDelta(days * Time::kMicrosecondsPerDay); |
| } |
| // static |
| -inline TimeDelta TimeDelta::FromHours(int64 hours) { |
| +inline TimeDelta TimeDelta::FromHours(int hours) { |
| + // Preserve max to prevent overflow. |
| + if (hours == std::numeric_limits<int>::max()) |
| + return Max(); |
| return TimeDelta(hours * Time::kMicrosecondsPerHour); |
| } |
| // static |
| -inline TimeDelta TimeDelta::FromMinutes(int64 minutes) { |
| +inline TimeDelta TimeDelta::FromMinutes(int minutes) { |
| + // Preserve max to prevent overflow. |
| + if (minutes == std::numeric_limits<int>::max()) |
| + return Max(); |
| return TimeDelta(minutes * Time::kMicrosecondsPerMinute); |
| } |
| // static |
| inline TimeDelta TimeDelta::FromSeconds(int64 secs) { |
| + // Preserve max to prevent overflow. |
| + if (secs == std::numeric_limits<int64>::max()) |
| + return Max(); |
| return TimeDelta(secs * Time::kMicrosecondsPerSecond); |
| } |
| // static |
| inline TimeDelta TimeDelta::FromMilliseconds(int64 ms) { |
| + // Preserve max to prevent overflow. |
| + if (ms == std::numeric_limits<int64>::max()) |
| + return Max(); |
| return TimeDelta(ms * Time::kMicrosecondsPerMillisecond); |
| } |
| // static |
| inline TimeDelta TimeDelta::FromMicroseconds(int64 us) { |
| + // Preserve max to prevent overflow. |
| + if (us == std::numeric_limits<int64>::max()) |
| + return Max(); |
| return TimeDelta(us); |
| } |