Add unary operator- to units

This will be used in the frame buffer 3 scheduler.

Bug: webrtc:13343
Change-Id: Ib699072021da30022a34aabe24e36a37e89ddf41
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/245642
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Evan Shrubsole <eshr@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35658}
diff --git a/BUILD.gn b/BUILD.gn
index 3d4fedf..eb06453 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -562,6 +562,7 @@
       "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 7196bae..4ccd9b7 100644
--- a/rtc_base/units/unit_base.h
+++ b/rtc_base/units/unit_base.h
@@ -298,6 +298,14 @@
 inline constexpr Unit_T operator*(int32_t scalar, RelativeUnit<Unit_T> other) {
   return other * scalar;
 }
+template <class Unit_T>
+inline constexpr Unit_T operator-(RelativeUnit<Unit_T> other) {
+  if (other.IsPlusInfinity())
+    return UnitBase<Unit_T>::MinusInfinity();
+  if (other.IsMinusInfinity())
+    return UnitBase<Unit_T>::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 bbdbd8c..9eb0c33 100644
--- a/rtc_base/units/unit_base_unittest.cc
+++ b/rtc_base/units/unit_base_unittest.cc
@@ -231,5 +231,16 @@
   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