Browse Source

Generated GetHashCode in the C# front-end.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/563/head
Dimitar Dobrev 10 years ago
parent
commit
b15735d539
  1. 20
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  2. 14
      tests/CSharp/CSharp.Tests.cs
  3. 9
      tests/CSharp/CSharp.cpp
  4. 9
      tests/CSharp/CSharp.h

20
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -2199,7 +2199,7 @@ namespace CppSharp.Generators.CSharp @@ -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 @@ -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 @@ -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();
}
}

14
tests/CSharp/CSharp.Tests.cs

@ -1,4 +1,5 @@ @@ -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 @@ -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<TestComparison, int>();
testHashes[testComparison1] = 1;
testHashes[testComparison2] = 2;
Assert.That(testHashes[testComparison1], Is.EqualTo(2));
}
}

9
tests/CSharp/CSharp.cpp

@ -803,3 +803,12 @@ int PassConstantArrayRef(int(&arr)[2]) @@ -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;
}

9
tests/CSharp/CSharp.h

@ -733,3 +733,12 @@ public: @@ -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;
};

Loading…
Cancel
Save