Add C# support for wrapping C++11 strongly typed enums

This commit is contained in:
William S Fulton 2014-11-22 16:45:44 +00:00
commit 366948079f
3 changed files with 188 additions and 4 deletions

View file

@ -28,6 +28,9 @@ CPP_TEST_CASES = \
intermediary_classname \
li_boost_intrusive_ptr
CPP11_TEST_CASES = \
cpp11_strongly_typed_enumerations_simple \
include $(srcdir)/../common.mk
# Overridden variables here

View file

@ -0,0 +1,163 @@
// This is the bool runtime testcase. It checks that the C++ bool type works.
using System;
using cpp11_strongly_typed_enumerationsNamespace;
public class cpp11_strongly_typed_enumerations_runme {
public static int enumCheck(int actual, int expected) {
if (actual != expected)
throw new ApplicationException("Enum value mismatch. Expected " + expected + " Actual: " + actual);
return expected + 1;
}
public static void Main() {
int val = 0;
val = enumCheck((int)Enum1.Val1, val);
val = enumCheck((int)Enum1.Val2, val);
val = enumCheck((int)Enum1.Val3, 13);
val = enumCheck((int)Enum1.Val4, val);
val = enumCheck((int)Enum1.Val5a, 13);
val = enumCheck((int)Enum1.Val6a, val);
val = 0;
val = enumCheck((int)Enum2.Val1, val);
val = enumCheck((int)Enum2.Val2, val);
val = enumCheck((int)Enum2.Val3, 23);
val = enumCheck((int)Enum2.Val4, val);
val = enumCheck((int)Enum2.Val5b, 23);
val = enumCheck((int)Enum2.Val6b, val);
val = 0;
val = enumCheck((int)Enum4.Val1, val);
val = enumCheck((int)Enum4.Val2, val);
val = enumCheck((int)Enum4.Val3, 43);
val = enumCheck((int)Enum4.Val4, val);
val = 0;
val = enumCheck((int)Enum5.Val1, val);
val = enumCheck((int)Enum5.Val2, val);
val = enumCheck((int)Enum5.Val3, 53);
val = enumCheck((int)Enum5.Val4, val);
val = 0;
val = enumCheck((int)Enum6.Val1, val);
val = enumCheck((int)Enum6.Val2, val);
val = enumCheck((int)Enum6.Val3, 63);
val = enumCheck((int)Enum6.Val4, val);
val = 0;
val = enumCheck((int)Enum7td.Val1, val);
val = enumCheck((int)Enum7td.Val2, val);
val = enumCheck((int)Enum7td.Val3, 73);
val = enumCheck((int)Enum7td.Val4, val);
val = 0;
val = enumCheck((int)Enum8.Val1, val);
val = enumCheck((int)Enum8.Val2, val);
val = enumCheck((int)Enum8.Val3, 83);
val = enumCheck((int)Enum8.Val4, val);
val = 0;
val = enumCheck((int)Enum10.Val1, val);
val = enumCheck((int)Enum10.Val2, val);
val = enumCheck((int)Enum10.Val3, 103);
val = enumCheck((int)Enum10.Val4, val);
val = 0;
val = enumCheck((int)Class1.Enum12.Val1, 1121);
val = enumCheck((int)Class1.Enum12.Val2, 1122);
val = enumCheck((int)Class1.Enum12.Val3, val);
val = enumCheck((int)Class1.Enum12.Val4, val);
val = enumCheck((int)Class1.Enum12.Val5c, 1121);
val = enumCheck((int)Class1.Enum12.Val6c, val);
val = 0;
val = enumCheck((int)Class1.Enum13.Val1, 1131);
val = enumCheck((int)Class1.Enum13.Val2, 1132);
val = enumCheck((int)Class1.Enum13.Val3, val);
val = enumCheck((int)Class1.Enum13.Val4, val);
val = enumCheck((int)Class1.Enum13.Val5d, 1131);
val = enumCheck((int)Class1.Enum13.Val6d, val);
val = 0;
val = enumCheck((int)Class1.Enum14.Val1, 1141);
val = enumCheck((int)Class1.Enum14.Val2, 1142);
val = enumCheck((int)Class1.Enum14.Val3, val);
val = enumCheck((int)Class1.Enum14.Val4, val);
val = enumCheck((int)Class1.Enum14.Val5e, 1141);
val = enumCheck((int)Class1.Enum14.Val6e, val);
val = 0;
val = enumCheck((int)Class1.Struct1.Enum12.Val1, 3121);
val = enumCheck((int)Class1.Struct1.Enum12.Val2, 3122);
val = enumCheck((int)Class1.Struct1.Enum12.Val3, val);
val = enumCheck((int)Class1.Struct1.Enum12.Val4, val);
val = enumCheck((int)Class1.Struct1.Enum12.Val5f, 3121);
val = enumCheck((int)Class1.Struct1.Enum12.Val6f, val);
val = 0;
val = enumCheck((int)Class1.Struct1.Enum13.Val1, 3131);
val = enumCheck((int)Class1.Struct1.Enum13.Val2, 3132);
val = enumCheck((int)Class1.Struct1.Enum13.Val3, val);
val = enumCheck((int)Class1.Struct1.Enum13.Val4, val);
val = 0;
val = enumCheck((int)Class1.Struct1.Enum14.Val1, 3141);
val = enumCheck((int)Class1.Struct1.Enum14.Val2, 3142);
val = enumCheck((int)Class1.Struct1.Enum14.Val3, val);
val = enumCheck((int)Class1.Struct1.Enum14.Val4, val);
val = enumCheck((int)Class1.Struct1.Enum14.Val5g, 3141);
val = enumCheck((int)Class1.Struct1.Enum14.Val6g, val);
val = 0;
val = enumCheck((int)Class2.Enum12.Val1, 2121);
val = enumCheck((int)Class2.Enum12.Val2, 2122);
val = enumCheck((int)Class2.Enum12.Val3, val);
val = enumCheck((int)Class2.Enum12.Val4, val);
val = enumCheck((int)Class2.Enum12.Val5h, 2121);
val = enumCheck((int)Class2.Enum12.Val6h, val);
val = 0;
val = enumCheck((int)Class2.Enum13.Val1, 2131);
val = enumCheck((int)Class2.Enum13.Val2, 2132);
val = enumCheck((int)Class2.Enum13.Val3, val);
val = enumCheck((int)Class2.Enum13.Val4, val);
val = enumCheck((int)Class2.Enum13.Val5i, 2131);
val = enumCheck((int)Class2.Enum13.Val6i, val);
val = 0;
val = enumCheck((int)Class2.Enum14.Val1, 2141);
val = enumCheck((int)Class2.Enum14.Val2, 2142);
val = enumCheck((int)Class2.Enum14.Val3, val);
val = enumCheck((int)Class2.Enum14.Val4, val);
val = enumCheck((int)Class2.Enum14.Val5j, 2141);
val = enumCheck((int)Class2.Enum14.Val6j, val);
val = 0;
val = enumCheck((int)Class2.Struct1.Enum12.Val1, 4121);
val = enumCheck((int)Class2.Struct1.Enum12.Val2, 4122);
val = enumCheck((int)Class2.Struct1.Enum12.Val3, val);
val = enumCheck((int)Class2.Struct1.Enum12.Val4, val);
val = enumCheck((int)Class2.Struct1.Enum12.Val5k, 4121);
val = enumCheck((int)Class2.Struct1.Enum12.Val6k, val);
val = 0;
val = enumCheck((int)Class2.Struct1.Enum13.Val1, 4131);
val = enumCheck((int)Class2.Struct1.Enum13.Val2, 4132);
val = enumCheck((int)Class2.Struct1.Enum13.Val3, val);
val = enumCheck((int)Class2.Struct1.Enum13.Val4, val);
val = enumCheck((int)Class2.Struct1.Enum13.Val5l, 4131);
val = enumCheck((int)Class2.Struct1.Enum13.Val6l, val);
val = 0;
val = enumCheck((int)Class2.Struct1.Enum14.Val1, 4141);
val = enumCheck((int)Class2.Struct1.Enum14.Val2, 4142);
val = enumCheck((int)Class2.Struct1.Enum14.Val3, val);
val = enumCheck((int)Class2.Struct1.Enum14.Val4, val);
val = enumCheck((int)Class2.Struct1.Enum14.Val5m, 4141);
val = enumCheck((int)Class2.Struct1.Enum14.Val6m, val);
}
}

