Commit 6e3b48b3 authored by michaeln's avatar michaeln Committed by Commit bot

base::Time multiplicative operator overloading

Review URL: https://codereview.chromium.org/945143002

Cr-Commit-Position: refs/heads/master@{#317653}
parent 22896301
...@@ -158,34 +158,30 @@ class BASE_EXPORT TimeDelta { ...@@ -158,34 +158,30 @@ class BASE_EXPORT TimeDelta {
return TimeDelta(-delta_); return TimeDelta(-delta_);
} }
// Computations with ints, note that we only allow multiplicative operations // Computations with numeric types.
// with ints, and additive operations with other deltas. template<typename T>
TimeDelta operator*(int64 a) const { TimeDelta operator*(T a) const {
return TimeDelta(delta_ * a); return TimeDelta(delta_ * a);
} }
TimeDelta operator/(int64 a) const { template<typename T>
TimeDelta operator/(T a) const {
return TimeDelta(delta_ / a); return TimeDelta(delta_ / a);
} }
TimeDelta& operator*=(int64 a) { template<typename T>
TimeDelta& operator*=(T a) {
delta_ *= a; delta_ *= a;
return *this; return *this;
} }
TimeDelta& operator/=(int64 a) { template<typename T>
TimeDelta& operator/=(T a) {
delta_ /= a; delta_ /= a;
return *this; return *this;
} }
int64 operator/(TimeDelta a) const { int64 operator/(TimeDelta a) const {
return delta_ / a.delta_; 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. // Defined below because it depends on the definition of the other classes.
Time operator+(Time t) const; Time operator+(Time t) const;
TimeTicks operator+(TimeTicks t) const; TimeTicks operator+(TimeTicks t) const;
...@@ -213,7 +209,6 @@ class BASE_EXPORT TimeDelta { ...@@ -213,7 +209,6 @@ class BASE_EXPORT TimeDelta {
private: private:
friend class Time; friend class Time;
friend class TimeTicks; friend class TimeTicks;
friend TimeDelta operator*(int64 a, TimeDelta td);
// Constructs a delta given the duration in microseconds. This is private // Constructs a delta given the duration in microseconds. This is private
// to avoid confusion by callers with an integer constructor. Use // to avoid confusion by callers with an integer constructor. Use
...@@ -225,8 +220,9 @@ class BASE_EXPORT TimeDelta { ...@@ -225,8 +220,9 @@ class BASE_EXPORT TimeDelta {
int64 delta_; int64 delta_;
}; };
inline TimeDelta operator*(int64 a, TimeDelta td) { template<typename T>
return TimeDelta(a * td.delta_); inline TimeDelta operator*(T a, TimeDelta td) {
return td * a;
} }
// For logging use only. // For logging use only.
......
...@@ -868,12 +868,78 @@ TEST(TimeDelta, Magnitude) { ...@@ -868,12 +868,78 @@ TEST(TimeDelta, Magnitude) {
} }
TEST(TimeDelta, multiply_by) { TEST(TimeDelta, NumericOperators) {
double d = 0.5; double d = 0.5;
EXPECT_EQ(TimeDelta::FromMilliseconds(500), EXPECT_EQ(TimeDelta::FromMilliseconds(500),
TimeDelta::FromMilliseconds(1000).multiply_by(d)); TimeDelta::FromMilliseconds(1000) * d);
EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 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) { TEST(TimeDeltaLogging, DCheckEqCompiles) {
......
...@@ -48,7 +48,7 @@ DOMStorageArea::RateLimiter::RateLimiter(size_t desired_rate, ...@@ -48,7 +48,7 @@ DOMStorageArea::RateLimiter::RateLimiter(size_t desired_rate,
} }
base::TimeDelta DOMStorageArea::RateLimiter::ComputeTimeNeeded() const { base::TimeDelta DOMStorageArea::RateLimiter::ComputeTimeNeeded() const {
return time_quantum_.multiply_by(samples_ / rate_); return time_quantum_ * (samples_ / rate_);
} }
base::TimeDelta DOMStorageArea::RateLimiter::ComputeDelayNeeded( base::TimeDelta DOMStorageArea::RateLimiter::ComputeDelayNeeded(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment