Loading include/ftl/optional.h +10 −0 Original line number Diff line number Diff line Loading @@ -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>; Loading libs/ftl/optional_test.cpp +31 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
include/ftl/optional.h +10 −0 Original line number Diff line number Diff line Loading @@ -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>; Loading
libs/ftl/optional_test.cpp +31 −0 Original line number Diff line number Diff line Loading @@ -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