Re: Factories and other functions returning pointers

<[email protected]> Fri, 3 Dec 2021 09:19:24 -0000
Newsgroups gmane.comp.programming.swig
Message-ID <[email protected]>
Hi all

 

Seems I mailed to soon. This morning my strategy does seem to work if I add 2 factory declarations:

 

%factory(A *, A1, A2);

%factory(A const*, A1, A2);

 

I also mentioned worries about ownership, but I now think that this is independent, and I just have to use %newobject for the appropriate cases.

 

So I think I have resolved my problems for bare pointers. Still struggling with shared_ptr, but I'll document that in the GitHub issue %factory fails with %shared_ptr · Issue #2110 · swig/swig (github.com) <https://github.com/swig/swig/issues/2110> 

 

Kris

 

From: Kris Thielemans> 
Sent: 02 December 2021 22:21



 

Hi all

 

 

 

I'm trying to make our Python interface to STIR friendlier w.r.t. derived classes. Many of our C++ functions return a bare pointer to the base class.

 

 

 

class A;

 

class A1: public A;

 

class A2: public A;

 

 

 

class B

 

{

 

  A const * some_function() const;

 

};

 

 

 

It'd be great if in Python, the result of B::some_function() would be actually of the appropriate type (e.g. A1), as there is no way to downcast in Python.

 

 

 

I looked in the use of %factory. This is intended for "factory" functions that create a new object. It then occurred to me that nothing in the %factory mechanism seems to require that the result is a new object. Indeed, using %factory for some_function() seems to work perfectly fine (although I'm wondering about ownership).

 

 

 

%factory(A const* some_function, A1, A2);

 

 

 

This generates

 

 

 

typemap(out) A const* some_function{ … }

 

 

 

which handles the downcasting. Great! So then I hoped to just do this for all functions that return an A* (or A const*).

 

 

 

%factory(A const*, A1, A2);

 

 

 

Generating

 

 

 

typemap(out) A const* { … }

 

 

 

However, this typemap doesn't match the signature of the B::some_function(). Am I doing something stupid? (This is my first foray into typemaps, so the answer is probably "yes").

 

 

 

Any help appreciated.

 

 

 

Thanks!

 

 

 

Kris

 

 

 

PS: in fact, most of our functions return a shared_ptr<const A> or even unique_ptr, but I have to work around those as SWIG doesn't handle unique_ptr yet unfortunately. See %factory fails with %shared_ptr · Issue #2110 · swig/swig (github.com <http://github.com> ) for more information on my struggles with shared_ptr.

_______________________________________________
Swig-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/swig-user