Browse Source

Merge pull request #72 from ddobrev/master

Fixes on the conversion operators
pull/74/head
João Matos 12 years ago
parent
commit
d83db94c5c
  1. 1
      README.md
  2. 5
      src/AST/Class.cs
  3. 5
      src/AST/Namespace.cs
  4. 4
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  5. 3
      src/Generator/Passes/CheckAmbiguousFunctions.cs
  6. 3
      src/Generator/Passes/CheckOperatorsOverloads.cs
  7. 11
      src/Generator/Types/Types.cs
  8. 3
      tests/CSharpTemp/CSharpTemp.Tests.cs
  9. 5
      tests/CSharpTemp/CSharpTemp.cpp
  10. 9
      tests/CSharpTemp/CSharpTemp.h

1
README.md

@ -2,6 +2,7 @@ CppSharp is a library that allows you to generate .NET bindings that wrap C/C++
## News ## News
* September 22nd 2013 - Conversion (type cast) operators wrapped (thanks to <a href="https://github.com/ddobrev">@ddobrev</a>)
* September 21st 2013 - Multiple inheritance now supported (thanks to <a href="https://github.com/ddobrev">@ddobrev</a>) * September 21st 2013 - Multiple inheritance now supported (thanks to <a href="https://github.com/ddobrev">@ddobrev</a>)
* September 11th 2013 - Added wrapping of inlined functions (thanks to <a href="https://github.com/ddobrev">@ddobrev</a>) * September 11th 2013 - Added wrapping of inlined functions (thanks to <a href="https://github.com/ddobrev">@ddobrev</a>)

5
src/AST/Class.cs

@ -191,8 +191,9 @@ namespace CppSharp.AST
public override IEnumerable<Function> GetFunctionOverloads(Function function) public override IEnumerable<Function> GetFunctionOverloads(Function function)
{ {
return Methods.Where(method => method.Name == function.Name) if (function.OperatorKind == CXXOperatorKind.Conversion)
.Cast<Function>(); return Methods.Where(fn => fn.OperatorKind == CXXOperatorKind.Conversion);
return Methods.Where(method => method.Name == function.Name);
} }
public IEnumerable<T> FindHierarchy<T>(Func<Class, IEnumerable<T>> func) public IEnumerable<T> FindHierarchy<T>(Func<Class, IEnumerable<T>> func)

5
src/AST/Namespace.cs

@ -242,8 +242,9 @@ namespace CppSharp.AST
public virtual IEnumerable<Function> GetFunctionOverloads(Function function) public virtual IEnumerable<Function> GetFunctionOverloads(Function function)
{ {
return Functions.Where(fn => fn.Name == function.Name) if (function.OperatorKind == CXXOperatorKind.Conversion)
.ToList(); return Functions.Where(fn => fn.OperatorKind == CXXOperatorKind.Conversion);
return Functions.Where(fn => fn.Name == function.Name);
} }
public bool HasDeclarations public bool HasDeclarations

4
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -2152,10 +2152,10 @@ namespace CppSharp.Generators.CSharp
public static string GetFunctionNativeIdentifier(Function function) public static string GetFunctionNativeIdentifier(Function function)
{ {
var identifier = SafeIdentifier(function.Name);; var identifier = SafeIdentifier(function.Name);
if (function.IsOperator) if (function.IsOperator)
identifier = "Operator" + function.OperatorKind.ToString(); identifier = "Operator" + function.OperatorKind;
var overloads = function.Namespace.GetFunctionOverloads(function) var overloads = function.Namespace.GetFunctionOverloads(function)
.ToList(); .ToList();

3
src/Generator/Passes/CheckAmbiguousFunctions.cs

@ -35,6 +35,9 @@ namespace CppSharp.Passes
foreach (var overload in overloads) foreach (var overload in overloads)
{ {
if (function.OperatorKind == CXXOperatorKind.Conversion)
continue;
if (overload == function) continue; if (overload == function) continue;
if (overload.Ignore) continue; if (overload.Ignore) continue;

3
src/Generator/Passes/CheckOperatorsOverloads.cs

@ -20,6 +20,9 @@ namespace CppSharp.Passes
if (AlreadyVisited(@class)) if (AlreadyVisited(@class))
return false; return false;
if (!VisitDeclarationContext(@class))
return false;
// Check for C++ operators that cannot be represented in C#. // Check for C++ operators that cannot be represented in C#.
CheckInvalidOperators(@class); CheckInvalidOperators(@class);

11
src/Generator/Types/Types.cs

@ -97,6 +97,17 @@ namespace CppSharp
return base.VisitTypedefDecl(typedef); return base.VisitTypedefDecl(typedef);
} }
public override bool VisitMemberPointerType(MemberPointerType member, TypeQualifiers quals)
{
FunctionType functionType;
if (!member.IsPointerTo(out functionType))
{
Ignore();
return false;
}
return base.VisitMemberPointerType(member, quals);
}
public override bool VisitTemplateSpecializationType( public override bool VisitTemplateSpecializationType(
TemplateSpecializationType template, TypeQualifiers quals) TemplateSpecializationType template, TypeQualifiers quals)
{ {

3
tests/CSharpTemp/CSharpTemp.Tests.cs

@ -46,5 +46,8 @@ public class CSharpTempTests
Assert.That(baz.returnQux().farAwayFunc(), Is.EqualTo(20)); Assert.That(baz.returnQux().farAwayFunc(), Is.EqualTo(20));
int cast = baz; int cast = baz;
Assert.That(cast, Is.EqualTo(500)); Assert.That(cast, Is.EqualTo(500));
var nested = new Baz.Nested();
int nestedCast = nested;
Assert.That(nestedCast, Is.EqualTo(300));
} }
} }

5
tests/CSharpTemp/CSharpTemp.cpp

@ -46,6 +46,11 @@ Foo& Bar::operator[](int i)
return m_foo; return m_foo;
} }
Baz::Nested::operator int() const
{
return 300;
}
int Baz::takesQux(const Qux& qux) int Baz::takesQux(const Qux& qux)
{ {
return qux.farAwayFunc(); return qux.farAwayFunc();

9
tests/CSharpTemp/CSharpTemp.h

@ -38,7 +38,16 @@ private:
class DLL_API Baz : public Foo, public Bar class DLL_API Baz : public Foo, public Bar
{ {
public: public:
class DLL_API Nested
{
public:
operator int() const;
};
int takesQux(const Qux& qux); int takesQux(const Qux& qux);
Qux returnQux(); Qux returnQux();
operator int() const; operator int() const;
typedef void *Baz::*FunctionPointerResolvedAsVoidStar;
operator FunctionPointerResolvedAsVoidStar() const { return 0; }
}; };

Loading…
Cancel
Save