| 722 | |
| 723 | impl PartialEq for Val { |
| 724 | fn eq(&self, other: &Self) -> bool { |
| 725 | match (self, other) { |
| 726 | // IEEE 754 equality considers NaN inequal to NaN and negative zero |
| 727 | // equal to positive zero, however we do the opposite here, because |
| 728 | // this logic is used by testing and fuzzing, which want to know |
| 729 | // whether two values are semantically the same, rather than |
| 730 | // numerically equal. |
| 731 | (Self::Float32(l), Self::Float32(r)) => { |
| 732 | (*l != 0.0 && l == r) |
| 733 | || (*l == 0.0 && l.to_bits() == r.to_bits()) |
| 734 | || (l.is_nan() && r.is_nan()) |
| 735 | } |
| 736 | (Self::Float32(_), _) => false, |
| 737 | (Self::Float64(l), Self::Float64(r)) => { |
| 738 | (*l != 0.0 && l == r) |
| 739 | || (*l == 0.0 && l.to_bits() == r.to_bits()) |
| 740 | || (l.is_nan() && r.is_nan()) |
| 741 | } |
| 742 | (Self::Float64(_), _) => false, |
| 743 | |
| 744 | (Self::Bool(l), Self::Bool(r)) => l == r, |
| 745 | (Self::Bool(_), _) => false, |
| 746 | (Self::S8(l), Self::S8(r)) => l == r, |
| 747 | (Self::S8(_), _) => false, |
| 748 | (Self::U8(l), Self::U8(r)) => l == r, |
| 749 | (Self::U8(_), _) => false, |
| 750 | (Self::S16(l), Self::S16(r)) => l == r, |
| 751 | (Self::S16(_), _) => false, |
| 752 | (Self::U16(l), Self::U16(r)) => l == r, |
| 753 | (Self::U16(_), _) => false, |
| 754 | (Self::S32(l), Self::S32(r)) => l == r, |
| 755 | (Self::S32(_), _) => false, |
| 756 | (Self::U32(l), Self::U32(r)) => l == r, |
| 757 | (Self::U32(_), _) => false, |
| 758 | (Self::S64(l), Self::S64(r)) => l == r, |
| 759 | (Self::S64(_), _) => false, |
| 760 | (Self::U64(l), Self::U64(r)) => l == r, |
| 761 | (Self::U64(_), _) => false, |
| 762 | (Self::Char(l), Self::Char(r)) => l == r, |
| 763 | (Self::Char(_), _) => false, |
| 764 | (Self::String(l), Self::String(r)) => l == r, |
| 765 | (Self::String(_), _) => false, |
| 766 | (Self::List(l), Self::List(r)) => l == r, |
| 767 | (Self::List(_), _) => false, |
| 768 | (Self::Map(l), Self::Map(r)) => l == r, |
| 769 | (Self::Map(_), _) => false, |
| 770 | (Self::Record(l), Self::Record(r)) => l == r, |
| 771 | (Self::Record(_), _) => false, |
| 772 | (Self::Tuple(l), Self::Tuple(r)) => l == r, |
| 773 | (Self::Tuple(_), _) => false, |
| 774 | (Self::Variant(ln, lv), Self::Variant(rn, rv)) => ln == rn && lv == rv, |
| 775 | (Self::Variant(..), _) => false, |
| 776 | (Self::Enum(l), Self::Enum(r)) => l == r, |
| 777 | (Self::Enum(_), _) => false, |
| 778 | (Self::Option(l), Self::Option(r)) => l == r, |
| 779 | (Self::Option(_), _) => false, |
| 780 | (Self::Result(l), Self::Result(r)) => l == r, |
| 781 | (Self::Result(_), _) => false, |