This is an automated email from the ASF dual-hosted git repository. alexey pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/kudu.git
commit 1cd6fe4f500777def1446ee5dcc93c40dd2f3812 Author: Alexey Serbin <[email protected]> AuthorDate: Sun Aug 9 23:28:04 2020 -0700 [monotime] add MonoDelta::operator{+,-}() Added a bit of syntactic sugar: MonoDelta::operator+() and MonoDelta::operator-() and corresponding test scenarios. I'm going to use these new operators in a follow-up changelist. Change-Id: Ibfad30af72128b4d0054993243bfc00e67b89a9e Reviewed-on: http://gerrit.cloudera.org:8080/16317 Tested-by: Andrew Wong <[email protected]> Reviewed-by: Andrew Wong <[email protected]> --- src/kudu/util/monotime-test.cc | 39 +++++++++++++++++++++++++++++++++++++++ src/kudu/util/monotime.cc | 19 ++++++++++++++----- src/kudu/util/monotime.h | 22 ++++++++++++++++++++-- 3 files changed, 73 insertions(+), 7 deletions(-) diff --git a/src/kudu/util/monotime-test.cc b/src/kudu/util/monotime-test.cc index 4711f1f..8a4279e 100644 --- a/src/kudu/util/monotime-test.cc +++ b/src/kudu/util/monotime-test.cc @@ -215,6 +215,45 @@ TEST(TestMonoTime, TestOperators) { EXPECT_TRUE(m_end.Equals(o_end)); } + // MonoDelta& MonoDelta::operator+=(const MonoDelta& delta); + { + MonoDelta d0 = MonoDelta::FromNanoseconds(0); + MonoDelta d1 = MonoDelta::FromNanoseconds(1); + MonoDelta d1_prev = d1; + d1 += d0; + ASSERT_EQ(d1_prev, d1); + ASSERT_EQ(1, d1.ToNanoseconds()); + d0 += d1; + ASSERT_EQ(d1, d0); + ASSERT_EQ(1, d0.ToNanoseconds()); + d1 += d1_prev; + ASSERT_EQ(2, d1.ToNanoseconds()); + + MonoDelta d2 = MonoDelta::FromNanoseconds(-1); + d1 += d2; + ASSERT_EQ(1, d1.ToNanoseconds()); + d2 += d1; + ASSERT_EQ(0, d2.ToNanoseconds()); + } + + // MonoDelta& MonoDelta::operator-=(const MonoDelta& delta); + { + MonoDelta d0 = MonoDelta::FromNanoseconds(0); + MonoDelta d1 = MonoDelta::FromNanoseconds(1); + MonoDelta d1_prev = d1; + d1 -= d0; + ASSERT_EQ(d1_prev, d1); + ASSERT_EQ(1, d1.ToNanoseconds()); + d0 -= d1; + ASSERT_EQ(-1, d0.ToNanoseconds()); + + MonoDelta d2 = MonoDelta::FromNanoseconds(-2); + d0 -= d2; + ASSERT_EQ(1, d0.ToNanoseconds()); + d2 -= d0; + ASSERT_EQ(-3, d2.ToNanoseconds()); + } + // bool operator==(const MonoDelta& lhs, const MonoDelta& rhs); { MonoDelta dn = MonoDelta::FromNanoseconds(0); diff --git a/src/kudu/util/monotime.cc b/src/kudu/util/monotime.cc index b0299cc..102789a 100644 --- a/src/kudu/util/monotime.cc +++ b/src/kudu/util/monotime.cc @@ -63,7 +63,7 @@ MonoDelta MonoDelta::FromNanoseconds(int64_t ns) { } MonoDelta::MonoDelta() - : nano_delta_(kUninitialized) { + : nano_delta_(kUninitialized) { } bool MonoDelta::Initialized() const { @@ -145,6 +145,10 @@ void MonoDelta::ToTimeVal(struct timeval *tv) const { } } +void MonoDelta::ToTimeSpec(struct timespec* ts) const { + DCHECK(Initialized()); + NanosToTimeSpec(nano_delta_, ts); +} void MonoDelta::NanosToTimeSpec(int64_t nanos, struct timespec* ts) { ts->tv_sec = nanos / MonoTime::kNanosecondsPerSecond; @@ -158,9 +162,14 @@ void MonoDelta::NanosToTimeSpec(int64_t nanos, struct timespec* ts) { } } -void MonoDelta::ToTimeSpec(struct timespec *ts) const { - DCHECK(Initialized()); - NanosToTimeSpec(nano_delta_, ts); +MonoDelta& MonoDelta::operator+=(const MonoDelta& delta) { + nano_delta_ += delta.nano_delta_; + return *this; +} + +MonoDelta& MonoDelta::operator-=(const MonoDelta& delta) { + nano_delta_ -= delta.nano_delta_; + return *this; } /// @@ -238,7 +247,7 @@ MonoTime& MonoTime::operator-=(const MonoDelta& delta) { return *this; } -MonoTime::MonoTime(const struct timespec &ts) KUDU_MONOTIME_NOEXCEPT { +MonoTime::MonoTime(const struct timespec& ts) KUDU_MONOTIME_NOEXCEPT { // Monotonic time resets when the machine reboots. The 64-bit limitation // means that we can't represent times larger than 292 years, which should be // adequate. diff --git a/src/kudu/util/monotime.h b/src/kudu/util/monotime.h index 7943019..60ce205 100644 --- a/src/kudu/util/monotime.h +++ b/src/kudu/util/monotime.h @@ -130,7 +130,7 @@ class KUDU_EXPORT MonoDelta { /// /// @param [out] ts /// Placeholder for the result value. - void ToTimeSpec(struct timespec *ts) const; + void ToTimeSpec(struct timespec* ts) const; /// Convert a nanosecond value to a timespec. /// @@ -140,6 +140,24 @@ class KUDU_EXPORT MonoDelta { /// Placeholder for the resulting timespec representation. static void NanosToTimeSpec(int64_t nanos, struct timespec* ts); + /// @name Syntactic sugar: increment/decrement operators for MonoDelta. + ///@{ + /// + /// Add a delta to current time interval. + /// + /// @param [in] delta + /// The delta to add. + /// @return Reference to the modified object. + MonoDelta& operator+=(const MonoDelta& delta); + + /// Substract a delta from current time interval. + /// + /// @param [in] delta + /// The delta to substract. + /// @return Reference to the modified object. + MonoDelta& operator-=(const MonoDelta& delta); + ///@} + private: static const int64_t kUninitialized; @@ -270,7 +288,7 @@ class KUDU_EXPORT MonoTime { FRIEND_TEST(TestMonoTime, TestTimeSpec); FRIEND_TEST(TestMonoTime, TestDeltaConversions); - explicit MonoTime(const struct timespec &ts) KUDU_MONOTIME_NOEXCEPT; + explicit MonoTime(const struct timespec& ts) KUDU_MONOTIME_NOEXCEPT; explicit MonoTime(int64_t nanos) KUDU_MONOTIME_NOEXCEPT; double ToSeconds() const; int64_t nanos_;
