Adds clamping to TimeDelta.

Bug: webrtc:9709
Change-Id: I6447d8b0ac55b38eaa187b4d44426ec95c377ffb
Reviewed-on: https://webrtc-review.googlesource.com/c/110787
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25681}
diff --git a/api/units/time_delta.h b/api/units/time_delta.h
index 74b5385..8a0c502 100644
--- a/api/units/time_delta.h
+++ b/api/units/time_delta.h
@@ -16,6 +16,7 @@
 #endif              // UNIT_TEST
 
 #include <stdint.h>
+#include <algorithm>
 #include <cmath>
 #include <cstdlib>
 #include <limits>
@@ -189,6 +190,12 @@
   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 bf8bbce..7bdf8c3 100644
--- a/api/units/time_delta_unittest.cc
+++ b/api/units/time_delta_unittest.cc
@@ -106,6 +106,27 @@
   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<int>::max();
   EXPECT_EQ(TimeDelta::seconds(kMaxInt).us(),