View file

@ -719,7 +719,7 @@ public:
String *overloaded_name = getOverloadedName(n);
if (!Getattr(n, "sym:overloaded")) {
if (!addSymbol(Getattr(n, "sym:name"), n, imclass_name))
if (!addSymbol(symname, n, imclass_name))
return SWIG_ERROR;
}
@ -1266,6 +1266,7 @@ public:
int unnamedinstance = GetFlag(parent, "unnamedinstance");
String *parent_name = Getattr(parent, "name");
String *nspace = getNSpace();
String *newsymname = 0;
String *tmpValue;
// Strange hack from parent method
@ -1290,14 +1291,20 @@ public:
{
EnumFeature enum_feature = decodeEnumFeature(parent);
if ((enum_feature == SimpleEnum) && GetFlag(parent, "scopedenum")) {
newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname);
symname = newsymname;
}
// Add to language symbol table
String *scope = 0;
if (unnamedinstance || !parent_name || enum_feature == SimpleEnum) {
if (proxy_class_name) {
String *enumClassPrefix = getEnumClassPrefix();
if (enumClassPrefix) {
scope = NewString("");
if (nspace)
Printf(scope, "%s.", nspace);
Printf(scope, "%s", proxy_class_name);
Printf(scope, "%s", enumClassPrefix);
} else {
scope = Copy(module_class_name);
}
@ -1380,6 +1387,7 @@ public:
Delete(scope);
}
Delete(newsymname);
Delete(tmpValue);
Swig_restore(n);
return SWIG_OK;
@ -3053,6 +3061,16 @@ public:
// Use the C syntax to make a true C# constant and hope that it compiles as C# code
value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex"));
} else {
String *newsymname = 0;
if (!getCurrentClass() || !proxy_flag) {
String *enumClassPrefix = getEnumClassPrefix();
if (enumClassPrefix) {
// A global scoped enum
newsymname = Swig_name_member(0, enumClassPrefix, symname);
symname = newsymname;
}
}
// Get the enumvalue from a PINVOKE call
if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) {
// Strange hack to change the name
@ -3061,7 +3079,7 @@ public:
value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname));
} else {
memberconstantHandler(n);
value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, proxy_class_name, symname)));
value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, getEnumClassPrefix(), symname)));
}
}
}