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 @@ -2392,14 +2392,15 @@ namespace CppSharp.Generators.CSharp
NewLine();
WriteLine("public override bool Equals(object obj)");
WriteStartBraceIndent();
var printedClass = @class.Visit(TypePrinter);
if (@class.IsRefType)
{
WriteLine("return this == obj as {0};", @class.Name);
WriteLine($"return this == obj as {printedClass};");
}
else
{
WriteLine("if (!(obj is {0})) return false;", @class.Name);
WriteLine("return this == ({0}) obj;", @class.Name);
WriteLine($"if (!(obj is {printedClass})) return false;");
WriteLine($"return this == ({printedClass}) obj;");
}
WriteCloseBraceIndent();
@ -2408,20 +2409,21 @@ namespace CppSharp.Generators.CSharp @@ -2408,20 +2409,21 @@ namespace CppSharp.Generators.CSharp
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 (*({TypePrinter.PrintNative(@class)}*) {
Helpers.InstanceIdentifier}).GetHashCode();");
}
this.GenerateMember(@class, GenerateGetHashCode);
else
{
WriteLine("return {0}.GetHashCode();", Helpers.InstanceIdentifier);
}
WriteLine($"return {Helpers.InstanceIdentifier}.GetHashCode();");
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,
Property property, List<Parameter> parameters = null)
{

13
tests/CSharp/CSharp.Tests.cs

@ -764,6 +764,19 @@ public unsafe class CSharpTests : GeneratorTestFixture @@ -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]
public void TestAbstractImplementatonsInPrimaryAndSecondaryBases()
{

7
tests/CSharp/CSharpTemplates.h

@ -132,6 +132,7 @@ public: @@ -132,6 +132,7 @@ public:
void setProperty(const T& t);
static T staticProperty();
static void setStaticProperty(const T& t);
bool operator==(const HasDefaultTemplateArgument& other);
private:
T field;
static T staticField;
@ -214,6 +215,12 @@ void HasDefaultTemplateArgument<T, D>::setStaticProperty(const T& t) @@ -214,6 +215,12 @@ void HasDefaultTemplateArgument<T, D>::setStaticProperty(const T& 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>
T HasDefaultTemplateArgument<T, D>::staticField;

Loading…
Cancel
Save