Re: SWIGUpcast problem / assigning to .. from incompatible type
Kustaa Nyholm <[email protected]>
| Newsgroups | gmane.comp.programming.swig |
|---|---|
| Message-ID | <[email protected]> |
I've put up a question in StackOverflow about this issue where I elaborated the problem a bit more: https://stackoverflow.com/questions/63174786/how-to-wrap-handles-to-class-hierarchy-in-swig-for-java and there is also a self contained ready to run demo on github: https://github.com/nyholku/swig-experiments wbr Kusti > On 29 Jul 2020, at 12.05, Kustaa Nyholm <[email protected]> wrote: > > Hi, > > I've been posting a few post about this problem already so sorry about the noise. > > But I think I've tracked the root cause. > > Background: I'm trying to upgrade existing occjava from OCE to OCC 7.3.0. > > The main problem I'm experiencing stems from the fact that OCC 7.0.0 > gave gave up a hierarchy of classes Handle_XXX and replaced that with > opencascade::handle<XXX> (hidden behind macro DEFINE_STANDARD_HANDLE). > > In the OCC context Handle is basically a pointer to a pointer to the > actual instance of a class and originally the Handle_XXXX hierarchy > mirrored the actual class hierarchy. > > And this made the upcasting work with the occjava SWIG defs. > > But now it fails cause every Handle_XXX (aka opencascade::handle<XXX>) > is a distinct type. > > So I'm looking for ideas how to fix this. Preferably with a typemap > or few cause there are a lot of classes and handles in OCC (over > 8000 files in /usr/local/include/opencascade). > > I've made a minimal (if not totally self contained experiment project > to illustrate the problem). > > You can download a zip file of the experiment here: > > http://eazycnc.com/temp/experiments.zip > > and I will also collect the gist of it below. > > wbr Kusti > > > /// Standard_Handle.hxx (FRAGMENT) --------------------------- > template <class T> > class handle > { > public: > //! STL-compliant typedef of contained type > typedef T element_type; > ... > handle () : entity(0) {} > > //! Constructor from pointer to new object > handle (const T *thePtr) : entity(const_cast<T*>(thePtr)) > { > ... > } > ... > private: > Standard_Transient* entity; > }; > ... > #define DEFINE_STANDARD_HANDLECLASS(C1,C2,BC) class C1; typedef Handle(C1) Handle_##C1; > #define DEFINE_STANDARD_HANDLE(C1,C2) DEFINE_STANDARD_HANDLECLASS(C1,C2,Standard_Transient) > #define DEFINE_STANDARD_PHANDLE(C1,C2) DEFINE_STANDARD_HANDLECLASS(C1,C2,Standard_Persistent) > > > /// experiment.hxx -------------------------------------------- > #include "/usr/local/include/opencascade/Standard_Handle.hxx" > > DEFINE_STANDARD_HANDLE(Geom_Geometry,Standard_Transient); > DEFINE_STANDARD_HANDLE(Geom_Curve,Standard_Transient); > > > /// experiment.cxx -------------------------------------------- > #include "experiment.hxx" > > > /// experiment.i ---------------------------------------------- > %module experiment > %{ > #include "experiment.hxx" > %} > > %include "experiment.hxx" > > %rename(Geom_Curve) Handle_Geom_Curve; > %rename(Geom_Geometry) Handle_Geom_Geometry; > > class Handle_Geom_Geometry > { > Handle_Geom_Geometry()=0; > }; > > class Handle_Geom_Curve : public Handle_Geom_Geometry > { > Handle_Geom_Curve()=0; > }; > > > /// Makefile --------------------------------------------------- > all: > c++ -std=c++11 -c -I/usr/local/include/opencascade -o experiment.so experiment.cxx > swig -c++ -java experiment.i > c++ -std=c++11 -c -I/usr/local/include/opencascade -I/Library/Java/JavaVirtualMachines/jdk-11.0.6.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk-11.0.6.jdk/Contents/Home/include/darwin -o experiment_wrap.so experiment_wrap.cxx > > > /// experiment_wrap.cxx (FRAGMENT) ----------------------------- > > SWIGEXPORT jlong JNICALL Java_experimentJNI_Geom_1Curve_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { > jlong baseptr = 0; > (void)jenv; > (void)jcls; > *(Handle_Geom_Geometry **)&baseptr = *(Handle_Geom_Curve **)&jarg1; > return baseptr; > } > > > which fails to compile like this > > > > // Error ======================================================== > > experiment_wrap.cxx:266:42: error: assigning to 'Handle_Geom_Geometry *' (aka 'handle<Geom_Geometry> *') from incompatible type 'Handle_Geom_Curve *' (aka 'handle<Geom_Curve> *') > *(Handle_Geom_Geometry **)&baseptr = *(Handle_Geom_Curve **)&jarg1; > > > > > > > > > > > > > > > > _______________________________________________ > Swig-user mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/swig-user