Browse Source

Added better support for unary operators.

pull/49/merge
triton 12 years ago
parent
commit
a4f1606956
  1. 6
      src/AST/Method.cs
  2. 8
      src/Generator/AST/Utils.cs
  3. 13
      src/Generator/Generators/CLI/CLISourcesTemplate.cs
  4. 11
      tests/Basic/Basic.Tests.cs
  5. 8
      tests/Basic/Basic.cpp
  6. 1
      tests/Basic/Basic.h

6
src/AST/Method.cs

@ -10,6 +10,12 @@ namespace CppSharp.AST @@ -10,6 +10,12 @@ namespace CppSharp.AST
UsingDirective
}
public enum CXXOperatorArity
{
Unary,
Binary
}
public enum CXXOperatorKind
{
None,

8
src/Generator/AST/Utils.cs

@ -54,6 +54,14 @@ namespace CppSharp.AST @@ -54,6 +54,14 @@ namespace CppSharp.AST
public static class Operators
{
public static CXXOperatorArity ClassifyOperator(Function function)
{
if (function.Parameters.Count == 1)
return CXXOperatorArity.Unary;
return CXXOperatorArity.Binary;
}
public static string GetOperatorOverloadPair(CXXOperatorKind kind)
{
switch (kind)

13
src/Generator/Generators/CLI/CLISourcesTemplate.cs

@ -745,15 +745,18 @@ namespace CppSharp.Generators.CLI @@ -745,15 +745,18 @@ namespace CppSharp.Generators.CLI
if (function.IsOperator)
{
var kind = function.OperatorKind;
var isBinary = function.Parameters.Count > 0;
var opName = function.Name.Replace("operator", "").Trim();
// Binary operator
if (isBinary)
switch (Operators.ClassifyOperator(function))
{
case CXXOperatorArity.Unary:
WriteLine("{0} {1};", opName, @params[0].Name);
break;
case CXXOperatorArity.Binary:
WriteLine("{0} {1} {2};", @params[0].Name, opName,
@params[1].Name);
break;
}
}
else
{

11
tests/Basic/Basic.Tests.cs

@ -44,7 +44,16 @@ public class BasicTests @@ -44,7 +44,16 @@ public class BasicTests
}
[Test]
public void TestFunctionOperator()
public void TestUnaryOperator()
{
var bar = new Bar { A = 4, B = 7 };
var barMinus = -bar;
Assert.That(barMinus.A, Is.EqualTo(-bar.A));
Assert.That(barMinus.B, Is.EqualTo(-bar.B));
}
[Test]
public void TestBinaryOperator()
{
var bar = new Bar { A = 4, B = 7 };
var bar1 = new Bar { A = 5, B = 10 };

8
tests/Basic/Basic.cpp

@ -81,6 +81,14 @@ const wchar_t* wcharFunction(const wchar_t* constWideChar) @@ -81,6 +81,14 @@ const wchar_t* wcharFunction(const wchar_t* constWideChar)
return constWideChar;
}
Bar operator-(const Bar& b)
{
Bar nb;
nb.A = -b.A;
nb.B = -b.B;
return nb;
}
Bar operator+(const Bar& b1, const Bar& b2)
{
Bar b;

1
tests/Basic/Basic.h

@ -71,6 +71,7 @@ public: @@ -71,6 +71,7 @@ public:
int RetEnum(Enum);
};
DLL_API Bar operator-(const Bar &);
DLL_API Bar operator+(const Bar &, const Bar &);
int DLL_API unsafeFunction(const Bar& ret, char* testForString, void (*foo)(int));

Loading…
Cancel
Save