diff --git a/BUILD.gn b/BUILD.gn index 3d4fedfb01..eb06453dea 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -562,6 +562,7 @@ if (rtc_include_tests && !build_with_chromium) { "rtc_base/task_utils:pending_task_safety_flag_unittests", "rtc_base/task_utils:repeating_task_unittests", "rtc_base/task_utils:to_queued_task_unittests", + "rtc_base/units:units_unittests", "sdk:sdk_tests", "test:rtp_test_utils", "test:test_main", diff --git a/rtc_base/units/unit_base.h b/rtc_base/units/unit_base.h index 7196bae346..4ccd9b750a 100644 --- a/rtc_base/units/unit_base.h +++ b/rtc_base/units/unit_base.h @@ -298,6 +298,14 @@ template inline constexpr Unit_T operator*(int32_t scalar, RelativeUnit other) { return other * scalar; } +template +inline constexpr Unit_T operator-(RelativeUnit other) { + if (other.IsPlusInfinity()) + return UnitBase::MinusInfinity(); + if (other.IsMinusInfinity()) + return UnitBase::PlusInfinity(); + return -1 * other; +} } // namespace rtc_units_impl diff --git a/rtc_base/units/unit_base_unittest.cc b/rtc_base/units/unit_base_unittest.cc index bbdbd8cd10..9eb0c33ae5 100644 --- a/rtc_base/units/unit_base_unittest.cc +++ b/rtc_base/units/unit_base_unittest.cc @@ -231,5 +231,16 @@ TEST(UnitBaseTest, InfinityOperations) { EXPECT_TRUE((finite + TestUnit::MinusInfinity()).IsMinusInfinity()); EXPECT_TRUE((finite - TestUnit::PlusInfinity()).IsMinusInfinity()); } + +TEST(UnitBaseTest, UnaryMinus) { + const int64_t kValue = 1337; + const TestUnit unit = TestUnit::FromValue(kValue); + EXPECT_EQ(-unit.ToValue(), -kValue); + + // Check infinity. + EXPECT_EQ(-TestUnit::PlusInfinity(), TestUnit::MinusInfinity()); + EXPECT_EQ(-TestUnit::MinusInfinity(), TestUnit::PlusInfinity()); +} + } // namespace test } // namespace webrtc