/* 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 struct CanonicalEquatableStruct : IEquatable { // private fields private int _x; private int _y; // constructors /// /// Initializes a new instance of the struct. /// /// The x. /// The y. public CanonicalEquatableStruct(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 ==(CanonicalEquatableStruct lhs, CanonicalEquatableStruct rhs) { return lhs.Equals(rhs); } /// /// 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 !=(CanonicalEquatableStruct lhs, CanonicalEquatableStruct 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(CanonicalEquatableStruct rhs) { // actual work done here to avoid boxing // be sure x and y implement ==, otherwise use Equals return _x == rhs._x && _y == rhs._y; } /// /// 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) { if (!(obj is CanonicalEquatableStruct)) { return false; } // handles obj == null correctly return Equals((CanonicalEquatableStruct)obj); } /// /// 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(); } } }