From 0a8bd9cdc9fcda1a8e04869c213c83a6dd09a2fc Mon Sep 17 00:00:00 2001 From: Sebastian Jansson Date: Tue, 13 Nov 2018 19:27:40 +0100 Subject: [PATCH] Adds clamping to TimeDelta. Bug: webrtc:9709 Change-Id: I6447d8b0ac55b38eaa187b4d44426ec95c377ffb Reviewed-on: https://webrtc-review.googlesource.com/c/110787 Reviewed-by: Karl Wiberg Commit-Queue: Sebastian Jansson Cr-Commit-Position: refs/heads/master@{#25681} --- api/units/time_delta.h | 7 +++++++ api/units/time_delta_unittest.cc | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/api/units/time_delta.h b/api/units/time_delta.h index 74b5385128..8a0c5028dc 100644 --- a/api/units/time_delta.h +++ b/api/units/time_delta.h @@ -16,6 +16,7 @@ #endif // UNIT_TEST #include +#include #include #include #include @@ -189,6 +190,12 @@ class TimeDelta { constexpr bool IsMinusInfinity() const { return microseconds_ == timedelta_impl::kMinusInfinityVal; } + TimeDelta Clamped(TimeDelta min_delta, TimeDelta max_delta) const { + return std::max(min_delta, std::min(*this, max_delta)); + } + void Clamp(TimeDelta min_delta, TimeDelta max_delta) { + *this = Clamped(min_delta, max_delta); + } TimeDelta operator+(const TimeDelta& other) const { if (IsPlusInfinity() || other.IsPlusInfinity()) { RTC_DCHECK(!IsMinusInfinity()); diff --git a/api/units/time_delta_unittest.cc b/api/units/time_delta_unittest.cc index bf8bbce69b..7bdf8c320a 100644 --- a/api/units/time_delta_unittest.cc +++ b/api/units/time_delta_unittest.cc @@ -106,6 +106,27 @@ TEST(TimeDeltaTest, ComparisonOperators) { EXPECT_LT(TimeDelta::MinusInfinity(), TimeDelta::Zero()); } +TEST(TimeDeltaTest, Clamping) { + const TimeDelta upper = TimeDelta::ms(800); + const TimeDelta lower = TimeDelta::ms(100); + const TimeDelta under = TimeDelta::ms(100); + const TimeDelta inside = TimeDelta::ms(500); + const TimeDelta over = TimeDelta::ms(1000); + EXPECT_EQ(under.Clamped(lower, upper), lower); + EXPECT_EQ(inside.Clamped(lower, upper), inside); + EXPECT_EQ(over.Clamped(lower, upper), upper); + + TimeDelta mutable_delta = lower; + mutable_delta.Clamp(lower, upper); + EXPECT_EQ(mutable_delta, lower); + mutable_delta = inside; + mutable_delta.Clamp(lower, upper); + EXPECT_EQ(mutable_delta, inside); + mutable_delta = over; + mutable_delta.Clamp(lower, upper); + EXPECT_EQ(mutable_delta, upper); +} + TEST(TimeDeltaTest, CanBeInititializedFromLargeInt) { const int kMaxInt = std::numeric_limits::max(); EXPECT_EQ(TimeDelta::seconds(kMaxInt).us(),