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