Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Returning C++ objects from XS

by blssu (Pilgrim)
on Sep 12, 2002 at 11:43 UTC ( #197195=note: print w/replies, xml ) Need Help??

in reply to Writing XS frontends to C++ libraries.

Returning objects should still be done with pointers -- you must use C++ new to allocate all C++ objects you want to return to perl.

Here's how to write the get_set example above. First you need to return a pointer, not an object:

MySet * MyEnquire::get_set(first, maxitems)
Then you need to add declarations for first and maxitems (I'm just guessing at what the types might be):
MySet * MyEnquire::get_set(first, maxitems) MySetIterator * first int maxitems
If MySetIterator is a template, I would typedef it to a simple name and use only the simple name in XS code (and the typemap). I'm not sure if XS needs that, but I use macros to help convert type names to Perl package names and the macros do need simple symbols.

Finally, you need to glue the XS to the method call itself. If the get_set method returns an object, you need to make a copy. If it takes first as an object, you need to dereference the pointer:

MySet * MyEnquire::get_set(first, maxitems) MySetIterator * first int maxitems CODE: RETVAL = new MySet (); *RETVAL = THIS->get_set(*first, maxitems); OUTPUT: RETVAL

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://197195]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (3)
As of 2021-11-30 05:02 GMT
Find Nodes?
    Voting Booth?

    No recent polls found