Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re: Re: Re: How to swap scalar values without copies

by Roger (Parson)
on Feb 20, 2004 at 00:24 UTC ( [id://330418]=note: print w/replies, xml ) Need Help??


in reply to Re: Re: How to swap scalar values without copies
in thread How to swap scalar values without copies

One method I think possible is at the XS level. A simple scalar is stored as SvPV internally by Perl, which looks like this:
SV xpv +--------+ +-----+ | ANY |--->| PVX |---> char[] | REFCNT | | CUR | | FLAGS | | LEN | +--------+ +-----+
To do an immediate swap without copying strings, at XS level, do this -
SV xpv +--------+ +-----+ | ANY |-+ ->| PVX |---> char[] | REFCNT | \ / | CUR | | FLAGS | \ / | LEN | +--------+ \/ +-----+ /\ SV / \ xpv +--------+ / \ +-----+ | ANY |-+ ->| PVX |---> char[] | REFCNT | | CUR | | FLAGS | | LEN | +--------+ +-----+

I can provide an XS example if you are not sure how to do this at XS level.

Replies are listed 'Best First'.
Re: Re: Re: Re: How to swap scalar values without copies
by Anonymous Monk on Feb 20, 2004 at 00:43 UTC
    I think that Data::Swap does exactly this. The Swap.xs file, once stripped of all checks, looks like:
    #include "EXTERN.h" #include "perl.h" #include "XSUB.h" MODULE = Data::Swap PACKAGE = Data::Swap void swap(foo, bar) SVref foo SVref bar PREINIT: void *any; U32 flags; CODE: any = foo->sv_any; flags = foo->sv_flags; foo->sv_any = bar->sv_any; foo->sv_flags = bar->sv_flags; bar->sv_any = any; bar->sv_flags = flags;

    But for this you need to translate the .xs into a .c, compile the latter and place the resulting shared object in blib somewhere in the hierarchy. And you need also a Swap.pm module bootstrapping it.

    I would like to avoid to ask people to install this module to run my code. Is it possible to hide these files in my user hierarchy?

    I begin to believe that there is no native way to solve my original problem in Perl5.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (1)
As of 2024-04-19 00:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found