From: AlBor <dsb...@gm...> - 2012-09-15 17:22:36
|
Hello dear swig users! Probably someone can help me. C++ enum contains binary operators like enum MyENum { Field1 = 1, Field2 = 2, Field3 = Field1 | Field2 }; So when compiling the java wrappers I get "bad operand types for binary operator" error. How can I resolve it? Thanks in advance, Alex. -- View this message in context: http://old.nabble.com/Java-enum-question-tp34436190p34436190.html Sent from the swig-user mailing list archive at Nabble.com. |
From: David P. <dpi...@me...> - 2012-09-17 16:44:28
|
> Hello dear swig users! > > Probably someone can help me. C++ enum contains binary operators like > enum MyENum > { > Field1 = 1, > Field2 = 2, > Field3 = Field1 | Field2 > }; > So when compiling the java wrappers I get "bad operand types for binary > operator" error. How can I resolve it? > Thanks in advance, > Alex. SWIG offers three types of enum wrappers, see http://www.swig.org/Doc2.0/Java.html#Java_enumerations Sadly only "Anonymous enums" support what you want to do. I don't know if it is possible to use "Anonymous enums" for this enum and typesafe/proper enums for non-flags enumerations. |
From: AlBor <dsb...@gm...> - 2012-09-19 09:12:09
|
Hi David, Thank you for the post. SWIG docs were read and reread but the approaches suggested are unusable in my case. I hoped someone faced a similar problem and found some way to overcome it. anyway thank you for finding time for me. Regards, Alex. -- View this message in context: http://old.nabble.com/Java-enum-question-tp34436190p34451178.html Sent from the swig-user mailing list archive at Nabble.com. |
From: David P. <dpi...@me...> - 2012-09-19 16:33:17
|
> Hi David, > > Thank you for the post. SWIG docs were read and reread but the approaches > suggested are unusable in my case. I hoped someone faced a similar problem > and found some way to overcome it. anyway thank you for finding time for > me. Well, you didn't say what it was about the anonymous enums that would make them unusable for you, but for my SWIG wrapper I decided to start from "type-safe enums" and customize the way they work as follows: // Custom enum behavior: // - change the names: swigValue() => value(), swigToEnum() => findFromInt() because // I don't want users to wonder or care what "swig" means // - findFromInt() now offers the option not to throw if the enum was not found // - add new fastFromInt() that bypasses the search for a matching enum // - adds values() - exists in "proper" Java enums, but we can't use "proper" enums // because they can't be combined as flags %include <enumtypesafe.swg> %typemap(javain) enum SWIGTYPE, const enum SWIGTYPE & "$javainput.value()" %typemap(javadirectorout) enum SWIGTYPE, const enum SWIGTYPE & "($javacall).value()" %typemap(javadirectorin) enum SWIGTYPE "$javaclassname.findFromInt($jniinput, false)" %typemap(javadirectorin) const enum SWIGTYPE & "$*javaclassname.findFromInt($jniinput, false)" %typemap(javaout) enum SWIGTYPE { return $javaclassname.findFromInt($jnicall, false); } %typemap(javaout) const enum SWIGTYPE & { return $*javaclassname.findFromInt($jnicall, false); } %typemap(javabody) enum SWIGTYPE %{ public final int value() { return _value; } public String toString() { return _name; } public static $javaclassname findFromInt(int value, boolean throwOnFail) { if (value < _values.length && value >= 0 && _values[value]._value == value) return _values[value]; for (int i = 0; i < _values.length; i++) if (_values[i]._value == value) return _values[i]; if (throwOnFail) throw new IllegalArgumentException("No enum " + $javaclassname.class + " with value " + value); return fastFromInt(value); } public static $javaclassname fastFromInt(int value) { return new $javaclassname(value); } private $javaclassname(int value) { _name = "<enum value>"; _value = value; } private $javaclassname(String name) { _name = name; _value = _next++; } private $javaclassname(String name, int value) { _name = name; _value = value; _next = value+1; } private $javaclassname(String name, $javaclassname existing) { _name = name; _value = existing._value; _next = _value+1; } private static $javaclassname[] _values = { $enumvalues }; public static $javaclassname[] values() { return _values; } private static int _next = 0; private final int _value; private final String _name; %} This approach does allow enums to be combined as flags, but it is still clunky to do so, as you must convert from the enum wrapper to int and back: static MyFlags flags = MyFlags.fastFromInt( MyFlags.Flag1.value() | MyFlags.Flag2.value() | MyFlags.Flag3.value()); |
From: AlBor <dsb...@gm...> - 2012-09-20 08:42:05
|
Hi David, Thank you again. This approach seems to be the most suitable solution for my case. Converting from int and back is not a serious matter. Hope time will come and I'll be able to suggest you something helpful too. Regards, Alex. -- View this message in context: http://old.nabble.com/Java-enum-question-tp34436190p34456156.html Sent from the swig-user mailing list archive at Nabble.com. |