| 1536 | |
| 1537 | template <typename Type> |
| 1538 | bool ArrayStatisticsOptionalValueEquals(const std::optional<Type>& left, |
| 1539 | const std::optional<Type>& right, |
| 1540 | const EqualOptions& options) { |
| 1541 | if (!left.has_value() || !right.has_value()) { |
| 1542 | return left.has_value() == right.has_value(); |
| 1543 | } else if constexpr (std::is_same_v<Type, double>) { |
| 1544 | return DoubleEquals(left.value(), right.value(), options); |
| 1545 | } else if (left->index() != right->index()) { |
| 1546 | return false; |
| 1547 | } else { |
| 1548 | auto EqualsVisitor = [&](const auto& v1, const auto& v2) { |
| 1549 | using type_1 = std::decay_t<decltype(v1)>; |
| 1550 | using type_2 = std::decay_t<decltype(v2)>; |
| 1551 | if constexpr (std::conjunction_v<std::is_same<type_1, double>, |
| 1552 | std::is_same<type_2, double>>) { |
| 1553 | return DoubleEquals(v1, v2, options); |
| 1554 | } else if constexpr (std::is_same_v<type_1, type_2>) { |
| 1555 | return v1 == v2; |
| 1556 | } |
| 1557 | Unreachable("The types are different."); |
| 1558 | return false; |
| 1559 | }; |
| 1560 | return std::visit(EqualsVisitor, left.value(), right.value()); |
| 1561 | } |
| 1562 | } |
| 1563 | |
| 1564 | bool ArrayStatisticsEqualsImpl(const ArrayStatistics& left, const ArrayStatistics& right, |
| 1565 | const EqualOptions& equal_options) { |
no test coverage detected