summaryrefslogtreecommitdiffstats
path: root/base/time
diff options
context:
space:
mode:
authormichaeln <michaeln@chromium.org>2015-02-23 13:22:42 -0800
committerCommit bot <commit-bot@chromium.org>2015-02-23 21:23:58 +0000
commit6e3b48b35f7a96246bcc0bb9e2ec846053349d99 (patch)
treecb19145681aa6cdffc68f336572e18cb41c6d5e7 /base/time
parent2289630132c8e3ff98ea978371527bea3966ce4c (diff)
downloadchromium_src-6e3b48b35f7a96246bcc0bb9e2ec846053349d99.zip
chromium_src-6e3b48b35f7a96246bcc0bb9e2ec846053349d99.tar.gz
chromium_src-6e3b48b35f7a96246bcc0bb9e2ec846053349d99.tar.bz2
base::Time multiplicative operator overloading
Review URL: https://codereview.chromium.org/945143002 Cr-Commit-Position: refs/heads/master@{#317653}
Diffstat (limited to 'base/time')
-rw-r--r--base/time/time.h30
-rw-r--r--base/time/time_unittest.cc72
2 files changed, 82 insertions, 20 deletions
diff --git a/base/time/time.h b/base/time/time.h
index 6d61861..b18c0b2 100644
--- a/base/time/time.h
+++ b/base/time/time.h
@@ -158,34 +158,30 @@ class BASE_EXPORT TimeDelta {
return TimeDelta(-delta_);
}
- // Computations with ints, note that we only allow multiplicative operations
- // with ints, and additive operations with other deltas.
- TimeDelta operator*(int64 a) const {
+ // Computations with numeric types.
+ template<typename T>
+ TimeDelta operator*(T a) const {
return TimeDelta(delta_ * a);
}
- TimeDelta operator/(int64 a) const {
+ template<typename T>
+ TimeDelta operator/(T a) const {
return TimeDelta(delta_ / a);
}
- TimeDelta& operator*=(int64 a) {
+ template<typename T>
+ TimeDelta& operator*=(T a) {
delta_ *= a;
return *this;
}
- TimeDelta& operator/=(int64 a) {
+ template<typename T>
+ TimeDelta& operator/=(T a) {
delta_ /= a;
return *this;
}
+
int64 operator/(TimeDelta a) const {
return delta_ / a.delta_;
}
- // Multiplicative computations with floats.
- TimeDelta multiply_by(double a) const {
- return TimeDelta(delta_ * a);
- }
- TimeDelta divide_by(double a) const {
- return TimeDelta(delta_ / a);
- }
-
// Defined below because it depends on the definition of the other classes.
Time operator+(Time t) const;
TimeTicks operator+(TimeTicks t) const;
@@ -213,7 +209,6 @@ class BASE_EXPORT TimeDelta {
private:
friend class Time;
friend class TimeTicks;
- friend TimeDelta operator*(int64 a, TimeDelta td);
// Constructs a delta given the duration in microseconds. This is private
// to avoid confusion by callers with an integer constructor. Use
@@ -225,8 +220,9 @@ class BASE_EXPORT TimeDelta {
int64 delta_;
};
-inline TimeDelta operator*(int64 a, TimeDelta td) {
- return TimeDelta(a * td.delta_);
+template<typename T>
+inline TimeDelta operator*(T a, TimeDelta td) {
+ return td * a;
}
// For logging use only.
diff --git a/base/time/time_unittest.cc b/base/time/time_unittest.cc
index 6387ec7..a96787c 100644
--- a/base/time/time_unittest.cc
+++ b/base/time/time_unittest.cc
@@ -868,12 +868,78 @@ TEST(TimeDelta, Magnitude) {
}
-TEST(TimeDelta, multiply_by) {
+TEST(TimeDelta, NumericOperators) {
double d = 0.5;
EXPECT_EQ(TimeDelta::FromMilliseconds(500),
- TimeDelta::FromMilliseconds(1000).multiply_by(d));
+ TimeDelta::FromMilliseconds(1000) * d);
EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
- TimeDelta::FromMilliseconds(1000).divide_by(d));
+ TimeDelta::FromMilliseconds(1000) / d);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) *= d);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) /= d);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ d * TimeDelta::FromMilliseconds(1000));
+
+ float f = 0.5;
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) * f);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) / f);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) *= f);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) /= f);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ f * TimeDelta::FromMilliseconds(1000));
+
+
+ int i = 2;
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) * i);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) / i);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) *= i);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) /= i);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ i * TimeDelta::FromMilliseconds(1000));
+
+ int64_t i64 = 2;
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) * i64);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) / i64);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) *= i64);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) /= i64);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ i64 * TimeDelta::FromMilliseconds(1000));
+
+
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) * 0.5);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) / 0.5);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) *= 0.5);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) /= 0.5);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ 0.5 * TimeDelta::FromMilliseconds(1000));
+
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) * 2);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) / 2);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ TimeDelta::FromMilliseconds(1000) *= 2);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(500),
+ TimeDelta::FromMilliseconds(1000) /= 2);
+ EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
+ 2 * TimeDelta::FromMilliseconds(1000));
}
TEST(TimeDeltaLogging, DCheckEqCompiles) {