diff options
-rw-r--r-- | include/ftl/optional.h | 10 | ||||
-rw-r--r-- | libs/ftl/optional_test.cpp | 31 |
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 |