summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ady Abraham <adyabr@google.com> 2022-11-22 10:13:38 -0800
committer Ady Abraham <adyabr@google.com> 2022-11-22 14:00:51 -0800
commitf28341eea6759d49ed6d9ba1d97ed1c6602fa0a4 (patch)
tree674ee5e13cedc6e356c6e400af693b27f4a61582
parent686360612b52e825e516ccc706e9c7c43e316c65 (diff)
ftl: add comparison operators to Optional
Add comparison operators and tests for Optional Test: build Bug: 185536303 Change-Id: Ic2002489f5fa04cbb8b4c7aba57c8213b9719944
-rw-r--r--include/ftl/optional.h10
-rw-r--r--libs/ftl/optional_test.cpp31
2 files changed, 41 insertions, 0 deletions
diff --git a/include/ftl/optional.h b/include/ftl/optional.h
index 626507fd8f..7b02bac340 100644
--- a/include/ftl/optional.h
+++ b/include/ftl/optional.h
@@ -97,6 +97,16 @@ struct Optional final : std::optional<T> {
}
};
+template <typename T, typename U>
+constexpr bool operator==(const Optional<T>& lhs, const Optional<U>& rhs) {
+ return static_cast<std::optional<T>>(lhs) == static_cast<std::optional<U>>(rhs);
+}
+
+template <typename T, typename U>
+constexpr bool operator!=(const Optional<T>& lhs, const Optional<U>& rhs) {
+ return !(lhs == rhs);
+}
+
// Deduction guides.
template <typename T>
Optional(T) -> Optional<T>;
diff --git a/libs/ftl/optional_test.cpp b/libs/ftl/optional_test.cpp
index f7410c2aa9..6b3b6c49e5 100644
--- a/libs/ftl/optional_test.cpp
+++ b/libs/ftl/optional_test.cpp
@@ -164,4 +164,35 @@ TEST(Optional, AndThen) {
}));
}
+// Comparison.
+namespace {
+
+constexpr Optional<int> kOptional1 = 1;
+constexpr Optional<int> kAnotherOptional1 = 1;
+constexpr Optional<int> kOptional2 = 2;
+constexpr Optional<int> kOptionalEmpty, kAnotherOptionalEmpty;
+
+constexpr std::optional<int> kStdOptional1 = 1;
+
+static_assert(kOptional1 == kAnotherOptional1);
+
+static_assert(kOptional1 != kOptional2);
+static_assert(kOptional2 != kOptional1);
+
+static_assert(kOptional1 != kOptionalEmpty);
+static_assert(kOptionalEmpty != kOptional1);
+
+static_assert(kOptionalEmpty == kAnotherOptionalEmpty);
+
+static_assert(kOptional1 == kStdOptional1);
+static_assert(kStdOptional1 == kOptional1);
+
+static_assert(kOptional2 != kStdOptional1);
+static_assert(kStdOptional1 != kOptional2);
+
+static_assert(kOptional2 != kOptionalEmpty);
+static_assert(kOptionalEmpty != kOptional2);
+
+} // namespace
+
} // namespace android::test