Browse Source

Fixed the generated C# for comparison operators in templates.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/890/head
Dimitar Dobrev 8 years ago
parent
commit
075b2d5078
  1. 26
      src/Generator/Generators/CSharp/CSharpSources.cs
  2. 13
      tests/CSharp/CSharp.Tests.cs
  3. 7
      tests/CSharp/CSharpTemplates.h

26
src/Generator/Generators/CSharp/CSharpSources.cs

@ -2392,14 +2392,15 @@ namespace CppSharp.Generators.CSharp
NewLine(); NewLine();
WriteLine("public override bool Equals(object obj)"); WriteLine("public override bool Equals(object obj)");
WriteStartBraceIndent(); WriteStartBraceIndent();
var printedClass = @class.Visit(TypePrinter);
if (@class.IsRefType) if (@class.IsRefType)
{ {
WriteLine("return this == obj as {0};", @class.Name); WriteLine($"return this == obj as {printedClass};");
} }
else else
{ {
WriteLine("if (!(obj is {0})) return false;", @class.Name); WriteLine($"if (!(obj is {printedClass})) return false;");
WriteLine("return this == ({0}) obj;", @class.Name); WriteLine($"return this == ({printedClass}) obj;");
} }
WriteCloseBraceIndent(); WriteCloseBraceIndent();
@ -2408,20 +2409,21 @@ namespace CppSharp.Generators.CSharp
WriteLine("public override int GetHashCode()"); WriteLine("public override int GetHashCode()");
WriteStartBraceIndent(); WriteStartBraceIndent();
if (@class.IsRefType) if (@class.IsRefType)
{ this.GenerateMember(@class, GenerateGetHashCode);
WriteLine("if ({0} == global::System.IntPtr.Zero)", Helpers.InstanceIdentifier);
WriteLineIndent("return global::System.IntPtr.Zero.GetHashCode();");
WriteLine($@"return (*({TypePrinter.PrintNative(@class)}*) {
Helpers.InstanceIdentifier}).GetHashCode();");
}
else else
{ WriteLine($"return {Helpers.InstanceIdentifier}.GetHashCode();");
WriteLine("return {0}.GetHashCode();", Helpers.InstanceIdentifier);
}
WriteCloseBraceIndent(); WriteCloseBraceIndent();
} }
} }
private void GenerateGetHashCode(Class @class)
{
WriteLine($"if ({Helpers.InstanceIdentifier} == global::System.IntPtr.Zero)");
WriteLineIndent("return global::System.IntPtr.Zero.GetHashCode();");
WriteLine($@"return (*({TypePrinter.PrintNative(@class)}*) {
Helpers.InstanceIdentifier}).GetHashCode();");
}
private void GenerateVirtualPropertyCall(Method method, Class @class, private void GenerateVirtualPropertyCall(Method method, Class @class,
Property property, List<Parameter> parameters = null) Property property, List<Parameter> parameters = null)
{ {

13
tests/CSharp/CSharp.Tests.cs

@ -764,6 +764,19 @@ public unsafe class CSharpTests : GeneratorTestFixture
} }
} }
[Test]
public void TestTemplateComparison()
{
using (var left = new HasDefaultTemplateArgument<int, int>())
using (var right = new HasDefaultTemplateArgument<int, int>())
{
left.Property = 15;
right.Property = 15;
Assert.IsTrue(left == right);
Assert.IsTrue(left.Equals(right));
}
}
[Test] [Test]
public void TestAbstractImplementatonsInPrimaryAndSecondaryBases() public void TestAbstractImplementatonsInPrimaryAndSecondaryBases()
{ {

7
tests/CSharp/CSharpTemplates.h

@ -132,6 +132,7 @@ public:
void setProperty(const T& t); void setProperty(const T& t);
static T staticProperty(); static T staticProperty();
static void setStaticProperty(const T& t); static void setStaticProperty(const T& t);
bool operator==(const HasDefaultTemplateArgument& other);
private: private:
T field; T field;
static T staticField; static T staticField;
@ -214,6 +215,12 @@ void HasDefaultTemplateArgument<T, D>::setStaticProperty(const T& t)
staticField = t; staticField = t;
} }
template <typename T, typename D>
bool HasDefaultTemplateArgument<T, D>::operator==(const HasDefaultTemplateArgument& other)
{
return field == other.field;
}
template <typename T, typename D> template <typename T, typename D>
T HasDefaultTemplateArgument<T, D>::staticField; T HasDefaultTemplateArgument<T, D>::staticField;

Loading…
Cancel
Save