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 {
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.
......
......@@ -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) {
......
......@@ -48,7 +48,7 @@ DOMStorageArea::RateLimiter::RateLimiter(size_t desired_rate,
}
base::TimeDelta DOMStorageArea::RateLimiter::ComputeTimeNeeded() const {
return time_quantum_.multiply_by(samples_ / rate_);
return time_quantum_ * (samples_ / rate_);
}
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