diff --git a/api/units/data_rate.h b/api/units/data_rate.h index c2202d6a69..4bb988b658 100644 --- a/api/units/data_rate.h +++ b/api/units/data_rate.h @@ -16,6 +16,7 @@ #endif // UNIT_TEST #include +#include #include #include #include @@ -133,6 +134,12 @@ class DataRate { return bits_per_sec_ == data_rate_impl::kPlusInfinityVal; } constexpr bool IsFinite() const { return !IsInfinite(); } + DataRate Clamped(DataRate min_rate, DataRate max_rate) const { + return std::max(min_rate, std::min(*this, max_rate)); + } + void Clamp(DataRate min_rate, DataRate max_rate) { + *this = Clamped(min_rate, max_rate); + } DataRate operator-(const DataRate& other) const { return DataRate::bps(bps() - other.bps()); } diff --git a/api/units/data_rate_unittest.cc b/api/units/data_rate_unittest.cc index be020909c8..8e5b660594 100644 --- a/api/units/data_rate_unittest.cc +++ b/api/units/data_rate_unittest.cc @@ -92,6 +92,26 @@ TEST(DataRateTest, ConvertsToAndFromDouble) { EXPECT_TRUE(DataRate::bps(kInfinity).IsInfinite()); EXPECT_TRUE(DataRate::kbps(kInfinity).IsInfinite()); } +TEST(DataRateTest, Clamping) { + const DataRate upper = DataRate::kbps(800); + const DataRate lower = DataRate::kbps(100); + const DataRate under = DataRate::kbps(100); + const DataRate inside = DataRate::kbps(500); + const DataRate over = DataRate::kbps(1000); + EXPECT_EQ(under.Clamped(lower, upper), lower); + EXPECT_EQ(inside.Clamped(lower, upper), inside); + EXPECT_EQ(over.Clamped(lower, upper), upper); + + DataRate mutable_rate = lower; + mutable_rate.Clamp(lower, upper); + EXPECT_EQ(mutable_rate, lower); + mutable_rate = inside; + mutable_rate.Clamp(lower, upper); + EXPECT_EQ(mutable_rate, inside); + mutable_rate = over; + mutable_rate.Clamp(lower, upper); + EXPECT_EQ(mutable_rate, upper); +} TEST(DataRateTest, MathOperations) { const int64_t kValueA = 450;