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
UsingDirective UsingDirective
} }
public enum CXXOperatorArity
{
Unary,
Binary
}
public enum CXXOperatorKind public enum CXXOperatorKind
{ {
None, None,

8
src/Generator/AST/Utils.cs

@ -54,6 +54,14 @@ namespace CppSharp.AST
public static class Operators 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) public static string GetOperatorOverloadPair(CXXOperatorKind kind)
{ {
switch (kind) switch (kind)

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

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

11
tests/Basic/Basic.Tests.cs

@ -44,7 +44,16 @@ public class BasicTests
} }
[Test] [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 bar = new Bar { A = 4, B = 7 };
var bar1 = new Bar { A = 5, B = 10 }; 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)
return 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 operator+(const Bar& b1, const Bar& b2)
{ {
Bar b; Bar b;

1
tests/Basic/Basic.h

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

Loading…
Cancel
Save