From: William S F. <ws...@fu...> - 2010-11-11 19:29:24
|
Volker Grabsch wrote: > Dear SWIG developers, > > I improved the Java wrapper for std::vector to provide a > more "native feeling". In particular, I added: > > 1) a new constructor for initialization from Arrays: > > SomeVector(SomeType[] initialElements); > > 2) a new constructor for initialization from Iterables: > > SomeVector(Iterable<SomeType> initialElements); > > 3) an implementation of the Iterable<> interface: > > SomeVector someVector = new ...; > for (SomeType element : someVector) { > ... > } > > It would be great if you could include this contribution, > as this might be interesting for many others. Although my > implementation is far from being perfect, it is still an > improvement over the current situation. > > Also, this might be a starting point for providing similar > interfaces to std::map<>, etc. > > The patch has currently the following (non-critical!) > deficiencies which I wasn't able to fix. It would be > great to get some help for those from an experienced > SWIG developer: > > A) The added methods are _not_ available automatically > when std::vector<SomeType> is instantiated. I simply > don't know how to do that using the existing %typemap() > infrastructure. > > Instead, there is a macro CONVENIENT_VECTOR() which > adds the interface for a certain type. The macro is > automatically called for basic types like "int" and > std::string. For a custom class "MyClass" you'll have > to add the following code to your *.i file: > > #ifdef SWIGJAVA > CONVENIENT_VECTOR(MyClass) > #endif > > The above lines should always come _before_ the usual > template instantiation: > > %template(MyClassVector) std::vector<MyClass>; > > B) The additional interface is implemented in pure Java. > > For 1) and 2), this is to simplify the code, as there > isn't much gain in speed to be expected from a native > implementation which would have to go through the C > interface just to go back to Java iterators etc. via > JNI. > > For 3), there actually _might_ be a performance > improvement if the iterator sub class would have > been implemented natively. However, subclasses > aren't supported by SWIG yet, and I don't know > SWIG well enough to create an internal (name mangled) > iterator class. That's why I kept it simple, too, > providing a plain anonymous Java iterator subclass. > > C) For vectors of primitive types the Array constructor > supports only the corresponding class type. For instance, > the wrapper for std::vector<int> provides a constructor > > IntVector(Integer[] initialElements); > > but _not_ a constructor: > > IntVector(int[] initialElements); > > However, this could be easily fixed in case someone > really needs that. > Looks like you need to use the approaches taken in the csharp/std_vector.i implementation. Note the template specialization and the SWIG_STD_VECTOR_ENHANCED macro used for the primitive types. Also note the $typemap(cstype, CTYPE) special variable macro... you'd need $typemap(jstype, CTYPE) for Java. William |