Browse Source

Reference classes now implement the ICppInstance interface.

This will be used to add support for overrides of Equals and GetHashCode.
pull/13/merge
triton 13 years ago
parent
commit
2e97311423
  1. 34
      src/Generator/Generators/CLI/CLIHeadersTemplate.cs
  2. 20
      src/Generator/Generators/CLI/CLISourcesTemplate.cs

34
src/Generator/Generators/CLI/CLIHeadersTemplate.cs

@ -237,7 +237,7 @@ namespace CppSharp.Generators.CLI
WriteLine("};"); WriteLine("};");
} }
public void GenerateClassNativeField(Class @class, string nativeType) internal static bool HasRefBase(Class @class)
{ {
Class baseClass = null; Class baseClass = null;
@ -247,13 +247,24 @@ namespace CppSharp.Generators.CLI
var hasRefBase = baseClass != null && baseClass.IsRefType var hasRefBase = baseClass != null && baseClass.IsRefType
&& !baseClass.Ignore; && !baseClass.Ignore;
var hasIgnoredBase = baseClass != null && baseClass.Ignore; return hasRefBase;
}
if (!@class.HasBase || !hasRefBase || hasIgnoredBase) public void GenerateClassNativeField(Class @class, string nativeType)
{ {
WriteLineIndent("property {0} NativePtr;", nativeType); if (HasRefBase(@class)) return;
NewLine();
} WriteLineIndent("property {0} NativePtr;", nativeType);
PushIndent();
WriteLine("property System::IntPtr Instance");
WriteStartBraceIndent();
WriteLine("virtual System::IntPtr get();");
WriteLine("virtual void set(System::IntPtr instance);");
WriteCloseBraceIndent();
NewLine();
PopIndent();
} }
public void GenerateClassGenericMethods(Class @class) public void GenerateClassGenericMethods(Class @class)
@ -462,11 +473,12 @@ namespace CppSharp.Generators.CLI
return true; return true;
} }
if (@class.HasBase && !@class.IsValueType) if (HasRefBase(@class))
if (!@class.Bases[0].Class.Ignore) Write(" : {0}", QualifiedIdentifier(@class.Bases[0].Class));
Write(" : {0}", QualifiedIdentifier(@class.Bases[0].Class)); else if (@class.IsRefType)
Write(" : ICppInstance");
WriteLine(string.Empty); NewLine();
WriteLine("{"); WriteLine("{");
WriteLine("public:"); WriteLine("public:");
return false; return false;

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

@ -151,6 +151,26 @@ namespace CppSharp.Generators.CLI
if (@class.IsRefType) if (@class.IsRefType)
{ {
if (!CLIHeadersTemplate.HasRefBase(@class))
{
PushBlock(CLIBlockKind.Method);
WriteLine("System::IntPtr {0}::Instance::get()",
QualifiedIdentifier(@class));
WriteStartBraceIndent();
WriteLine("return System::IntPtr(NativePtr);");
WriteCloseBraceIndent();
PopBlock(NewLineKind.BeforeNextBlock);
PushBlock(CLIBlockKind.Method);
WriteLine("void {0}::Instance::set(System::IntPtr object)",
QualifiedIdentifier(@class));
WriteStartBraceIndent();
var nativeType = string.Format("::{0}*", @class.QualifiedOriginalName);
WriteLine("NativePtr = ({0})object.ToPointer();", nativeType);
WriteCloseBraceIndent();
PopBlock(NewLineKind.BeforeNextBlock);
}
foreach (var field in @class.Fields) foreach (var field in @class.Fields)
{ {
if (ASTUtils.CheckIgnoreField(@class, field)) if (ASTUtils.CheckIgnoreField(@class, field))

Loading…
Cancel
Save