You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by al...@apache.org on 2020/08/10 23:55:18 UTC
[kudu] 02/02: [monotime] add MonoDelta::operator{+,-}()
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 <al...@apache.org>
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 <aw...@cloudera.com>
Reviewed-by: Andrew Wong <aw...@cloudera.com>
---
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_;