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

1
tests/Common/Common.Tests.cs

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

7
tests/Common/Common.cpp

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

4
tests/Common/Common.h

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

Loading…
Cancel
Save