Browse Source

Complemented comparison operators with the first parameter not of the containing type.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/256/merge
Dimitar Dobrev 10 years ago
parent
commit
bd5df799c9
  1. 16
      src/Generator/Passes/CheckOperatorsOverloads.cs
  2. 1
      tests/Common/Common.Tests.cs
  3. 7
      tests/Common/Common.cpp
  4. 4
      tests/Common/Common.h

16
src/Generator/Passes/CheckOperatorsOverloads.cs

@ -89,7 +89,7 @@ namespace CppSharp.Passes
} }
} }
void CreateIndexer(Class @class, Method @operator) private void CreateIndexer(Class @class, Method @operator)
{ {
var property = new Property var property = new Property
{ {
@ -103,7 +103,7 @@ namespace CppSharp.Passes
var returnType = @operator.Type; var returnType = @operator.Type;
if (returnType.IsAddress()) if (returnType.IsAddress())
{ {
var pointer = returnType as PointerType; var pointer = (PointerType) returnType;
var qualifiedPointee = pointer.QualifiedPointee; var qualifiedPointee = pointer.QualifiedPointee;
if (!qualifiedPointee.Qualifiers.IsConst) if (!qualifiedPointee.Qualifiers.IsConst)
property.SetMethod = @operator; property.SetMethod = @operator;
@ -126,7 +126,7 @@ namespace CppSharp.Passes
@operator.GenerationKind = GenerationKind.Internal; @operator.GenerationKind = GenerationKind.Internal;
} }
static void HandleMissingOperatorOverloadPair(Class @class, CXXOperatorKind op1, private static void HandleMissingOperatorOverloadPair(Class @class, CXXOperatorKind op1,
CXXOperatorKind op2) CXXOperatorKind op2)
{ {
foreach (var op in @class.Operators.Where( foreach (var op in @class.Operators.Where(
@ -134,7 +134,7 @@ namespace CppSharp.Passes
{ {
int index; int index;
var missingKind = CheckMissingOperatorOverloadPair(@class, out index, op1, op2, var missingKind = CheckMissingOperatorOverloadPair(@class, out index, op1, op2,
op.Parameters.Last().Type); op.Parameters.First().Type, op.Parameters.Last().Type);
if (missingKind == CXXOperatorKind.None || !op.IsGenerated) if (missingKind == CXXOperatorKind.None || !op.IsGenerated)
continue; continue;
@ -154,13 +154,13 @@ namespace CppSharp.Passes
} }
} }
static CXXOperatorKind CheckMissingOperatorOverloadPair(Class @class, static CXXOperatorKind CheckMissingOperatorOverloadPair(Class @class, out int index,
out int index, CXXOperatorKind op1, CXXOperatorKind op2, Type type) CXXOperatorKind op1, CXXOperatorKind op2, Type typeLeft, Type typeRight)
{ {
var first = @class.Operators.FirstOrDefault(o => o.OperatorKind == op1 && var first = @class.Operators.FirstOrDefault(o => o.OperatorKind == op1 &&
o.Parameters.Last().Type.Equals(type)); o.Parameters.First().Type.Equals(typeLeft) && o.Parameters.Last().Type.Equals(typeRight));
var second = @class.Operators.FirstOrDefault(o => o.OperatorKind == op2 && var second = @class.Operators.FirstOrDefault(o => o.OperatorKind == op2 &&
o.Parameters.Last().Type.Equals(type)); o.Parameters.First().Type.Equals(typeLeft) && o.Parameters.Last().Type.Equals(typeRight));
var hasFirst = first != null; var hasFirst = first != null;
var hasSecond = second != null; var hasSecond = second != null;

1
tests/Common/Common.Tests.cs

@ -16,6 +16,7 @@ public class CommonTests : GeneratorTestFixture
using (var foo = new Foo()) using (var foo = new Foo())
{ {
Bar bar = foo; Bar bar = foo;
Assert.IsTrue(Bar.Item.Item1 == bar);
} }
using (var overridesNonDirectVirtual = new OverridesNonDirectVirtual()) using (var overridesNonDirectVirtual = new OverridesNonDirectVirtual())
{ {

7
tests/Common/Common.cpp

@ -67,7 +67,7 @@ Bar::Bar(const Foo* foo)
{ {
} }
Bar::Item Bar::RetItem1() Bar::Item Bar::RetItem1() const
{ {
return Bar::Item1; return Bar::Item1;
} }
@ -82,6 +82,11 @@ bool Bar::operator ==(const Bar& other) const
return A == other.A && B == other.B; return A == other.A && B == other.B;
} }
bool operator ==(Bar::Item item, const Bar& bar)
{
return item == bar.RetItem1();
}
Bar2::Nested::operator int() const Bar2::Nested::operator int() const
{ {
return 300; return 300;

4
tests/Common/Common.h

@ -73,7 +73,7 @@ struct DLL_API Bar
Bar(); Bar();
Bar(Foo foo); Bar(Foo foo);
explicit Bar(const Foo* foo); explicit Bar(const Foo* foo);
Item RetItem1(); Item RetItem1() const;
int A; int A;
float B; float B;
@ -82,6 +82,8 @@ struct DLL_API Bar
bool operator ==(const Bar& other) const; bool operator ==(const Bar& other) const;
}; };
DLL_API bool operator ==(Bar::Item item, const Bar& bar);
class DLL_API Foo2 : public Foo class DLL_API Foo2 : public Foo
{ {
struct Copy { struct Copy {

Loading…
Cancel
Save