Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: Terrible Trouble With Typemaps (XS Question)

by dragonchild (Archbishop)
on Sep 07, 2004 at 12:25 UTC ( [id://389002]=note: print w/replies, xml ) Need Help??


in reply to Terrible Trouble With Typemaps (XS Question)

(I've never written XS, so take me with a grain of salt.)

When dealing with this kind of thing in C, we'd use a macro #define to make our lives easier. So, I could see something like:

#define CALL_COUNT_ITEMS_IF( type ) \ if (sv_derived_from(ST(0), type)) { \ RETVAL=THIS->countItemsIn( \ *(type *) SvIV((SV*)SvRV(ST(0))) \ ); \ } int MyClass::countItemsIn (...) CODE: CALL_COUNT_ITEMS_IF( 'MyList' ); CALL_COUNT_ITEMS_IF( 'MyHash' ); OUTPUT: RETVAL

Again, I have no idea if XS provides for a pre-processor or not. Hope this helps!

------
We are the carpenters and bricklayers of the Information Age.

Then there are Damian modules.... *sigh* ... that's not about being less-lazy -- that's about being on some really good drugs -- you know, there is no spoon. - flyingmoose

I shouldn't have to say this, but any code, unless otherwise stated, is untested

Replies are listed 'Best First'.
Re^2: Terrible Trouble With Typemaps (XS Question)
by Molt (Chaplain) on Sep 07, 2004 at 14:38 UTC

    Thanks for the help, to be honest I didn't consider the preprocessor since I tend to avoid it as much as possible in the interests of readability.. but in this case it may have a use.

    Just so you know, it will be more a case of:

    int MyClass::countItemsIn (...) CODE: if (SV_IS_MYLIST(ST(0))) { THIS->countItemsIn ( CAST_SV_TO_MYLIST(ST(0)) ); } elsif (SV_IS_MYHASH(ST(0)) { THIS->countItemsIn ( CAST_SV_TO_MYHASH(ST(0)) ); }; OUTPUT: RETVAL

    ..where the SV_IS_MYLIST/CAST_SV_TO_MYLIST parts are all macros.

      What about the following:
      CODE: if ( MY_SV_IS( ST(0), 'MyList' )) { THIS->count_Items_in( MY_CAST_SV( ST(0), 'MyList' ) } elsif (MY_SV_IS( ST(0), 'MyHash' )) { THIS->count_Items_in( MY_CAST_SV( ST(0), 'MyHash' ) }

      This way, you don't have a plethora of macros. Remember, a preprocessor macro is just a direct text substitution. So, you can put text in there, kinda like what I was doing in my first reply.

      ------
      We are the carpenters and bricklayers of the Information Age.

      Then there are Damian modules.... *sigh* ... that's not about being less-lazy -- that's about being on some really good drugs -- you know, there is no spoon. - flyingmoose

      I shouldn't have to say this, but any code, unless otherwise stated, is untested

        It's got to be a plethora of macros, unfortunately, since the way I convert to MyList could well be very different from the conversion to MyHash.. especially when it comes to handling classes inherited from them.

        Ah well, with a consistant naming strategy there's not too much stuff making the macro namespace unusable.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (7)
As of 2024-04-18 14:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found