/* Copyright 2010-2014 MongoDB Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; namespace MongoDB.Shared { internal class CanonicalEquatableClass : IEquatable { // private fields private int _x; private int _y; // constructors /// /// Initializes a new instance of the class. /// /// The x. /// The y. public CanonicalEquatableClass(int x, int y) { _x = y; _y = y; } // public operators /// /// Determines whether two instances are equal. /// /// The LHS. /// The RHS. /// /// true if the left hand side is equal to the right hand side; otherwise, false. /// public static bool operator ==(CanonicalEquatableClass lhs, CanonicalEquatableClass rhs) { return object.Equals(lhs, rhs); // handles lhs == null correctly } /// /// Determines whether two instances are not equal. /// /// The LHS. /// The RHS. /// /// true if the left hand side is not equal to the right hand side; otherwise, false. /// public static bool operator !=(CanonicalEquatableClass lhs, CanonicalEquatableClass rhs) { return !(lhs == rhs); } // public methods /// /// Determines whether the specified is equal to this instance. /// /// The to compare with this instance. /// /// true if the specified is equal to this instance; otherwise, false. /// public bool Equals(CanonicalEquatableClass obj) { return Equals((object)obj); // handles obj == null correctly } /// /// Determines whether the specified is equal to this instance. /// /// The to compare with this instance. /// /// true if the specified is equal to this instance; otherwise, false. /// public override bool Equals(object obj) { // actual work done here (in virtual Equals) to handle inheritance // use ReferenceEquals consistently because sometimes using == can lead to recursion loops // make sure to use GetType instead of typeof in case derived classes are involved if (object.ReferenceEquals(obj, null) || GetType() != obj.GetType()) { return false; } var rhs = (CanonicalEquatableClass)obj; return // be sure x and y implement ==, otherwise use Equals _x == rhs._x && _y == rhs._y; } /// /// Returns a hash code for this instance. /// /// /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. /// public override int GetHashCode() { return new Hasher() .Hash(_x) .Hash(_y) .GetHashCode(); } } }