diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index eb2467a0..f6cebfbf 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -2199,7 +2199,7 @@ namespace CppSharp.Generators.CSharp if (method.OperatorKind == CXXOperatorKind.EqualEqual) { - GenerateEquals(method, @class); + GenerateEqualsAndGetHashCode(method, @class); } PopBlock(NewLineKind.BeforeNextBlock); @@ -2246,7 +2246,7 @@ namespace CppSharp.Generators.CSharp (p.Usage == ParameterUsage.InOut ? "ref " : string.Empty) + p.Name))); } - private void GenerateEquals(Function method, Class @class) + private void GenerateEqualsAndGetHashCode(Function method, Class @class) { Class leftHandSide; Class rightHandSide; @@ -2268,6 +2268,22 @@ namespace CppSharp.Generators.CSharp WriteLine("return this == ({0}) obj;", @class.Name); } WriteCloseBraceIndent(); + + NewLine(); + + WriteLine("public override int GetHashCode()"); + WriteStartBraceIndent(); + if (@class.IsRefType) + { + WriteLine("if ({0} == global::System.IntPtr.Zero)", Helpers.InstanceIdentifier); + WriteLineIndent("return global::System.IntPtr.Zero.GetHashCode();"); + WriteLine("return (*(Internal*) {0}).GetHashCode();", Helpers.InstanceIdentifier); + } + else + { + WriteLine("return {0}.GetHashCode();", Helpers.InstanceIdentifier); + } + WriteCloseBraceIndent(); } } diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index c6e74726..4beaabc5 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Reflection; using CppSharp.Utils; using CSharp; @@ -447,4 +448,17 @@ public class CSharpTests : GeneratorTestFixture var result = CSharp.CSharp.PassConstantArrayRef(array); Assert.That(result, Is.EqualTo(array[0])); } + + [Test] + public void TestComparison() + { + var testComparison1 = new TestComparison { A = 5, B = 5.5f }; + var testComparison2 = new TestComparison { A = 5, B = 5.5f }; + Assert.IsTrue(testComparison1 == testComparison2); + Assert.IsTrue(testComparison1.Equals(testComparison2)); + var testHashes = new Dictionary(); + testHashes[testComparison1] = 1; + testHashes[testComparison2] = 2; + Assert.That(testHashes[testComparison1], Is.EqualTo(2)); + } } diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index e30ae4fc..52326678 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -803,3 +803,12 @@ int PassConstantArrayRef(int(&arr)[2]) { return arr[0]; } + +TestComparison::TestComparison() +{ +} + +bool TestComparison::operator ==(const TestComparison& other) const +{ + return A == other.A && B == other.B; +} diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index b6cb696a..51c00768 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -733,3 +733,12 @@ public: }; DLL_API int PassConstantArrayRef(int(&arr)[2]); + +class DLL_API TestComparison +{ +public: + TestComparison(); + int A; + float B; + bool operator ==(const TestComparison& other) const; +};